diff options
Diffstat (limited to 'doc/EASTL.natvis')
-rw-r--r-- | doc/EASTL.natvis | 565 |
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<*>"> + <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<*>"> + <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<*>"> + <DisplayString>{((mpRefCount && mpRefCount->mRefCount) ? mpValue : nullptr)}</DisplayString> + <Expand> + <ExpandedItem>mpRefCount && mpRefCount->mRefCount ? mpValue : nullptr</ExpandedItem> + </Expand> +</Type> + +<Type Name="eastl::array<*,*>"> + <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 > 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<*>"> + <DisplayString Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">"{mPair.mFirst.heap.mpBegin,sb}"</DisplayString> + <DisplayString Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">"{mPair.mFirst.sso.mData,sb}"</DisplayString> + <Expand> + <Item Name="[length]" Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">mPair.mFirst.heap.mnSize</Item> + <Item Name="[capacity]" Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">(mPair.mFirst.heap.mnCapacity & ~kHeapMask)</Item> + <Item Name="[value]" Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">mPair.mFirst.heap.mpBegin,sb</Item> + + <Item Name="[length]" Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize</Item> + <Item Name="[capacity]" Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">SSOLayout::SSO_CAPACITY</Item> + <Item Name="[value]" Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">mPair.mFirst.sso.mData,sb</Item> + + <Item Name="[uses heap]">!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)</Item> + </Expand> +</Type> + + +<Type Name="eastl::basic_string<wchar_t,*>"> + <DisplayString Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">{mPair.mFirst.heap.mpBegin,su}</DisplayString> + <DisplayString Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">{mPair.mFirst.sso.mData,su}</DisplayString> + <Expand> + <Item Name="[length]" Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">mPair.mFirst.heap.mnSize</Item> + <Item Name="[capacity]" Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">(mPair.mFirst.heap.mnCapacity & ~kHeapMask)</Item> + <Item Name="[value]" Condition="!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">mPair.mFirst.heap.mpBegin,su</Item> + + <Item Name="[length]" Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize</Item> + <Item Name="[capacity]" Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">SSOLayout::SSO_CAPACITY</Item> + <Item Name="[value]" Condition="!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)">mPair.mFirst.sso.mData,su</Item> + + <Item Name="[uses heap]">!!(mPair.mFirst.sso.mRemainingSizeField.mnRemainingSize & kSSOMask)</Item> + </Expand> +</Type> + +<Type Name="eastl::pair<*>"> + <DisplayString>({first}, {second})</DisplayString> + <Expand> + <Item Name="first">first</Item> + <Item Name="second">second</Item> + </Expand> +</Type> + +<Type Name="eastl::span<*>"> + <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 > 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<*>"> + <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 > 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<*,*,*>"> + <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<*>"> + <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<*>"> + <AlternativeType Name="eastl::priority_queue<*>" /> + <AlternativeType Name="eastl::stack<*>" /> + <DisplayString>{c}</DisplayString> + <Expand> + <ExpandedItem>c</ExpandedItem> + </Expand> +</Type> + +<Type Name="eastl::ListBase<*>"> + <DisplayString Condition="mNodeAllocator.mFirst.mpNext == &mNodeAllocator.mFirst"> + [0] {{}} + </DisplayString> + <DisplayString Condition="mNodeAllocator.mFirst.mpNext != &mNodeAllocator.mFirst && mNodeAllocator.mFirst.mpNext->mpNext == &mNodeAllocator.mFirst"> + [1] {{ {((eastl::ListNode<$T1>*)mNodeAllocator.mFirst.mpNext)->mValue} }} + </DisplayString> + <DisplayString Condition="mNodeAllocator.mFirst.mpNext != &mNodeAllocator.mFirst && mNodeAllocator.mFirst.mpNext->mpNext != &mNodeAllocator.mFirst && mNodeAllocator.mFirst.mpNext->mpNext->mpNext == &mNodeAllocator.mFirst"> + [2] + {{ + {((eastl::ListNode<$T1>*)mNodeAllocator.mFirst.mpNext)->mValue}, + {((eastl::ListNode<$T1>*)mNodeAllocator.mFirst.mpNext->mpNext)->mValue} + }} + </DisplayString> + <DisplayString Condition="mNodeAllocator.mFirst.mpNext != &mNodeAllocator.mFirst && mNodeAllocator.mFirst.mpNext->mpNext != &mNodeAllocator.mFirst && mNodeAllocator.mFirst.mpNext->mpNext->mpNext != &mNodeAllocator.mFirst"> + [?] + {{ + {((eastl::ListNode<$T1>*)mNodeAllocator.mFirst.mpNext)->mValue}, + {((eastl::ListNode<$T1>*)mNodeAllocator.mFirst.mpNext->mpNext)->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<$T1>*)this)->mValue</ValueNode> + </LinkedListItems> + </Expand> +</Type> + +<Type Name="eastl::ListNode<*>"> + <DisplayString>{mValue}</DisplayString> + <Expand> + <Item Name="Value">mValue</Item> + <Item Name="Next">*(eastl::ListNode<$T1>*)mpNext</Item> + <Item Name="Previous">*(eastl::ListNode<$T1>*)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<$T1>*)mpNext->mpNext</HeadPointer> + <NextPointer>(eastl::ListNode<$T1>*)mpNext</NextPointer> + <ValueNode>mValue</ValueNode> + </LinkedListItems> + </Expand> +</Type> + +<Type Name="eastl::ListIterator<*>"> + <DisplayString>{*mpNode}</DisplayString> + <Expand> + <ExpandedItem>mpNode</ExpandedItem> + </Expand> +</Type> + +<Type Name="eastl::SListBase<*>"> + <DisplayString Condition="mNode.mpNext == 0"> + [0] {{}} + </DisplayString> + <DisplayString Condition="mNode.mpNext != 0 && mNode.mpNext->mpNext == 0"> + [1] + {{ + {((eastl::SListNode<$T1>*)mNode.mpNext)->mValue} + }} + </DisplayString> + <DisplayString Condition="mNode.mpNext != 0 && mNode.mpNext->mpNext != 0 && mNode.mpNext->mpNext->mpNext == 0"> + [2] + {{ + {((eastl::SListNode<$T1>*)mNode.mpNext)->mValue}, + {((eastl::SListNode<$T1>*)mNode.mpNext->mpNext)->mValue} + }} + </DisplayString> + <DisplayString Condition="mNode.mpNext != 0 && mNode.mpNext->mpNext != 0 && mNode.mpNext->mpNext->mpNext != 0"> + [?] + {{ + {((eastl::SListNode<$T1>*)mNode.mpNext)->mValue}, + {((eastl::SListNode<$T1>*)mNode.mpNext->mpNext)->mValue}, + ... + }} + </DisplayString> + <Expand> + <LinkedListItems> + <HeadPointer>mNode.mpNext</HeadPointer> + <NextPointer>mpNext</NextPointer> + <ValueNode>((eastl::SListNode<$T1>*)this)->mValue</ValueNode> + </LinkedListItems> + </Expand> +</Type> + +<Type Name="eastl::SListNode<*>"> + <DisplayString>{mValue}</DisplayString> + <Expand> + <Item Name="Value">mValue</Item> + <Item Name="Next">*(eastl::SListNode<$T1>*)mpNext</Item> + <Synthetic Name="List"> + <DisplayString>The rest of the list follows:</DisplayString> + </Synthetic> + <LinkedListItems> + <HeadPointer>mpNext == nullptr ? nullptr : (eastl::SListNode<$T1>*)mpNext->mpNext</HeadPointer> + <NextPointer>(eastl::SListNode<$T1>*)mpNext</NextPointer> + <ValueNode>mValue</ValueNode> + </LinkedListItems> + </Expand> +</Type> + +<Type Name="eastl::SListIterator<*>"> + <DisplayString>{*mpNode}</DisplayString> + <Expand> + <ExpandedItem>*mpNode</ExpandedItem> + </Expand> +</Type> + +<Type Name="eastl::intrusive_list_base"> + <DisplayString Condition="mAnchor.mpNext == &mAnchor">[0] {{}}</DisplayString> + <DisplayString Condition="mAnchor.mpNext != &mAnchor && mAnchor.mpNext->mpNext == &mAnchor">[1] {{ {mAnchor.mpNext} }}</DisplayString> + <DisplayString Condition="mAnchor.mpNext != &mAnchor && mAnchor.mpNext->mpNext != &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<*>"> + <DisplayString>{*mpNode}</DisplayString> + <Expand> + <ExpandedItem>*mpNode</ExpandedItem> + </Expand> +</Type> + +<Type Name="eastl::set<*>"> + <AlternativeType Name="eastl::multiset<*>" /> + <DisplayString Condition="mnSize == 0"> + [0] {{}} + </DisplayString> + <DisplayString Condition="mnSize == 1"> + [1] + {{ + {((eastl::rbtree_node<$T1>*)mAnchor.mpNodeLeft)->mValue} + }} + </DisplayString> + <DisplayString Condition="mnSize > 1"> + [{mnSize}] + {{ + {((eastl::rbtree_node<$T1>*)mAnchor.mpNodeLeft)->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<$T1>*)this)->mValue</ValueNode> + </TreeItems> + </Expand> +</Type> + +<Type Name="eastl::rbtree<*,*>"> + <DisplayString Condition="mnSize == 0"> + [0] {{}} + </DisplayString> + <DisplayString Condition="mnSize == 1"> + [1] + {{ + {((eastl::rbtree_node<$T2>*)mAnchor.mpNodeLeft)->mValue} + }} + </DisplayString> + <DisplayString Condition="mnSize > 1"> + [{mnSize}] + {{ + {((eastl::rbtree_node<$T2>*)mAnchor.mpNodeLeft)->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<$T2>*)this)->mValue</ValueNode> + </TreeItems> + </Expand> +</Type> + +<Type Name="eastl::rbtree_node<*>"> + <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<$T2>*)(mpNodeParent.value & (~uintptr_t(1)))</Item> + <Item Name="Left">*(eastl::rbtree_node<$T2>*)mpNodeLeft</Item> + <Item Name="Right">*(eastl::rbtree_node<$T2>*)mpNodeRight</Item> + </Expand> +</Type> + +<Type Name="eastl::rbtree_iterator<*>"> + <DisplayString>{*mpNode}</DisplayString> + <Expand> + <ExpandedItem>mpNode</ExpandedItem> + </Expand> +</Type> + + +<Type Name="eastl::hashtable<*>"> + <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<*>"> + <DisplayString Condition="this != 0 && mpNext != 0"> {mValue}, {*mpNext}</DisplayString> + <DisplayString Condition="this != 0 && 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<*>"> + <DisplayString>{mpNode->mValue}</DisplayString> + <Expand> + <ExpandedItem>mpNode->mValue</ExpandedItem> + </Expand> +</Type> + +<Type Name="eastl::reverse_iterator<*>"> + <DisplayString>{*(mIterator-1)}</DisplayString> + <Expand> + <ExpandedItem>mIterator-1</ExpandedItem> + </Expand> +</Type> + +<Type Name="eastl::bitset<*>"> + <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<*,*,*>"> + <DisplayString>{c}</DisplayString> + <Expand> + <ExpandedItem>c</ExpandedItem> + </Expand> +</Type> + +<Type Name="eastl::basic_string_view<*>"> + <DisplayString>{mpBegin,[mnCount]}</DisplayString> + <StringView>mpBegin,[mnCount]</StringView> +</Type> + +<Type Name="eastl::compressed_pair_imp<*>"> + <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<*>"> + <Intrinsic Name="value" Expression="*($T1*)&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<*>"> + <DisplayString>{$T1} to {$T2}}</DisplayString> +</Type> + + +<Type Name="eastl::chrono::duration<*,eastl::ratio<1,1000000000> >"> + <DisplayString>{mRep} nanoseconds</DisplayString> +</Type> + +<Type Name="eastl::chrono::duration<*,eastl::ratio<1,1000000> >"> + <DisplayString>{mRep} microseconds</DisplayString> +</Type> + +<Type Name="eastl::chrono::duration<*,eastl::ratio<1,1000> >"> + <DisplayString>{mRep} milliseconds</DisplayString> +</Type> + +<Type Name="eastl::chrono::duration<*,eastl::ratio<1,1> >"> + <DisplayString>{mRep} seconds</DisplayString> +</Type> + +<Type Name="eastl::chrono::duration<*,eastl::ratio<60,1> >"> + <DisplayString>{mRep} minutes</DisplayString> +</Type> + +<Type Name="eastl::chrono::duration<*,eastl::ratio<3600,1> >"> + <DisplayString>{mRep} hours</DisplayString> +</Type> + +<Type Name="eastl::chrono::duration<*,eastl::ratio<*,*> >"> + <DisplayString>{mRep} duration with ratio = [{$T2} : {$T3}] </DisplayString> +</Type> + + + +<Type Name="eastl::function<*>"> + <DisplayString Condition="mInvokeFuncPtr == nullptr">empty</DisplayString> + <DisplayString>{mInvokeFuncPtr}</DisplayString> +</Type> + + +<Type Name="eastl::reference_wrapper<*>"> + <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> |