aboutsummaryrefslogtreecommitdiff
path: root/doc/EASTL.natvis
diff options
context:
space:
mode:
Diffstat (limited to 'doc/EASTL.natvis')
-rw-r--r--doc/EASTL.natvis565
1 files changed, 565 insertions, 0 deletions
diff --git a/doc/EASTL.natvis b/doc/EASTL.natvis
new file mode 100644
index 0000000..30986d5
--- /dev/null
+++ b/doc/EASTL.natvis
@@ -0,0 +1,565 @@
+<?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)">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)">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>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>*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>{*mpNode}</DisplayString>
+ <Expand>
+ <ExpandedItem>*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;$T2&gt;*)(mpNodeParent.value &amp; (~uintptr_t(1)))</Item>
+ <Item Name="Left">*(eastl::rbtree_node&lt;$T2&gt;*)mpNodeLeft</Item>
+ <Item Name="Right">*(eastl::rbtree_node&lt;$T2&gt;*)mpNodeRight</Item>
+ </Expand>
+</Type>
+
+<Type Name="eastl::rbtree_iterator&lt;*&gt;">
+ <DisplayString>{*mpNode}</DisplayString>
+ <Expand>
+ <ExpandedItem>mpNode</ExpandedItem>
+ </Expand>
+</Type>
+
+
+<Type Name="eastl::hashtable&lt;*&gt;">
+ <DisplayString Condition="mnElementCount == 0">[{mnElementCount}] {{}}</DisplayString>
+ <DisplayString Condition="mnElementCount != 0">[{mnElementCount}] {{ ... }}</DisplayString>
+ <Expand>
+ <ArrayItems>
+ <Size>mnBucketCount</Size>
+ <ValuePointer>mpBucketArray</ValuePointer>
+ </ArrayItems>
+ </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_flag">
+ <DisplayString>{mFlag.mAtomic}</DisplayString>
+</Type>
+
+
+<!-- TODO eastl::tuple -->
+
+
+</AutoVisualizer>