]> git.lizzy.rs Git - rust.git/blob - src/etc/natvis/libstd.natvis
feat(rustdoc): open sidebar menu when links inside it are focused
[rust.git] / src / etc / natvis / libstd.natvis
1 <?xml version="1.0" encoding="utf-8"?>
2 <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
3   <!--
4     std::collection::Hash* container visualizers
5
6     Current std impls:
7       std::collections::hash::set::HashSet<K, S>      is implemented in terms of...
8       hashbrown::set::HashSet<K, S>                   is implemented in terms of...
9       hashbrown::map::HashMap<K, V, S>                is implemented in terms of...
10       hashbrown::raw::RawTable<(K, V)>
11
12     Ideally, we'd teach rustc to scan dependencies/crates for .natvis files so
13     the bulk of this could live alongside the hashbrown crate implementation,
14     and std would just forward using e.g. <ExpandedItem>base</ExpandedItem>.
15
16     However, Given that std...Hash*Set* is currently implemented in terms of
17     hashbrown...Hash*Map*, which would visualize poorly, we want to customize the
18     look/feel at the std type level *anyways*...
19
20     References:
21       https://github.com/rust-lang/rust/blob/master/src/libstd/collections/hash/map.rs
22       https://github.com/rust-lang/rust/blob/master/src/libstd/collections/hash/set.rs
23       https://github.com/rust-lang/hashbrown/blob/master/src/map.rs
24       https://github.com/rust-lang/hashbrown/blob/master/src/set.rs
25       https://github.com/rust-lang/hashbrown/blob/master/src/raw/mod.rs
26   -->
27
28   <Type Name="std::collections::hash::map::HashMap&lt;*,*,*&gt;">
29     <DisplayString>{{ len={base.table.table.items} }}</DisplayString>
30     <Expand>
31       <Item Name="[len]">base.table.table.items</Item>
32       <Item Name="[capacity]">base.table.table.items + base.table.table.growth_left</Item>
33       <Item Name="[state]">base.hash_builder</Item>
34
35       <CustomListItems>
36         <Variable Name="i" InitialValue="0" />
37         <Variable Name="n" InitialValue="base.table.table.items" />
38         <Size>base.table.table.items</Size>
39         <Loop>
40           <Break Condition="n == 0" />
41           <If Condition="(base.table.table.ctrl.pointer[i] &amp; 0x80) == 0">
42             <!-- Bucket is populated -->
43             <Exec>n--</Exec>
44             <Item Name="{((tuple$&lt;$T1, $T2&gt;*)base.table.table.ctrl.pointer)[-(i + 1)].__0}">((tuple$&lt;$T1, $T2&gt;*)base.table.table.ctrl.pointer)[-(i + 1)].__1</Item>
45           </If>
46           <Exec>i++</Exec>
47         </Loop>
48       </CustomListItems>
49     </Expand>
50   </Type>
51
52   <Type Name="std::collections::hash::set::HashSet&lt;*,*&gt;">
53     <DisplayString>{{ len={base.map.table.table.items} }}</DisplayString>
54     <Expand>
55       <Item Name="[len]">base.map.table.table.items</Item>
56       <Item Name="[capacity]">base.map.table.table.items + base.map.table.table.growth_left</Item>
57       <Item Name="[state]">base.map.hash_builder</Item>
58
59       <CustomListItems>
60         <Variable Name="i" InitialValue="0" />
61         <Variable Name="n" InitialValue="base.map.table.table.items" />
62         <Size>base.map.table.table.items</Size>
63         <Loop>
64           <Break Condition="n == 0" />
65           <If Condition="(base.map.table.table.ctrl.pointer[i] &amp; 0x80) == 0">
66             <!-- Bucket is populated -->
67             <Exec>n--</Exec>
68             <Item>(($T1*)base.map.table.table.ctrl.pointer)[-(i + 1)]</Item>
69           </If>
70           <Exec>i++</Exec>
71         </Loop>
72       </CustomListItems>
73     </Expand>
74   </Type>
75
76   <Type Name="std::ffi::c_str::CString">
77     <DisplayString>{inner.data_ptr,s}</DisplayString>
78     <Expand>
79       <Synthetic Name="[chars]">
80         <Expand>
81           <ArrayItems>
82             <Size>inner.length</Size>
83             <ValuePointer>(char*)inner.data_ptr</ValuePointer>
84           </ArrayItems>
85         </Expand>
86       </Synthetic>
87     </Expand>
88   </Type>
89
90   <Type Name="std::ffi::c_str::CStr">
91     <DisplayString>{(char*) inner}</DisplayString>
92     <Expand>
93       <Synthetic Name="[chars]">
94         <DisplayString>{(char*) inner}</DisplayString>
95         <Expand>
96           <ArrayItems>
97             <Size>strlen((char *) inner) + 1</Size>
98             <ValuePointer>(char*)inner</ValuePointer>
99           </ArrayItems>
100         </Expand>
101       </Synthetic>
102     </Expand>
103   </Type>
104 </AutoVisualizer>