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

registry: added ::data() to get the list of entities of a registry

Michele Caini 6 лет назад
Родитель
Сommit
986cd03732
2 измененных файлов с 26 добавлено и 4 удалено
  1. 16 0
      src/entt/entity/registry.hpp
  2. 10 4
      test/entt/entity/registry.cpp

+ 16 - 0
src/entt/entity/registry.hpp

@@ -410,6 +410,22 @@ public:
         return assure<Component>().data();
     }
 
+    /**
+     * @brief Direct access to the list of entities of a registry.
+     *
+     * The returned pointer is such that range `[data(), data() + size()]` is
+     * always a valid range, even if the container is empty.
+     *
+     * @warning
+     * This list contains both valid and destroyed entities and isn't suitable
+     * for direct use.
+     *
+     * @return A pointer to the array of entities.
+     */
+    const entity_type * data() const ENTT_NOEXCEPT {
+        return entities.data();
+    }
+
     /**
      * @brief Checks if an entity identifier refers to a valid entity.
      * @param entity An entity identifier, either valid or not.

+ 10 - 4
test/entt/entity/registry.cpp

@@ -267,21 +267,27 @@ TEST(Registry, Identifiers) {
 
 TEST(Registry, RawData) {
     entt::registry registry;
+
+    ASSERT_EQ(std::as_const(registry).data(), nullptr);
+
     const auto entity = registry.create();
 
     ASSERT_EQ(registry.raw<int>(), nullptr);
     ASSERT_EQ(std::as_const(registry).raw<int>(), nullptr);
     ASSERT_EQ(std::as_const(registry).data<int>(), nullptr);
+    ASSERT_EQ(*std::as_const(registry).data(), entity);
 
     registry.assign<int>(entity, 42);
 
-    ASSERT_NE(registry.raw<int>(), nullptr);
-    ASSERT_NE(std::as_const(registry).raw<int>(), nullptr);
-    ASSERT_NE(std::as_const(registry).data<int>(), nullptr);
-
     ASSERT_EQ(*registry.raw<int>(), 42);
     ASSERT_EQ(*std::as_const(registry).raw<int>(), 42);
     ASSERT_EQ(*std::as_const(registry).data<int>(), entity);
+
+    const auto other = registry.create();
+    registry.destroy(entity);
+
+    ASSERT_NE(*std::as_const(registry).data(), entity);
+    ASSERT_EQ(*(std::as_const(registry).data() + 1u), other);
 }
 
 TEST(Registry, CreateManyEntitiesAtOnce) {