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

registry: make it work with storage<void> also in C++17

Michele Caini 3 лет назад
Родитель
Сommit
6316b60451
2 измененных файлов с 25 добавлено и 1 удалено
  1. 9 1
      src/entt/entity/registry.hpp
  2. 16 0
      test/entt/entity/registry.cpp

+ 9 - 1
src/entt/entity/registry.hpp

@@ -304,7 +304,15 @@ class basic_registry {
         auto &cpool = pools[id];
         auto &cpool = pools[id];
 
 
         if(!cpool) {
         if(!cpool) {
-            cpool = std::allocate_shared<storage_for_type<std::remove_const_t<Type>>>(get_allocator(), get_allocator());
+            using alloc_type = storage_for_type<std::remove_const_t<Type>>::allocator_type;
+
+            if constexpr(std::is_same_v<Type, void> && !std::is_constructible_v<alloc_type, allocator_type>) {
+                // std::allocator<void> has no cross constructors (waiting for C++20)
+                cpool = std::allocate_shared<storage_for_type<std::remove_const_t<Type>>>(get_allocator(), alloc_type{});
+            } else {
+                cpool = std::allocate_shared<storage_for_type<std::remove_const_t<Type>>>(get_allocator(), get_allocator());
+            }
+
             cpool->bind(forward_as_any(*this));
             cpool->bind(forward_as_any(*this));
         }
         }
 
 

+ 16 - 0
test/entt/entity/registry.cpp

@@ -2092,6 +2092,22 @@ TEST(Registry, Storage) {
     }
     }
 }
 }
 
 
+TEST(Registry, VoidType) {
+    using namespace entt::literals;
+
+    entt::registry registry;
+    const auto entity = registry.create();
+    auto &storage = registry.storage<void>("custom"_hs);
+    storage.emplace(entity);
+
+    ASSERT_TRUE(registry.storage<void>().empty());
+    ASSERT_FALSE(registry.storage<void>("custom"_hs).empty());
+    ASSERT_TRUE(registry.storage<void>("custom"_hs).contains(entity));
+
+    ASSERT_EQ(registry.storage<void>().type(), entt::type_id<void>());
+    ASSERT_EQ(registry.storage<void>("custom"_hs).type(), entt::type_id<void>());
+}
+
 TEST(Registry, RegistryStorageIterator) {
 TEST(Registry, RegistryStorageIterator) {
     entt::registry registry;
     entt::registry registry;
     const auto entity = registry.create();
     const auto entity = registry.create();