V1 #2

Merged
rboullard merged 65 commits from V1 into Development 2026-03-29 09:30:59 +00:00
11 changed files with 135 additions and 776 deletions
Showing only changes of commit 0afdd97801 - Show all commits

View File

@@ -0,0 +1,55 @@
name: Conan Packaging
on:
push:
branches:
- '**'
workflow_dispatch:
env:
CCACHE_BASEDIR: ${{ github.workspace }}
jobs:
conan-packages:
runs-on: ubuntu-latest
timeout-minutes: 120
container:
image: git.romainboullard.com/bigfootdev/linuxcppbuilder:main
env:
ARTIFACTORY_USER: ${{ secrets.ARTIFACTORY_USER }}
ARTIFACTORY_PASSWORD: ${{ secrets.ARTIFACTORY_PASSWORD }}
name: "Package Bin2CPP/1.0.0"
steps:
- name: Set BRANCH_NAME
run: echo "BRANCH_NAME=$(echo $GITHUB_REF_NAME | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV
- name: Install Node.js
run: apt-get update && apt-get install -y nodejs
- name: Checkout repository
uses: actions/checkout@v6
with:
submodules: recursive
- name: Show ccache stats before
run: ccache --zero-stats
- name: Run Conan packaging
run: |
echo "Building Bin2CPP@$1.0.0"
CONAN_LOGIN_USERNAME=${ARTIFACTORY_USER} \
CONAN_PASSWORD=${ARTIFACTORY_PASSWORD} \
conan create . \
--version=1.0.0 \
--user=bigfootdev \
--channel=${{ env.BRANCH_NAME }} \
-pr:b=./ConanProfiles/clang -pr:h=./ConanProfiles/clang \
--build=missing --remote=bigfootpackages
CONAN_LOGIN_USERNAME=${ARTIFACTORY_USER} \
CONAN_PASSWORD=${ARTIFACTORY_PASSWORD} \
conan upload Bin2CPP/1.0.0@bigfootdev/${{ env.BRANCH_NAME }} \
--only-recipe --remote=bigfootpackages
- name: Show ccache stats after
run: ccache --show-stats

View File

@@ -50,3 +50,7 @@ if(${ASAN})
) )
endif() endif()
endif() endif()
########INSTALL
install(TARGETS ${PROJECT_NAME} DESTINATION bin)

View File

@@ -1,2 +1,2 @@
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Bin2CPPLib) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Bin2CPPLib)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Bin2CPPExe) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Bin2CPP)

View File

@@ -0,0 +1,23 @@
if(NOT TARGET Bin2CPP)
if(CMAKE_CROSSCOMPILING)
find_program(BIN2CPP_EXECUTABLE
NAMES Bin2CPP
PATHS ENV PATH
NO_DEFAULT_PATH
)
else()
find_program(BIN2CPP_EXECUTABLE
NAMES Bin2CPP
PATHS "${CMAKE_CURRENT_LIST_DIR}"
NO_DEFAULT_PATH
)
endif()
if(BIN2CPP_EXECUTABLE)
get_filename_component(BIN2CPP_EXECUTABLE "${BIN2CPP_EXECUTABLE}" ABSOLUTE)
add_executable(Bin2CPP IMPORTED)
set_property(TARGET Bin2CPP PROPERTY IMPORTED_LOCATION ${BIN2CPP_EXECUTABLE})
else()
message(WARNING "Bin2CPP executable not found in ${CMAKE_CURRENT_LIST_DIR}")
endif()
endif()

View File

@@ -15,11 +15,7 @@ else()
find_package(mimalloc REQUIRED) find_package(mimalloc REQUIRED)
endif() endif()
if(${IS_MULTI_CONFIG}) find_package(cpptrace REQUIRED)
find_package(cpptrace REQUIRED)
elseif(${CMAKE_BUILD_TYPE} STREQUAL "Debug" OR ${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
find_package(cpptrace REQUIRED)
endif()
if(BUILD_TESTS) if(BUILD_TESTS)
find_package(GTest REQUIRED) find_package(GTest REQUIRED)

View File

@@ -34,6 +34,3 @@ add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Bin2CPP/Sources)
if(${BUILD_TESTS}) if(${BUILD_TESTS})
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Bin2CPP/Tests) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Bin2CPP/Tests)
endif() endif()
add_custom_target(NatVis SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/Vendor/NatVis/EASTL/EASTL.natvis)

View File

@@ -1,761 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This is a Microsoft natvis file, which allows visualization of complex variables in the
Microsoft debugger starting with VS2012. It's a successor to the AutoExp.dat file format.
This file needs to go into your C:\Users\<user>\Documents\Visual Studio 2011\Visualizers\
folder. Microsoft documentation states that it should go into a 2012 folder, but testing
in June of 2013 suggests that it still needs to be the 2011 folder.
You don't need to restart Visual Studio to use it, you just need to restart the debug
session. You can have multiple .natvis files and they will all be used.
VS2017 natvis documentation:
https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects
-->
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="eastl::unique_ptr&lt;*&gt;">
<DisplayString Condition="mPair.mFirst != nullptr">({(void*)mPair.mFirst} = {*mPair.mFirst})</DisplayString>
<DisplayString Condition="mPair.mFirst == nullptr">({nullptr})</DisplayString>
<Expand>
<Item Name="[pointer]">(void*)mPair.mFirst</Item>
<Item Name="[value]">*mPair.mFirst</Item>
</Expand>
</Type>
<Type Name="eastl::shared_ptr&lt;*&gt;">
<DisplayString Condition="mpValue != nullptr">({(void*)mpValue} = {*mpValue})</DisplayString>
<DisplayString Condition="mpValue == nullptr">({nullptr})</DisplayString>
<Expand>
<Item Name="[pointer]">(void*)mpValue</Item>
<Item Name="[value]">*mpValue</Item>
<Item Name="[reference count]">mpRefCount->mRefCount</Item>
<Item Name="[weak reference count]">mpRefCount->mWeakRefCount</Item>
</Expand>
</Type>
<Type Name="eastl::weak_ptr&lt;*&gt;">
<DisplayString>{((mpRefCount &amp;&amp; mpRefCount-&gt;mRefCount) ? mpValue : nullptr)}</DisplayString>
<Expand>
<ExpandedItem>mpRefCount &amp;&amp; mpRefCount-&gt;mRefCount ? mpValue : nullptr</ExpandedItem>
</Expand>
</Type>
<Type Name="eastl::array&lt;*,*&gt;">
<DisplayString Condition="$T2 == 0">[{$T2}] {{}}</DisplayString>
<DisplayString Condition="$T2 == 1">[{$T2}] {{ {*mValue} }}</DisplayString>
<DisplayString Condition="$T2 == 2">[{$T2}] {{ {*mValue}, {*(mValue+1)} }}</DisplayString>
<DisplayString Condition="$T2 == 3">[{$T2}] {{ {*mValue}, {*(mValue+1)}, {*(mValue+2)} }}</DisplayString>
<DisplayString Condition="$T2 == 4">[{$T2}] {{ {*mValue}, {*(mValue+1)}, {*(mValue+2)}, {*(mValue+3)} }}</DisplayString>
<DisplayString Condition="$T2 == 5">[{$T2}] {{ {*mValue}, {*(mValue+1)}, {*(mValue+2)}, {*(mValue+3)}, {*(mValue+4)} }}</DisplayString>
<DisplayString Condition="$T2 == 6">[{$T2}] {{ {*mValue}, {*(mValue+1)}, {*(mValue+2)}, {*(mValue+3)}, {*(mValue+4)}, {*(mValue+5)} }}</DisplayString>
<DisplayString Condition="$T2 &gt; 6">[{$T2}] {{ {*mValue}, {*(mValue+1)}, {*(mValue+2)}, {*(mValue+3)}, {*(mValue+4)}, {*(mValue+5)}, ... }}</DisplayString>
<Expand>
<Item Name="[size]">$T2</Item>
<ArrayItems>
<Size>$T2</Size>
<ValuePointer>mValue</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="eastl::basic_string&lt;*&gt;">
<DisplayString Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">"{mPair.mFirst.heap.mpBegin,sb}"</DisplayString>
<DisplayString Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">"{mPair.mFirst.sso.mData,sb}"</DisplayString>
<Expand>
<Item Name="[length]" Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">mPair.mFirst.heap.mnSize</Item>
<Item Name="[capacity]" Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">(mPair.mFirst.heap.mnCapacity &amp; ~kHeapMask)</Item>
<Item Name="[value]" Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">mPair.mFirst.heap.mpBegin,sb</Item>
<Item Name="[length]" Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">(SSOLayout::SSO_CAPACITY - mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize)</Item>
<Item Name="[capacity]" Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">SSOLayout::SSO_CAPACITY</Item>
<Item Name="[value]" Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">mPair.mFirst.sso.mData,sb</Item>
<Item Name="[uses heap]">!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)</Item>
</Expand>
</Type>
<Type Name="eastl::basic_string&lt;wchar_t,*&gt;">
<DisplayString Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">{mPair.mFirst.heap.mpBegin,su}</DisplayString>
<DisplayString Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">{mPair.mFirst.sso.mData,su}</DisplayString>
<Expand>
<Item Name="[length]" Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">mPair.mFirst.heap.mnSize</Item>
<Item Name="[capacity]" Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">(mPair.mFirst.heap.mnCapacity &amp; ~kHeapMask)</Item>
<Item Name="[value]" Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">mPair.mFirst.heap.mpBegin,su</Item>
<Item Name="[length]" Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">(SSOLayout::SSO_CAPACITY - mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize)</Item>
<Item Name="[capacity]" Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">SSOLayout::SSO_CAPACITY</Item>
<Item Name="[value]" Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)">mPair.mFirst.sso.mData,su</Item>
<Item Name="[uses heap]">!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize &amp; kSSOMask)</Item>
</Expand>
</Type>
<Type Name="eastl::pair&lt;*&gt;">
<DisplayString>({first}, {second})</DisplayString>
<Expand>
<Item Name="first">first</Item>
<Item Name="second">second</Item>
</Expand>
</Type>
<Type Name="eastl::span&lt;*&gt;">
<DisplayString Condition="mnSize == 0">[{mnSize}] {{}}</DisplayString>
<DisplayString Condition="mnSize == 1">[{mnSize}] {{ {*mpData} }}</DisplayString>
<DisplayString Condition="mnSize == 2">[{mnSize}] {{ {*mpData}, {*(mpData+1)} }}</DisplayString>
<DisplayString Condition="mnSize == 3">[{mnSize}] {{ {*mpData}, {*(mpData+1)}, {*(mpData+2)} }}</DisplayString>
<DisplayString Condition="mnSize == 4">[{mnSize}] {{ {*mpData}, {*(mpData+1)}, {*(mpData+2)}, {*(mpData+3)} }}</DisplayString>
<DisplayString Condition="mnSize == 5">[{mnSize}] {{ {*mpData}, {*(mpData+1)}, {*(mpData+2)}, {*(mpData+3)}, {*(mpData+4)} }}</DisplayString>
<DisplayString Condition="mnSize == 6">[{mnSize}] {{ {*mpData}, {*(mpData+1)}, {*(mpData+2)}, {*(mpData+3)}, {*(mpData+4)}, {*(mpData+5)} }}</DisplayString>
<DisplayString Condition="mnSize &gt; 6">[{mnSize}] {{ {*mpData}, {*(mpData+1)}, {*(mpData+2)}, {*(mpData+3)}, {*(mpData+4)}, {*(mpData+5)}, ... }}</DisplayString>
<Expand>
<Item Name="[size]">mnSize</Item>
<ArrayItems>
<Size>mnSize</Size>
<ValuePointer>mpData</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="eastl::VectorBase&lt;*&gt;">
<DisplayString Condition="mpEnd == mpBegin">[{mpEnd - mpBegin}] {{}}</DisplayString>
<DisplayString Condition="mpEnd - mpBegin == 1">[{mpEnd - mpBegin}] {{ {*mpBegin} }}</DisplayString>
<DisplayString Condition="mpEnd - mpBegin == 2">[{mpEnd - mpBegin}] {{ {*mpBegin}, {*(mpBegin+1)} }}</DisplayString>
<DisplayString Condition="mpEnd - mpBegin == 3">[{mpEnd - mpBegin}] {{ {*mpBegin}, {*(mpBegin+1)}, {*(mpBegin+2)} }}</DisplayString>
<DisplayString Condition="mpEnd - mpBegin == 4">[{mpEnd - mpBegin}] {{ {*mpBegin}, {*(mpBegin+1)}, {*(mpBegin+2)}, {*(mpBegin+3)} }}</DisplayString>
<DisplayString Condition="mpEnd - mpBegin == 5">[{mpEnd - mpBegin}] {{ {*mpBegin}, {*(mpBegin+1)}, {*(mpBegin+2)}, {*(mpBegin+3)}, {*(mpBegin+4)} }}</DisplayString>
<DisplayString Condition="mpEnd - mpBegin == 6">[{mpEnd - mpBegin}] {{ {*mpBegin}, {*(mpBegin+1)}, {*(mpBegin+2)}, {*(mpBegin+3)}, {*(mpBegin+4)}, {*(mpBegin+5)} }}</DisplayString>
<DisplayString Condition="mpEnd - mpBegin &gt; 6">[{mpEnd - mpBegin}] {{ {*mpBegin}, {*(mpBegin+1)}, {*(mpBegin+2)}, {*(mpBegin+3)}, {*(mpBegin+4)}, {*(mpBegin+5)}, ... }}</DisplayString>
<Expand>
<Item Name="[size]">mpEnd - mpBegin</Item>
<Item Name="[capacity]">mCapacityAllocator.mFirst - mpBegin</Item>
<ArrayItems>
<Size>mpEnd - mpBegin</Size>
<ValuePointer>mpBegin</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="eastl::DequeBase&lt;*,*,*&gt;">
<DisplayString Condition="mItBegin.mpCurrent == mItEnd.mpCurrent">
[0] {{}}
</DisplayString>
<DisplayString Condition="(mItEnd.mpCurrentArrayPtr - mItBegin.mpCurrentArrayPtr) * $T3 + (mItEnd.mpCurrent-mItEnd.mpBegin) - (mItBegin.mpCurrent-mItBegin.mpBegin) == 1">
[1] {{ {*mItBegin.mpCurrent} }}
</DisplayString>
<DisplayString Condition="(mItEnd.mpCurrentArrayPtr - mItBegin.mpCurrentArrayPtr) * $T3 + (mItEnd.mpCurrent-mItEnd.mpBegin) - (mItBegin.mpCurrent-mItBegin.mpBegin) != 0">
[{(mItEnd.mpCurrentArrayPtr - mItBegin.mpCurrentArrayPtr) * $T3 + (mItEnd.mpCurrent-mItEnd.mpBegin) - (mItBegin.mpCurrent-mItBegin.mpBegin)}]
{{
{*mItBegin.mpCurrent},
...
}}
</DisplayString>
<Expand>
<Item Name="[size]">(mItEnd.mpCurrentArrayPtr - mItBegin.mpCurrentArrayPtr) * $T3 + (mItEnd.mpCurrent-mItEnd.mpBegin) - (mItBegin.mpCurrent-mItBegin.mpBegin)</Item>
<IndexListItems>
<Size>(mItEnd.mpCurrentArrayPtr - mItBegin.mpCurrentArrayPtr) * $T3 + (mItEnd.mpCurrent-mItEnd.mpBegin) - (mItBegin.mpCurrent-mItBegin.mpBegin)</Size>
<ValueNode>mItBegin.mpCurrentArrayPtr[(mItBegin.mpCurrent-mItBegin.mpBegin + $i) / $T3][(mItBegin.mpCurrent-mItBegin.mpBegin + $i) % $T3]</ValueNode>
</IndexListItems>
</Expand>
</Type>
<Type Name="eastl::DequeIterator&lt;*&gt;">
<DisplayString>{*mpCurrent}</DisplayString>
<Expand>
<Item Name="Value">*mpCurrent</Item>
<Item Name="Previous" Condition="mpCurrent == mpBegin">*(*(mpCurrentArrayPtr-1) + (mpEnd-mpBegin) - 1)</Item>
<Item Name="Previous" Condition="mpCurrent != mpBegin">*(mpCurrent-1)</Item>
<Item Name="Next" Condition="mpCurrent+1 == mpEnd">**(mpCurrentArrayPtr+1)</Item>
<Item Name="Next" Condition="mpCurrent+1 != mpEnd">*(mpCurrent+1)</Item>
<Item Name="Begin">mpCurrent == mpBegin</Item>
<Item Name="End">mpCurrent+1 == mpEnd</Item>
</Expand>
</Type>
<Type Name="eastl::queue&lt;*&gt;">
<AlternativeType Name="eastl::priority_queue&lt;*&gt;" />
<AlternativeType Name="eastl::stack&lt;*&gt;" />
<DisplayString>{c}</DisplayString>
<Expand>
<ExpandedItem>c</ExpandedItem>
</Expand>
</Type>
<Type Name="eastl::ListBase&lt;*&gt;">
<DisplayString Condition="mNodeAllocator.mFirst.mpNext == &amp;mNodeAllocator.mFirst">
[0] {{}}
</DisplayString>
<DisplayString Condition="mNodeAllocator.mFirst.mpNext != &amp;mNodeAllocator.mFirst &amp;&amp; mNodeAllocator.mFirst.mpNext-&gt;mpNext == &amp;mNodeAllocator.mFirst">
[1] {{ {((eastl::ListNode&lt;$T1&gt;*)mNodeAllocator.mFirst.mpNext)-&gt;mValue} }}
</DisplayString>
<DisplayString Condition="mNodeAllocator.mFirst.mpNext != &amp;mNodeAllocator.mFirst &amp;&amp; mNodeAllocator.mFirst.mpNext-&gt;mpNext != &amp;mNodeAllocator.mFirst &amp;&amp; mNodeAllocator.mFirst.mpNext-&gt;mpNext-&gt;mpNext == &amp;mNodeAllocator.mFirst">
[2]
{{
{((eastl::ListNode&lt;$T1&gt;*)mNodeAllocator.mFirst.mpNext)-&gt;mValue},
{((eastl::ListNode&lt;$T1&gt;*)mNodeAllocator.mFirst.mpNext-&gt;mpNext)-&gt;mValue}
}}
</DisplayString>
<DisplayString Condition="mNodeAllocator.mFirst.mpNext != &amp;mNodeAllocator.mFirst &amp;&amp; mNodeAllocator.mFirst.mpNext-&gt;mpNext != &amp;mNodeAllocator.mFirst &amp;&amp; mNodeAllocator.mFirst.mpNext-&gt;mpNext-&gt;mpNext != &amp;mNodeAllocator.mFirst">
[?]
{{
{((eastl::ListNode&lt;$T1&gt;*)mNodeAllocator.mFirst.mpNext)-&gt;mValue},
{((eastl::ListNode&lt;$T1&gt;*)mNodeAllocator.mFirst.mpNext-&gt;mpNext)-&gt;mValue},
...
}}
</DisplayString>
<Expand>
<Synthetic Name="NOTE!">
<DisplayString>Content of lists will repeat indefinitely. Keep that in mind!</DisplayString>
</Synthetic>
<LinkedListItems>
<HeadPointer>mNodeAllocator.mFirst.mpNext</HeadPointer>
<NextPointer>mpNext</NextPointer>
<ValueNode>((eastl::ListNode&lt;$T1&gt;*)this)-&gt;mValue</ValueNode>
</LinkedListItems>
</Expand>
</Type>
<Type Name="eastl::ListNode&lt;*&gt;">
<DisplayString>{mValue}</DisplayString>
<Expand>
<Item Name="Value">mValue</Item>
<Item Name="Next">*(eastl::ListNode&lt;$T1&gt;*)mpNext</Item>
<Item Name="Previous">*(eastl::ListNode&lt;$T1&gt;*)mpPrev</Item>
<Synthetic Name="NOTE!">
<DisplayString>Content of lists will repeat indefinitely. Keep that in mind!</DisplayString>
</Synthetic>
<Synthetic Name="List">
<DisplayString>The rest of the list follows:</DisplayString>
</Synthetic>
<LinkedListItems>
<HeadPointer>(eastl::ListNode&lt;$T1&gt;*)mpNext-&gt;mpNext</HeadPointer>
<NextPointer>(eastl::ListNode&lt;$T1&gt;*)mpNext</NextPointer>
<ValueNode>mValue</ValueNode>
</LinkedListItems>
</Expand>
</Type>
<Type Name="eastl::ListIterator&lt;*&gt;">
<DisplayString>{*mpNode}</DisplayString>
<Expand>
<ExpandedItem>*(eastl::ListNode&lt;$T1&gt;*)mpNode</ExpandedItem>
</Expand>
</Type>
<Type Name="eastl::SListBase&lt;*&gt;">
<DisplayString Condition="mNode.mpNext == 0">
[0] {{}}
</DisplayString>
<DisplayString Condition="mNode.mpNext != 0 &amp;&amp; mNode.mpNext-&gt;mpNext == 0">
[1]
{{
{((eastl::SListNode&lt;$T1&gt;*)mNode.mpNext)-&gt;mValue}
}}
</DisplayString>
<DisplayString Condition="mNode.mpNext != 0 &amp;&amp; mNode.mpNext-&gt;mpNext != 0 &amp;&amp; mNode.mpNext-&gt;mpNext-&gt;mpNext == 0">
[2]
{{
{((eastl::SListNode&lt;$T1&gt;*)mNode.mpNext)-&gt;mValue},
{((eastl::SListNode&lt;$T1&gt;*)mNode.mpNext-&gt;mpNext)-&gt;mValue}
}}
</DisplayString>
<DisplayString Condition="mNode.mpNext != 0 &amp;&amp; mNode.mpNext-&gt;mpNext != 0 &amp;&amp; mNode.mpNext-&gt;mpNext-&gt;mpNext != 0">
[?]
{{
{((eastl::SListNode&lt;$T1&gt;*)mNode.mpNext)-&gt;mValue},
{((eastl::SListNode&lt;$T1&gt;*)mNode.mpNext-&gt;mpNext)-&gt;mValue},
...
}}
</DisplayString>
<Expand>
<LinkedListItems>
<HeadPointer>mNode.mpNext</HeadPointer>
<NextPointer>mpNext</NextPointer>
<ValueNode>((eastl::SListNode&lt;$T1&gt;*)this)-&gt;mValue</ValueNode>
</LinkedListItems>
</Expand>
</Type>
<Type Name="eastl::SListNode&lt;*&gt;">
<DisplayString>{mValue}</DisplayString>
<Expand>
<Item Name="Value">mValue</Item>
<Item Name="Next">*(eastl::SListNode&lt;$T1&gt;*)mpNext</Item>
<Synthetic Name="List">
<DisplayString>The rest of the list follows:</DisplayString>
</Synthetic>
<LinkedListItems>
<HeadPointer>mpNext == nullptr ? nullptr : (eastl::SListNode&lt;$T1&gt;*)mpNext-&gt;mpNext</HeadPointer>
<NextPointer>(eastl::SListNode&lt;$T1&gt;*)mpNext</NextPointer>
<ValueNode>mValue</ValueNode>
</LinkedListItems>
</Expand>
</Type>
<Type Name="eastl::SListIterator&lt;*&gt;">
<DisplayString>{*mpNode}</DisplayString>
<Expand>
<ExpandedItem>*(eastl::SListNode&lt;$T1&gt;*)mpNode</ExpandedItem>
</Expand>
</Type>
<Type Name="eastl::intrusive_list_base">
<DisplayString Condition="mAnchor.mpNext == &amp;mAnchor">[0] {{}}</DisplayString>
<DisplayString Condition="mAnchor.mpNext != &amp;mAnchor &amp;&amp; mAnchor.mpNext-&gt;mpNext == &amp;mAnchor">[1] {{ {mAnchor.mpNext} }}</DisplayString>
<DisplayString Condition="mAnchor.mpNext != &amp;mAnchor &amp;&amp; mAnchor.mpNext-&gt;mpNext != &amp;mAnchor">[?] {{ {mAnchor.mpNext}, ... }}</DisplayString>
<Expand>
<Synthetic Name="NOTE!">
<DisplayString>Content of intrusive lists will repeat indefinitely. Keep that in mind!</DisplayString>
</Synthetic>
<LinkedListItems>
<HeadPointer>mAnchor.mpNext</HeadPointer>
<NextPointer>mpNext</NextPointer>
<ValueNode>*this</ValueNode>
</LinkedListItems>
</Expand>
</Type>
<Type Name="eastl::intrusive_list_iterator&lt;*&gt;">
<DisplayString>{*($T1*)mpNode}</DisplayString>
<Expand>
<ExpandedItem>*($T1*)mpNode</ExpandedItem>
</Expand>
</Type>
<Type Name="eastl::set&lt;*&gt;">
<AlternativeType Name="eastl::multiset&lt;*&gt;" />
<DisplayString Condition="mnSize == 0">
[0] {{}}
</DisplayString>
<DisplayString Condition="mnSize == 1">
[1]
{{
{((eastl::rbtree_node&lt;$T1&gt;*)mAnchor.mpNodeLeft)-&gt;mValue}
}}
</DisplayString>
<DisplayString Condition="mnSize &gt; 1">
[{mnSize}]
{{
{((eastl::rbtree_node&lt;$T1&gt;*)mAnchor.mpNodeLeft)-&gt;mValue},
...
}}
</DisplayString>
<Expand>
<Item Name="[size]">mnSize</Item>
<TreeItems>
<Size>mnSize</Size>
<HeadPointer>mAnchor.mpNodeParent</HeadPointer>
<LeftPointer>mpNodeLeft</LeftPointer>
<RightPointer>mpNodeRight</RightPointer>
<ValueNode>((eastl::rbtree_node&lt;$T1&gt;*)this)-&gt;mValue</ValueNode>
</TreeItems>
</Expand>
</Type>
<Type Name="eastl::rbtree&lt;*,*&gt;">
<DisplayString Condition="mnSize == 0">
[0] {{}}
</DisplayString>
<DisplayString Condition="mnSize == 1">
[1]
{{
{((eastl::rbtree_node&lt;$T2&gt;*)mAnchor.mpNodeLeft)-&gt;mValue}
}}
</DisplayString>
<DisplayString Condition="mnSize &gt; 1">
[{mnSize}]
{{
{((eastl::rbtree_node&lt;$T2&gt;*)mAnchor.mpNodeLeft)-&gt;mValue},
...
}}
</DisplayString>
<Expand>
<Item Name="[size]">mnSize</Item>
<TreeItems>
<Size>mnSize</Size>
<HeadPointer>mAnchor.mpNodeParent</HeadPointer>
<LeftPointer>mpNodeLeft</LeftPointer>
<RightPointer>mpNodeRight</RightPointer>
<ValueNode>((eastl::rbtree_node&lt;$T2&gt;*)this)-&gt;mValue</ValueNode>
</TreeItems>
</Expand>
</Type>
<Type Name="eastl::rbtree_node&lt;*&gt;">
<DisplayString>{mValue}</DisplayString>
<Expand>
<Item Name="Value">mValue</Item>
<Synthetic Name="NOTE!">
<DisplayString>It is possible to expand parents that do not exist.</DisplayString>
</Synthetic>
<Item Name="Parent">*(eastl::rbtree_node&lt;$T1&gt;*)mpNodeParent</Item>
<Item Name="Left">*(eastl::rbtree_node&lt;$T1&gt;*)mpNodeLeft</Item>
<Item Name="Right">*(eastl::rbtree_node&lt;$T1&gt;*)mpNodeRight</Item>
</Expand>
</Type>
<Type Name="eastl::rbtree_iterator&lt;*&gt;">
<DisplayString>{*(eastl::rbtree_node&lt;$T1&gt;*)mpNode}</DisplayString>
<Expand>
<Item Name="Node">*(eastl::rbtree_node&lt;$T1&gt;*)mpNode</Item>
</Expand>
</Type>
<Type Name="eastl::hashtable&lt;*&gt;">
<DisplayString Condition="mnElementCount == 0">[{mnElementCount}] {{}}</DisplayString>
<DisplayString Condition="mnElementCount != 0">[{mnElementCount}] {{ ... }}</DisplayString>
<Expand>
<ArrayItems IncludeView="detailed">
<Size>mnBucketCount</Size>
<ValuePointer>mpBucketArray</ValuePointer>
</ArrayItems>
<CustomListItems ExcludeView="detailed">
<Variable Name="bucketIndex" InitialValue="0"/>
<Variable Name="entry" InitialValue ="mpBucketArray[bucketIndex]"/>
<Loop>
<Item Condition="entry != nullptr">entry->mValue</Item>
<If Condition="entry != nullptr">
<Exec>entry = entry->mpNext</Exec>
</If>
<If Condition="entry == nullptr">
<Exec>bucketIndex++</Exec>
<Break Condition="bucketIndex == mnBucketCount"/>
<Exec>entry = mpBucketArray[bucketIndex]</Exec>
</If>
</Loop>
</CustomListItems>
</Expand>
</Type>
<!-- specifically for hash_map (instead of base implementation hashtable),
show the key as name, and value as value, instead of index -> pair<key, value> -->
<Type Name="eastl::hash_map&lt;*&gt;">
<DisplayString Condition="mnElementCount == 0">[{mnElementCount}] {{}}</DisplayString>
<DisplayString Condition="mnElementCount != 0">[{mnElementCount}] {{ ... }}</DisplayString>
<Expand>
<CustomListItems ExcludeView="detailed">
<Variable Name="bucketIndex" InitialValue="0"/>
<Variable Name="entry" InitialValue ="mpBucketArray[bucketIndex]"/>
<Loop>
<Item Name="[{entry->mValue.first}]" Condition="entry != nullptr">entry->mValue.second</Item>
<If Condition="entry != nullptr">
<Exec>entry = entry->mpNext</Exec>
</If>
<If Condition="entry == nullptr">
<Exec>bucketIndex++</Exec>
<Break Condition="bucketIndex == mnBucketCount"/>
<Exec>entry = mpBucketArray[bucketIndex]</Exec>
</If>
</Loop>
</CustomListItems>
</Expand>
</Type>
<Type Name="eastl::hash_node&lt;*&gt;">
<DisplayString Condition="this != 0 &amp;&amp; mpNext != 0"> {mValue}, {*mpNext}</DisplayString>
<DisplayString Condition="this != 0 &amp;&amp; mpNext == 0"> {mValue}</DisplayString>
<DisplayString Condition="this == 0"></DisplayString>
<Expand>
<LinkedListItems>
<HeadPointer>this</HeadPointer>
<NextPointer>mpNext</NextPointer>
<ValueNode>mValue</ValueNode>
</LinkedListItems>
</Expand>
</Type>
<Type Name="eastl::hashtable_iterator_base&lt;*&gt;">
<DisplayString>{mpNode-&gt;mValue}</DisplayString>
<Expand>
<ExpandedItem>mpNode-&gt;mValue</ExpandedItem>
</Expand>
</Type>
<Type Name="eastl::reverse_iterator&lt;*&gt;">
<DisplayString>{*(mIterator-1)}</DisplayString>
<Expand>
<ExpandedItem>mIterator-1</ExpandedItem>
</Expand>
</Type>
<Type Name="eastl::bitset&lt;*&gt;">
<DisplayString>{{count = {kSize}}}</DisplayString>
<Expand>
<Item Name="[count]">kSize</Item>
<CustomListItems>
<Variable Name="iWord" InitialValue="0" />
<Variable Name="iBitInWord" InitialValue="0" />
<Variable Name="bBitValue" InitialValue="false" />
<Size>kSize</Size>
<Loop>
<Exec>bBitValue = ((mWord[iWord] >> iBitInWord) % 2) != 0 ? true : false</Exec>
<Item>bBitValue</Item>
<Exec>iBitInWord++</Exec>
<If Condition="iBitInWord == kBitsPerWord">
<Exec>iWord++</Exec>
<Exec>iBitInWord = 0</Exec>
</If>
</Loop>
</CustomListItems>
</Expand>
</Type>
<Type Name="eastl::ring_buffer&lt;*,*,*&gt;">
<DisplayString>{c}</DisplayString>
<Expand>
<ExpandedItem>c</ExpandedItem>
</Expand>
</Type>
<Type Name="eastl::basic_string_view&lt;*&gt;">
<DisplayString>{mpBegin,[mnCount]}</DisplayString>
<StringView>mpBegin,[mnCount]</StringView>
</Type>
<Type Name="eastl::compressed_pair_imp&lt;*&gt;">
<DisplayString Condition="($T3) == 0" Optional="true">({mFirst}, {mSecond})</DisplayString>
<DisplayString Condition="($T3) == 1" Optional="true">({mSecond})</DisplayString>
<DisplayString Condition="($T3) == 2" Optional="true">({mFirst})</DisplayString>
<DisplayString Condition="($T3) == 3" Optional="true">(empty)</DisplayString>
<DisplayString Condition="($T3) == 4" Optional="true">(empty)</DisplayString>
<DisplayString Condition="($T3) == 5" Optional="true">({mFirst}, {mSecond})</DisplayString>
</Type>
<Type Name="eastl::optional&lt;*&gt;">
<Intrinsic Name="value" Expression="*($T1*)&amp;val"/>
<DisplayString Condition="!engaged">nullopt</DisplayString>
<DisplayString Condition="engaged">{value()}</DisplayString>
<Expand>
<Item Condition="engaged" Name="value">value()</Item>
</Expand>
</Type>
<Type Name="eastl::ratio&lt;*&gt;">
<DisplayString>{$T1} to {$T2}}</DisplayString>
</Type>
<Type Name="eastl::chrono::duration&lt;*,eastl::ratio&lt;1,1000000000&gt; &gt;">
<DisplayString>{mRep} nanoseconds</DisplayString>
</Type>
<Type Name="eastl::chrono::duration&lt;*,eastl::ratio&lt;1,1000000&gt; &gt;">
<DisplayString>{mRep} microseconds</DisplayString>
</Type>
<Type Name="eastl::chrono::duration&lt;*,eastl::ratio&lt;1,1000&gt; &gt;">
<DisplayString>{mRep} milliseconds</DisplayString>
</Type>
<Type Name="eastl::chrono::duration&lt;*,eastl::ratio&lt;1,1&gt; &gt;">
<DisplayString>{mRep} seconds</DisplayString>
</Type>
<Type Name="eastl::chrono::duration&lt;*,eastl::ratio&lt;60,1&gt; &gt;">
<DisplayString>{mRep} minutes</DisplayString>
</Type>
<Type Name="eastl::chrono::duration&lt;*,eastl::ratio&lt;3600,1&gt; &gt;">
<DisplayString>{mRep} hours</DisplayString>
</Type>
<Type Name="eastl::chrono::duration&lt;*,eastl::ratio&lt;*,*&gt; &gt;">
<DisplayString>{mRep} duration with ratio = [{$T2} : {$T3}] </DisplayString>
</Type>
<Type Name="eastl::function&lt;*&gt;">
<DisplayString Condition="mInvokeFuncPtr == nullptr">empty</DisplayString>
<DisplayString>{mInvokeFuncPtr}</DisplayString>
</Type>
<Type Name="eastl::reference_wrapper&lt;*&gt;">
<DisplayString>{*val}</DisplayString>
</Type>
<!--
This implementation isn't ideal because it can't switch between showing inline value vs values stored in a heap allocation.
We are hitting the limit of natvis scripting that we can't workaround unless we change the implementation of eastl::any.
-->
<Type Name="eastl::any">
<DisplayString Condition="m_handler == nullptr">empty</DisplayString>
<DisplayString Condition="m_handler != nullptr">{m_storage.external_storage}</DisplayString>
</Type>
<Type Name="eastl::atomic&lt;*&gt;">
<DisplayString>{mAtomic}</DisplayString>
<Expand>
<ExpandedItem>mAtomic</ExpandedItem>
</Expand>
</Type>
<Type Name="eastl::atomic_flag">
<DisplayString>{mFlag.mAtomic}</DisplayString>
</Type>
<Type Name="eastl::variant&lt;*&gt;">
<Intrinsic Name="index" Expression="(int)mIndex"/>
<DisplayString Condition="index() == size_t(-1)">[valueless_by_exception]</DisplayString>
<DisplayString Condition="index() == 0" Optional="true">{{ index=0, value={($T1*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 1" Optional="true">{{ index=1, value={($T2*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 2" Optional="true">{{ index=2, value={($T3*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 3" Optional="true">{{ index=3, value={($T4*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 4" Optional="true">{{ index=4, value={($T5*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 5" Optional="true">{{ index=5, value={($T6*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 6" Optional="true">{{ index=6, value={($T7*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 7" Optional="true">{{ index=7, value={($T8*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 8" Optional="true">{{ index=8, value={($T9*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 9" Optional="true">{{ index=9, value={($T10*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 10" Optional="true">{{ index=10, value={($T11*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 11" Optional="true">{{ index=11, value={($T12*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 12" Optional="true">{{ index=12, value={($T13*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 13" Optional="true">{{ index=13, value={($T14*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 14" Optional="true">{{ index=14, value={($T15*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 15" Optional="true">{{ index=15, value={($T16*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 16" Optional="true">{{ index=16, value={($T17*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 17" Optional="true">{{ index=17, value={($T18*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 18" Optional="true">{{ index=18, value={($T19*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 19" Optional="true">{{ index=19, value={($T20*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 20" Optional="true">{{ index=20, value={($T21*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 21" Optional="true">{{ index=21, value={($T22*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 22" Optional="true">{{ index=22, value={($T23*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 23" Optional="true">{{ index=23, value={($T24*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 24" Optional="true">{{ index=24, value={($T25*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 25" Optional="true">{{ index=25, value={($T26*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 26" Optional="true">{{ index=26, value={($T27*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 27" Optional="true">{{ index=27, value={($T28*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 28" Optional="true">{{ index=28, value={($T29*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 29" Optional="true">{{ index=29, value={($T30*)mStorage.mBuffer.mCharData}}</DisplayString>
<DisplayString Condition="index() == 30" Optional="true">{{ index=30, value={($T31*)mStorage.mBuffer.mCharData}}</DisplayString>
<Expand>
<Item Name="index">index()</Item>
<Item Name="[value]" Condition="index() == 0" Optional="true">($T1*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 1" Optional="true">($T2*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 2" Optional="true">($T3*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 3" Optional="true">($T4*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 4" Optional="true">($T5*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 5" Optional="true">($T6*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 6" Optional="true">($T7*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 7" Optional="true">($T8*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 8" Optional="true">($T9*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 9" Optional="true">($T10*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 10" Optional="true">($T11*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 11" Optional="true">($T12*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 12" Optional="true">($T13*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 13" Optional="true">($T14*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 14" Optional="true">($T15*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 15" Optional="true">($T16*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 16" Optional="true">($T17*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 17" Optional="true">($T18*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 18" Optional="true">($T19*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 19" Optional="true">($T20*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 20" Optional="true">($T21*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 21" Optional="true">($T22*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 22" Optional="true">($T23*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 23" Optional="true">($T24*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 24" Optional="true">($T25*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 25" Optional="true">($T26*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 26" Optional="true">($T27*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 27" Optional="true">($T28*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 28" Optional="true">($T29*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 29" Optional="true">($T30*)mStorage.mBuffer.mCharData</Item>
<Item Name="[value]" Condition="index() == 30" Optional="true">($T31*)mStorage.mBuffer.mCharData</Item>
</Expand>
</Type>
<Type Name="eastl::tuple&lt;&gt;">
<DisplayString IncludeView="noparens"></DisplayString>
<DisplayString ExcludeView="noparens">({*this,view(noparens)})</DisplayString>
<Expand/>
</Type>
<Type Name="eastl::tuple&lt;*&gt;">
<DisplayString IncludeView="noparens">{(*((eastl::Internal::TupleLeaf&lt;0,$T1,0&gt;*)&amp;mImpl)).mValue}</DisplayString>
<DisplayString ExcludeView="noparens">({*this,view(noparens)})</DisplayString>
<Expand>
<Item Name="[0]">(*((eastl::Internal::TupleLeaf&lt;0,$T1,0&gt;*)&amp;mImpl)).mValue</Item>
</Expand>
</Type>
<Type Name="eastl::tuple&lt;*,*&gt;">
<DisplayString IncludeView="noparens">{(*((eastl::Internal::TupleLeaf&lt;0,$T1,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;1,$T2,0&gt;*)&amp;mImpl)).mValue}</DisplayString>
<DisplayString ExcludeView="noparens">({*this,view(noparens)})</DisplayString>
<Expand>
<Item Name="[0]">(*((eastl::Internal::TupleLeaf&lt;0,$T1,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[1]">(*((eastl::Internal::TupleLeaf&lt;1,$T2,0&gt;*)&amp;mImpl)).mValue</Item>
</Expand>
</Type>
<Type Name="eastl::tuple&lt;*,*,*&gt;">
<DisplayString IncludeView="noparens">{(*((eastl::Internal::TupleLeaf&lt;0,$T1,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;1,$T2,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;2,$T3,0&gt;*)&amp;mImpl)).mValue}</DisplayString>
<DisplayString ExcludeView="noparens">({*this,view(noparens)})</DisplayString>
<Expand>
<Item Name="[0]">(*((eastl::Internal::TupleLeaf&lt;0,$T1,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[1]">(*((eastl::Internal::TupleLeaf&lt;1,$T2,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[2]">(*((eastl::Internal::TupleLeaf&lt;2,$T3,0&gt;*)&amp;mImpl)).mValue</Item>
</Expand>
</Type>
<Type Name="eastl::tuple&lt;*,*,*,*&gt;">
<DisplayString IncludeView="noparens">{(*((eastl::Internal::TupleLeaf&lt;0,$T1,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;1,$T2,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;2,$T3,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;3,$T4,0&gt;*)&amp;mImpl)).mValue}</DisplayString>
<DisplayString ExcludeView="noparens">({*this,view(noparens)})</DisplayString>
<Expand>
<Item Name="[0]">(*((eastl::Internal::TupleLeaf&lt;0,$T1,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[1]">(*((eastl::Internal::TupleLeaf&lt;1,$T2,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[2]">(*((eastl::Internal::TupleLeaf&lt;2,$T3,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[3]">(*((eastl::Internal::TupleLeaf&lt;3,$T4,0&gt;*)&amp;mImpl)).mValue</Item>
</Expand>
</Type>
<Type Name="eastl::tuple&lt;*,*,*,*,*&gt;">
<DisplayString IncludeView="noparens">{(*((eastl::Internal::TupleLeaf&lt;0,$T1,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;1,$T2,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;2,$T3,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;3,$T4,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;4,$T5,0&gt;*)&amp;mImpl)).mValue}</DisplayString>
<DisplayString ExcludeView="noparens">({*this,view(noparens)})</DisplayString>
<Expand>
<Item Name="[0]">(*((eastl::Internal::TupleLeaf&lt;0,$T1,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[1]">(*((eastl::Internal::TupleLeaf&lt;1,$T2,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[2]">(*((eastl::Internal::TupleLeaf&lt;2,$T3,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[3]">(*((eastl::Internal::TupleLeaf&lt;3,$T4,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[4]">(*((eastl::Internal::TupleLeaf&lt;4,$T5,0&gt;*)&amp;mImpl)).mValue</Item>
</Expand>
</Type>
<Type Name="eastl::tuple&lt;*,*,*,*,*,*&gt;">
<DisplayString IncludeView="noparens">{(*((eastl::Internal::TupleLeaf&lt;0,$T1,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;1,$T2,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;2,$T3,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;3,$T4,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;4,$T5,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;5,$T6,0&gt;*)&amp;mImpl)).mValue}</DisplayString>
<DisplayString ExcludeView="noparens">({*this,view(noparens)})</DisplayString>
<Expand>
<Item Name="[0]">(*((eastl::Internal::TupleLeaf&lt;0,$T1,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[1]">(*((eastl::Internal::TupleLeaf&lt;1,$T2,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[2]">(*((eastl::Internal::TupleLeaf&lt;2,$T3,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[3]">(*((eastl::Internal::TupleLeaf&lt;3,$T4,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[4]">(*((eastl::Internal::TupleLeaf&lt;4,$T5,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[5]">(*((eastl::Internal::TupleLeaf&lt;5,$T6,0&gt;*)&amp;mImpl)).mValue</Item>
</Expand>
</Type>
<Type Name="eastl::tuple&lt;*,*,*,*,*,*,*&gt;">
<DisplayString IncludeView="noparens">{(*((eastl::Internal::TupleLeaf&lt;0,$T1,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;1,$T2,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;2,$T3,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;3,$T4,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;4,$T5,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;5,$T6,0&gt;*)&amp;mImpl)).mValue}, {(*((eastl::Internal::TupleLeaf&lt;6,$T7,0&gt;*)&amp;mImpl)).mValue}</DisplayString>
<DisplayString ExcludeView="noparens">({*this,view(noparens)})</DisplayString>
<Expand>
<Item Name="[0]">(*((eastl::Internal::TupleLeaf&lt;0,$T1,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[1]">(*((eastl::Internal::TupleLeaf&lt;1,$T2,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[2]">(*((eastl::Internal::TupleLeaf&lt;2,$T3,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[3]">(*((eastl::Internal::TupleLeaf&lt;3,$T4,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[4]">(*((eastl::Internal::TupleLeaf&lt;4,$T5,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[5]">(*((eastl::Internal::TupleLeaf&lt;5,$T6,0&gt;*)&amp;mImpl)).mValue</Item>
<Item Name="[6]">(*((eastl::Internal::TupleLeaf&lt;6,$T7,0&gt;*)&amp;mImpl)).mValue</Item>
</Expand>
</Type>
</AutoVisualizer>

View File

@@ -6,7 +6,7 @@ import os
required_conan_version = ">=1.33.0" required_conan_version = ">=1.33.0"
class Bin2CPP(ConanFile): class Bin2CPP(ConanFile):
name = "Bin2CPP" name = "bin2cpp"
homepage = "https://git.romainboullard.com/rboullard/Bin2CPP" homepage = "https://git.romainboullard.com/rboullard/Bin2CPP"
description = "A utility that converts files to CPP headers" description = "A utility that converts files to CPP headers"
topics = ("utility") topics = ("utility")
@@ -33,6 +33,11 @@ class Bin2CPP(ConanFile):
generators = "CMakeDeps" generators = "CMakeDeps"
def export_sources(self):
copy(self, "CMakeLists.txt", self.recipe_folder, self.export_sources_folder)
copy(self, os.path.join("Bin2CPP", "*"), self.recipe_folder, self.export_sources_folder)
copy(self, os.path.join("CMake", "*"), self.recipe_folder, self.export_sources_folder)
def layout(self): def layout(self):
cmake_layout(self) cmake_layout(self)
@@ -49,7 +54,6 @@ class Bin2CPP(ConanFile):
self.requires("mimalloc/3.2.8@bigfootdev/main", transitive_headers=True) self.requires("mimalloc/3.2.8@bigfootdev/main", transitive_headers=True)
self.requires("cli11/2.6.1@bigfootdev/main") self.requires("cli11/2.6.1@bigfootdev/main")
if(self.settings.build_type == "RelWithDebInfo" or self.settings.build_type == "Debug"):
self.requires("cpptrace/1.0.4", transitive_headers=True) self.requires("cpptrace/1.0.4", transitive_headers=True)
if(self.options.build_tests): if(self.options.build_tests):
@@ -68,3 +72,19 @@ class Bin2CPP(ConanFile):
cmake = CMake(self) cmake = CMake(self)
cmake.configure() cmake.configure()
cmake.build() cmake.build()
def package(self):
copy(self, pattern="LICENSE", dst=os.path.join(self.package_folder, "licenses"), src=self.source_folder)
cmake = CMake(self)
cmake.install()
copy(self, "Bin2CPPTargets.cmake",
src=os.path.join(self.source_folder, "CMake"),
dst=os.path.join(self.package_folder, "bin"))
@property
def _module_path(self):
return os.path.join("bin", "Bin2CPPTargets.cmake")
def package_info(self):
self.cpp_info.set_property("cmake_build_modules", [self._module_path])

View File

@@ -0,0 +1,7 @@
cmake_minimum_required(VERSION 3.15)
project(test_package LANGUAGES C)
find_package(Bin2CPP REQUIRED CONFIG)
find_program(BIN2CPP_EXECUTABLE NAMES Bin2CPP)
execute_process(COMMAND ${BIN2CPP_EXECUTABLE} -h)

18
test_package/conanfile.py Normal file
View File

@@ -0,0 +1,18 @@
from conan import ConanFile
from conan.tools.build import can_run
from conan.tools.cmake import CMake, cmake_layout
import os
class TestPackageConan(ConanFile):
settings = "os", "arch", "compiler", "build_type"
generators = "CMakeToolchain", "CMakeDeps", "VirtualRunEnv"
def layout(self):
cmake_layout(self)
def requirements(self):
self.requires(self.tested_reference_str)
def test(self):
self.run("Bin2CPP --help", env="conanrun")