Przeglądaj źródła

natvis: when you discover the intrinsic tag... :)

Michele Caini 4 lat temu
rodzic
commit
1360c985b7

+ 24 - 12
natvis/entt/container.natvis

@@ -1,28 +1,40 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
 <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
 <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
 	<Type Name="entt::dense_hash_map&lt;*&gt;">
 	<Type Name="entt::dense_hash_map&lt;*&gt;">
-		<DisplayString>{{ size={ packed.first_base::value.size() } }}</DisplayString>
+		<Intrinsic Name="capacity" Expression="packed.first_base::value.capacity()"/>
+		<Intrinsic Name="size" Expression="packed.first_base::value.size()"/>
+		<Intrinsic Name="bucket_count" Expression="sparse.first_base::value.size()"/>
+		<Intrinsic Name="element" Expression="packed.first_base::value[idx].element">
+			<Parameter Name="idx" Type="int"/>
+		</Intrinsic>
+		<DisplayString>{{ size={ size() } }}</DisplayString>
 		<Expand>
 		<Expand>
-			<Item Name="[capacity]" ExcludeView="simple">packed.first_base::value.capacity()</Item>
-			<Item Name="[bucket_count]" ExcludeView="simple">sparse.first_base::value.size()</Item>
-			<Item Name="[load_factor]" ExcludeView="simple">(float)packed.first_base::value.size() / (float)sparse.first_base::value.size()</Item>
+			<Item Name="[capacity]" ExcludeView="simple">capacity()</Item>
+			<Item Name="[bucket_count]" ExcludeView="simple">bucket_count()</Item>
+			<Item Name="[load_factor]" ExcludeView="simple">(float)size() / (float)bucket_count()</Item>
 			<Item Name="[max_load_factor]" ExcludeView="simple">threshold</Item>
 			<Item Name="[max_load_factor]" ExcludeView="simple">threshold</Item>
 			<IndexListItems>
 			<IndexListItems>
-				<Size>packed.first_base::value.size()</Size>
-				<ValueNode>packed.first_base::value[$i].element</ValueNode>
+				<Size>size()</Size>
+				<ValueNode>element($i)</ValueNode>
 			</IndexListItems>
 			</IndexListItems>
 		</Expand>
 		</Expand>
 	</Type>
 	</Type>
 	<Type Name="entt::dense_hash_set&lt;*&gt;">
 	<Type Name="entt::dense_hash_set&lt;*&gt;">
-		<DisplayString>{{ size={ packed.first_base::value.size() } }}</DisplayString>
+		<Intrinsic Name="capacity" Expression="packed.first_base::value.capacity()"/>
+		<Intrinsic Name="size" Expression="packed.first_base::value.size()"/>
+		<Intrinsic Name="bucket_count" Expression="sparse.first_base::value.size()"/>
+		<Intrinsic Name="element" Expression="packed.first_base::value[idx].element">
+			<Parameter Name="idx" Type="int"/>
+		</Intrinsic>
+		<DisplayString>{{ size={ size() } }}</DisplayString>
 		<Expand>
 		<Expand>
-			<Item Name="[capacity]" ExcludeView="simple">packed.first_base::value.capacity()</Item>
-			<Item Name="[bucket_count]" ExcludeView="simple">sparse.first_base::value.size()</Item>
-			<Item Name="[load_factor]" ExcludeView="simple">(float)packed.first_base::value.size() / (float)sparse.first_base::value.size()</Item>
+			<Item Name="[capacity]" ExcludeView="simple">capacity()</Item>
+			<Item Name="[bucket_count]" ExcludeView="simple">bucket_count()</Item>
+			<Item Name="[load_factor]" ExcludeView="simple">(float)size() / (float)bucket_count()</Item>
 			<Item Name="[max_load_factor]" ExcludeView="simple">threshold</Item>
 			<Item Name="[max_load_factor]" ExcludeView="simple">threshold</Item>
 			<IndexListItems>
 			<IndexListItems>
-				<Size>packed.first_base::value.size()</Size>
-				<ValueNode>packed.first_base::value[$i].element</ValueNode>
+				<Size>size()</Size>
+				<ValueNode>element($i)</ValueNode>
 			</IndexListItems>
 			</IndexListItems>
 		</Expand>
 		</Expand>
 	</Type>
 	</Type>

+ 7 - 8
natvis/entt/core.natvis

@@ -4,15 +4,14 @@
 		<DisplayString>{{ type={ info->alias,na }, policy={ mode,en } }}</DisplayString>
 		<DisplayString>{{ type={ info->alias,na }, policy={ mode,en } }}</DisplayString>
     </Type>
     </Type>
 	<Type Name="entt::compressed_pair&lt;*&gt;">
 	<Type Name="entt::compressed_pair&lt;*&gt;">
-		<DisplayString Optional="true">({ ((first_base*)this)->value }, { ((second_base*)this)->value })</DisplayString>
-		<DisplayString Optional="true">({ *(first_base::base_type*)this }, { ((second_base*)this)->value })</DisplayString>
-		<DisplayString Optional="true">({ ((first_base*)this)->value }, { *(second_base::base_type*)this })</DisplayString>
-		<DisplayString Optional="true">({ *(first_base::base_type*)this }, { *(second_base::base_type*)this })</DisplayString>
+		<Intrinsic Name="first" Optional="true" Expression="((first_base*)this)->value"/>
+		<Intrinsic Name="first" Optional="true" Expression="*(first_base::base_type*)this"/>
+		<Intrinsic Name="second" Optional="true" Expression="((second_base*)this)->value"/>
+		<Intrinsic Name="second" Optional="true" Expression="*(second_base::base_type*)this"/>
+		<DisplayString >({ first() }, { second() })</DisplayString>
 		<Expand>
 		<Expand>
-			<Item Name="[first]" Optional="true">((first_base*)this)->value</Item>
-			<Item Name="[first]" Optional="true">*(first_base::base_type*)this</Item>
-			<Item Name="[second]" Optional="true">((second_base*)this)->value</Item>
-			<Item Name="[second]" Optional="true">*(second_base::base_type*)this</Item>
+			<Item Name="[first]">first()</Item>
+			<Item Name="[second]">second()</Item>
 		</Expand>
 		</Expand>
 	</Type>
 	</Type>
 	<Type Name="entt::basic_hashed_string&lt;*&gt;">
 	<Type Name="entt::basic_hashed_string&lt;*&gt;">

+ 13 - 3
natvis/entt/entity.natvis

@@ -1,27 +1,37 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
 <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
 <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
 	<Type Name="entt::basic_sparse_set&lt;*&gt;">
 	<Type Name="entt::basic_sparse_set&lt;*&gt;">
+		<Intrinsic Name="is_valid" Expression="entity &lt; (entity_traits::reserved &amp; ~entity_traits::entity_mask)">
+			<Parameter Name="entity" Type="entity_type"/>
+		</Intrinsic>
 		<DisplayString>{{ size={ packed.size() }, type={ info->alias,na } }}</DisplayString>
 		<DisplayString>{{ size={ packed.size() }, type={ info->alias,na } }}</DisplayString>
 		<Expand>
 		<Expand>
 			<Item Name="[capacity]" ExcludeView="simple">packed.capacity()</Item>
 			<Item Name="[capacity]" ExcludeView="simple">packed.capacity()</Item>
 			<Item Name="[policy]" ExcludeView="simple">mode,en</Item>
 			<Item Name="[policy]" ExcludeView="simple">mode,en</Item>
 			<IndexListItems>
 			<IndexListItems>
 				<Size>packed.size()</Size>
 				<Size>packed.size()</Size>
-				<ValueNode Condition="packed[$i] &lt; (entity_traits::reserved &amp; ~entity_traits::entity_mask)">packed[$i]</ValueNode>
+				<ValueNode Condition="is_valid(packed[$i])">packed[$i]</ValueNode>
 				<ValueNode>tombstone</ValueNode>
 				<ValueNode>tombstone</ValueNode>
 			</IndexListItems>
 			</IndexListItems>
 		</Expand>
 		</Expand>
 	</Type>
 	</Type>
 	<Type Name="entt::basic_storage&lt;*&gt;">
 	<Type Name="entt::basic_storage&lt;*&gt;">
+		<Intrinsic Name="capacity" Expression="packed.first_base::value.capacity() * packed_page_v"/>
+		<Intrinsic Name="is_valid" Expression="base_type::packed[idx] &lt; (entity_traits::reserved &amp; ~entity_traits::entity_mask)">
+			<Parameter Name="idx" Type="int"/>
+		</Intrinsic>
+		<Intrinsic Name="element" Expression="packed.first_base::value[idx / packed_page_v][idx &amp; (packed_page_v - 1)]">
+			<Parameter Name="idx" Type="int"/>
+		</Intrinsic>
 		<DisplayString>{{ size={ base_type::packed.size() }, type={ base_type::info->alias,na } }}</DisplayString>
 		<DisplayString>{{ size={ base_type::packed.size() }, type={ base_type::info->alias,na } }}</DisplayString>
 		<Expand>
 		<Expand>
-			<Item Name="[capacity]" Optional="true" ExcludeView="simple">packed.first_base::value.capacity() * packed_page_v</Item>
+			<Item Name="[capacity]" Optional="true" ExcludeView="simple">capacity()</Item>
 			<Item Name="[page size]" Optional="true" ExcludeView="simple">packed_page_v</Item>
 			<Item Name="[page size]" Optional="true" ExcludeView="simple">packed_page_v</Item>
 			<Item Name="[base]" ExcludeView="simple">(base_type*)this,na</Item>
 			<Item Name="[base]" ExcludeView="simple">(base_type*)this,na</Item>
 			<Item Name="[base]" IncludeView="simple">(base_type*)this,view(simple)na</Item>
 			<Item Name="[base]" IncludeView="simple">(base_type*)this,view(simple)na</Item>
 			<IndexListItems Optional="true">
 			<IndexListItems Optional="true">
 				<Size>base_type::packed.size()</Size>
 				<Size>base_type::packed.size()</Size>
-				<ValueNode Condition="base_type::packed[$i] &lt; (entity_traits::reserved &amp; ~entity_traits::entity_mask)">packed.first_base::value[$i / packed_page_v][$i &amp; (packed_page_v - 1)]</ValueNode>
+				<ValueNode Condition="is_valid($i)">element($i)</ValueNode>
 				<ValueNode>tombstone</ValueNode>
 				<ValueNode>tombstone</ValueNode>
 			</IndexListItems>
 			</IndexListItems>
 		</Expand>
 		</Expand>

+ 21 - 12
natvis/entt/meta.natvis

@@ -25,13 +25,16 @@
 		<DisplayString>{{}}</DisplayString>
 		<DisplayString>{{}}</DisplayString>
 	</Type>
 	</Type>
 	<Type Name="entt::internal::meta_data_node">
 	<Type Name="entt::internal::meta_data_node">
+		<Intrinsic Name="has_property" Expression="!!(traits &amp; property)">
+			<Parameter Name="property" Type="int"/>
+		</Intrinsic>
 		<DisplayString Condition="type != nullptr">{{ type={ type->info->alias,na } }}</DisplayString>
 		<DisplayString Condition="type != nullptr">{{ type={ type->info->alias,na } }}</DisplayString>
 		<DisplayString>{{}}</DisplayString>
 		<DisplayString>{{}}</DisplayString>
 		<Expand>
 		<Expand>
 			<Item Name="[id]">id</Item>
 			<Item Name="[id]">id</Item>
 			<Item Name="[arity]">arity</Item>
 			<Item Name="[arity]">arity</Item>
-			<Item Name="[is_const]">!!(traits &amp; entt::internal::meta_traits::is_const)</Item>
-			<Item Name="[is_static]">!!(traits &amp; entt::internal::meta_traits::is_static)</Item>
+			<Item Name="[is_const]">has_property(entt::internal::meta_traits::is_const)</Item>
+			<Item Name="[is_static]">has_property(entt::internal::meta_traits::is_static)</Item>
 			<Synthetic Name="[prop]" Condition="prop != nullptr">
 			<Synthetic Name="[prop]" Condition="prop != nullptr">
 				<Expand>
 				<Expand>
 					<LinkedListItems>
 					<LinkedListItems>
@@ -51,12 +54,15 @@
 		</Expand>
 		</Expand>
 	</Type>
 	</Type>
 	<Type Name="entt::internal::meta_func_node"	>
 	<Type Name="entt::internal::meta_func_node"	>
+		<Intrinsic Name="has_property" Expression="!!(traits &amp; property)">
+			<Parameter Name="property" Type="int"/>
+		</Intrinsic>
 		<DisplayString Condition="ret != nullptr">{{ arity={ arity }, ret={ ret->info->alias,na } }}</DisplayString>
 		<DisplayString Condition="ret != nullptr">{{ arity={ arity }, ret={ ret->info->alias,na } }}</DisplayString>
 		<DisplayString>{{}}</DisplayString>
 		<DisplayString>{{}}</DisplayString>
 		<Expand>
 		<Expand>
 			<Item Name="[id]">id</Item>
 			<Item Name="[id]">id</Item>
-			<Item Name="[is_const]">!!(traits &amp; entt::internal::meta_traits::is_const)</Item>
-			<Item Name="[is_static]">!!(traits &amp; entt::internal::meta_traits::is_static)</Item>
+			<Item Name="[is_const]">has_property(entt::internal::meta_traits::is_const)</Item>
+			<Item Name="[is_static]">has_property(entt::internal::meta_traits::is_static)</Item>
 			<Synthetic Name="[prop]" Condition="prop != nullptr">
 			<Synthetic Name="[prop]" Condition="prop != nullptr">
 				<Expand>
 				<Expand>
 					<LinkedListItems>
 					<LinkedListItems>
@@ -106,19 +112,22 @@
 		</Expand>
 		</Expand>
 	</Type>
 	</Type>
 	<Type Name="entt::internal::meta_type_node">
 	<Type Name="entt::internal::meta_type_node">
+		<Intrinsic Name="has_property" Expression="!!(traits &amp; property)">
+			<Parameter Name="property" Type="int"/>
+		</Intrinsic>
 		<DisplayString Condition="info != nullptr">{{ type={ info->alias,na } }}</DisplayString>
 		<DisplayString Condition="info != nullptr">{{ type={ info->alias,na } }}</DisplayString>
 		<DisplayString>{{}}</DisplayString>
 		<DisplayString>{{}}</DisplayString>
 		<Expand>
 		<Expand>
 			<Item Name="[id]">id</Item>
 			<Item Name="[id]">id</Item>
 			<Item Name="[sizeof]">size_of</Item>
 			<Item Name="[sizeof]">size_of</Item>
-			<Item Name="[is_arithmetic]">!!(traits &amp; entt::internal::meta_traits::is_arithmetic)</Item>
-			<Item Name="[is_array]">!!(traits &amp; entt::internal::meta_traits::is_array)</Item>
-			<Item Name="[is_enum]">!!(traits &amp; entt::internal::meta_traits::is_enum)</Item>
-			<Item Name="[is_class]">!!(traits &amp; entt::internal::meta_traits::is_class)</Item>
-			<Item Name="[is_pointer]">!!(traits &amp; entt::internal::meta_traits::is_pointer)</Item>
-			<Item Name="[is_meta_pointer_like]">!!(traits &amp; entt::internal::meta_traits::is_meta_pointer_like)</Item>
-			<Item Name="[is_meta_sequence_container]">!!(traits &amp; entt::internal::meta_traits::is_meta_sequence_container)</Item>
-			<Item Name="[is_meta_associative_container]">!!(traits &amp; entt::internal::meta_traits::is_meta_associative_container)</Item>
+			<Item Name="[is_arithmetic]">has_property(entt::internal::meta_traits::is_arithmetic)</Item>
+			<Item Name="[is_array]">has_property(entt::internal::meta_traits::is_array)</Item>
+			<Item Name="[is_enum]">has_property(entt::internal::meta_traits::is_enum)</Item>
+			<Item Name="[is_class]">has_property(entt::internal::meta_traits::is_class)</Item>
+			<Item Name="[is_pointer]">has_property(entt::internal::meta_traits::is_pointer)</Item>
+			<Item Name="[is_meta_pointer_like]">has_property(entt::internal::meta_traits::is_meta_pointer_like)</Item>
+			<Item Name="[is_meta_sequence_container]">has_property(entt::internal::meta_traits::is_meta_sequence_container)</Item>
+			<Item Name="[is_meta_associative_container]">has_property(entt::internal::meta_traits::is_meta_associative_container)</Item>
 			<Item Name="[default_constructor]">default_constructor != nullptr</Item>
 			<Item Name="[default_constructor]">default_constructor != nullptr</Item>
 			<Item Name="[conversion_helper]">conversion_helper != nullptr</Item>
 			<Item Name="[conversion_helper]">conversion_helper != nullptr</Item>
 			<Item Name="[template_info]" Condition="templ != nullptr">*templ</Item>
 			<Item Name="[template_info]" Condition="templ != nullptr">*templ</Item>