Ver Fonte

registry: try_get should not create storage

Michele Caini há 2 anos atrás
pai
commit
62a13526c9
2 ficheiros alterados com 18 adições e 2 exclusões
  1. 1 2
      src/entt/entity/registry.hpp
  2. 17 0
      test/entt/entity/registry.cpp

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

@@ -929,8 +929,7 @@ public:
     template<typename... Type>
     [[nodiscard]] auto try_get([[maybe_unused]] const entity_type entt) {
         if constexpr(sizeof...(Type) == 1u) {
-            auto &cpool = assure<std::remove_const_t<Type>...>();
-            return (static_cast<Type *>(cpool.contains(entt) ? std::addressof(cpool.get(entt)) : nullptr), ...);
+            return (const_cast<Type *>(std::as_const(*this).template try_get<Type>(entt)), ...);
         } else {
             return std::make_tuple(try_get<Type>(entt)...);
         }

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

@@ -1893,6 +1893,23 @@ TEST(Registry, GetOrEmplace) {
     ASSERT_EQ(registry.get<int>(entity), 3);
 }
 
+TEST(Registry, TryGet) {
+    entt::registry registry;
+    const auto entity = registry.create();
+
+    ASSERT_EQ(registry.try_get<int>(entity), nullptr);
+    ASSERT_EQ(std::as_const(registry).try_get<int>(entity), nullptr);
+
+    ASSERT_EQ(std::as_const(registry).storage<int>(), nullptr);
+
+    const int &elem = registry.emplace<int>(entity);
+
+    ASSERT_NE(std::as_const(registry).storage<int>(), nullptr);
+
+    ASSERT_EQ(registry.try_get<int>(entity), &elem);
+    ASSERT_EQ(std::as_const(registry).try_get<int>(entity), &elem);
+}
+
 TEST(Registry, Constness) {
     entt::registry registry;