Bläddra i källkod

natvis: compressed_pair

Michele Caini 4 år sedan
förälder
incheckning
f519b55a47
3 ändrade filer med 30 tillägg och 10 borttagningar
  1. 13 1
      natvis/entt/core.natvis
  2. 15 8
      src/entt/core/compressed_pair.hpp
  3. 2 1
      test/entt/core/compressed_pair.cpp

+ 13 - 1
natvis/entt/core.natvis

@@ -1,8 +1,20 @@
 <?xml version="1.0" encoding="utf-8"?>
 <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
-    <Type Name="entt::basic_any&lt;*,*&gt;">
+    <Type Name="entt::basic_any&lt;*&gt;">
 		<DisplayString>{{ type={ info->alias,na }, policy={ mode,en } }}</DisplayString>
     </Type>
+	<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>
+		<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>
+		</Expand>
+	</Type>
 	<Type Name="entt::type_info">
 		<DisplayString>{{ name={ alias,na } }}</DisplayString>
 		<Expand>

+ 15 - 8
src/entt/core/compressed_pair.hpp

@@ -19,6 +19,9 @@ namespace internal {
 
 template<typename Type, std::size_t, typename = void>
 struct compressed_pair_element {
+    using reference = Type &;
+    using const_reference = const Type &;
+
     template<bool Dummy = true, typename = std::enable_if_t<Dummy && std::is_default_constructible_v<Type>>>
     compressed_pair_element()
         : value{} {}
@@ -31,11 +34,11 @@ struct compressed_pair_element {
     compressed_pair_element(std::tuple<Args...> args, std::index_sequence<Index...>)
         : value{std::get<Index>(args)...} {}
 
-    [[nodiscard]] Type &get() ENTT_NOEXCEPT {
+    [[nodiscard]] reference get() ENTT_NOEXCEPT {
         return value;
     }
 
-    [[nodiscard]] const Type &get() const ENTT_NOEXCEPT {
+    [[nodiscard]] const_reference get() const ENTT_NOEXCEPT {
         return value;
     }
 
@@ -45,23 +48,27 @@ private:
 
 template<typename Type, std::size_t Tag>
 struct compressed_pair_element<Type, Tag, std::enable_if_t<is_ebco_eligible_v<Type>>>: Type {
-    template<bool Dummy = true, typename = std::enable_if_t<Dummy && std::is_default_constructible_v<Type>>>
+    using reference = Type &;
+    using const_reference = const Type &;
+    using base_type = Type;
+
+    template<bool Dummy = true, typename = std::enable_if_t<Dummy && std::is_default_constructible_v<base_type>>>
     compressed_pair_element()
-        : Type{} {}
+        : base_type{} {}
 
     template<typename Args, typename = std::enable_if_t<!std::is_same_v<std::remove_const_t<std::remove_reference_t<Args>>, compressed_pair_element>>>
     compressed_pair_element(Args &&args)
-        : Type{std::forward<Args>(args)} {}
+        : base_type{std::forward<Args>(args)} {}
 
     template<typename... Args, std::size_t... Index>
     compressed_pair_element(std::tuple<Args...> args, std::index_sequence<Index...>)
-        : Type{std::get<Index>(args)...} {}
+        : base_type{std::get<Index>(args)...} {}
 
-    [[nodiscard]] Type &get() ENTT_NOEXCEPT {
+    [[nodiscard]] reference get() ENTT_NOEXCEPT {
         return *this;
     }
 
-    [[nodiscard]] const Type &get() const ENTT_NOEXCEPT {
+    [[nodiscard]] const_reference get() const ENTT_NOEXCEPT {
         return *this;
     }
 };

+ 2 - 1
test/entt/core/compressed_pair.cpp

@@ -48,7 +48,8 @@ TEST(CompressedPair, Size) {
     static_assert(sizeof(entt::compressed_pair<int, int>) == sizeof(int[2u]));
     static_assert(sizeof(entt::compressed_pair<empty_type, int>) == sizeof(int));
     static_assert(sizeof(entt::compressed_pair<int, empty_type>) == sizeof(int));
-    static_assert(sizeof(entt::compressed_pair<int, empty_type>) != sizeof(local));
+    static_assert(sizeof(entt::compressed_pair<int, empty_type>) < sizeof(local));
+    static_assert(sizeof(entt::compressed_pair<int, empty_type>) < sizeof(std::pair<int, empty_type>));
 }
 
 TEST(CompressedPair, ConstructCopyMove) {