Просмотр исходного кода

nativs: support to zero-sized versions

Michele Caini 2 лет назад
Родитель
Сommit
0dcf6c5690
1 измененных файлов с 15 добавлено и 9 удалено
  1. 15 9
      natvis/entt/entity.natvis

+ 15 - 9
natvis/entt/entity.natvis

@@ -26,7 +26,13 @@
 		</Expand>
 	</Type>
 	<Type Name="entt::basic_sparse_set&lt;*&gt;">
-		<Intrinsic Name="cap" Expression="(traits_type::version_mask &lt;&lt; traits_type::length)"/>
+		<Intrinsic Name="is_valid_position" Expression="sparse[page] &amp;&amp; ((*((traits_type::entity_type *)&amp;sparse[page][offset]) &amp; traits_type::entity_mask) != traits_type::entity_mask)">
+			<Parameter Name="page" Type="traits_type::entity_type"/>
+			<Parameter Name="offset" Type="traits_type::entity_type"/>
+		</Intrinsic>
+		<Intrinsic Name="is_valid_entity" Expression="!traits_type::version_mask || (*((traits_type::entity_type *)&amp;packed[pos]) &lt; (traits_type::version_mask &lt;&lt; traits_type::length))">
+			<Parameter Name="pos" Type="traits_type::entity_type"/>
+		</Intrinsic>
 		<DisplayString>{{ size={ packed.size() }, type={ info->alias,na } }}</DisplayString>
 		<Expand>
 			<Item Name="[capacity]">packed.capacity()</Item>
@@ -44,7 +50,7 @@
 							<Break Condition="pos == last"/>
 							<Exec>page = pos / traits_type::page_size</Exec>
 							<Exec>offset = pos &amp; (traits_type::page_size - 1)</Exec>
-							<If Condition="sparse[page] &amp;&amp; (*((traits_type::entity_type *)&amp;sparse[page][offset]) &lt; cap())">
+							<If Condition="is_valid_position(page, offset)">
 								<Item Name="[{ pos }]">*((traits_type::entity_type *)&amp;sparse[page][offset]) &amp; traits_type::entity_mask</Item>
 							</If>
 							<Exec>++pos</Exec>
@@ -57,10 +63,9 @@
 				<Expand>
 					<CustomListItems>
 						<Variable Name="pos" InitialValue="0"/>
-						<Variable Name="last" InitialValue="packed.size()"/>
 						<Loop>
-							<Break Condition="pos == last"/>
-							<If Condition="*((traits_type::entity_type *)&amp;packed[pos]) &lt; cap()">
+							<Break Condition="pos == packed.size()"/>
+							<If Condition="is_valid_entity(pos)">
 								<Item Name="[{ pos }]">packed[pos]</Item>
 							</If>
 							<Exec>++pos</Exec>
@@ -71,7 +76,9 @@
 		</Expand>
 	</Type>
 	<Type Name="entt::basic_storage&lt;*&gt;">
-		<Intrinsic Name="cap" Expression="(base_type::traits_type::version_mask &lt;&lt; base_type::traits_type::length)"/>
+		<Intrinsic Name="is_valid_entity" Expression="!base_type::traits_type::version_mask || (*((base_type::traits_type::entity_type *)&amp;base_type::packed[pos]) &lt; (base_type::traits_type::version_mask &lt;&lt; base_type::traits_type::length))">
+			<Parameter Name="pos" Type="base_type::traits_type::entity_type"/>
+		</Intrinsic>
 		<DisplayString>{{ size={ base_type::packed.size() }, type={ base_type::info->alias,na } }}</DisplayString>
 		<Expand>
 			<Item Name="[capacity]" Optional="true">payload.capacity() * traits_type::page_size</Item>
@@ -81,10 +88,9 @@
 			<!-- having SFINAE-like techniques in natvis is priceless :) -->
 			<CustomListItems Condition="payload.size() != 0" Optional="true">
 				<Variable Name="pos" InitialValue="0" />
-				<Variable Name="last" InitialValue="base_type::packed.size()"/>
 				<Loop>
-					<Break Condition="pos == last"/>
-					<If Condition="*((base_type::traits_type::entity_type *)&amp;base_type::packed[pos]) &lt; cap()">
+					<Break Condition="pos == base_type::packed.size()"/>
+					<If Condition="is_valid_entity(pos)">
 						<Item Name="[{ pos }:{ base_type::packed[pos] }]">payload[pos / traits_type::page_size][pos &amp; (traits_type::page_size - 1)]</Item>
 					</If>
 					<Exec>++pos</Exec>