|
|
@@ -10,6 +10,13 @@
|
|
|
#include <entt/entity/entity.hpp>
|
|
|
|
|
|
struct empty_type {};
|
|
|
+struct stable_type { int value; };
|
|
|
+
|
|
|
+template<>
|
|
|
+struct entt::component_traits<stable_type> {
|
|
|
+ using in_place_delete = std::true_type;
|
|
|
+ using ignore_if_empty = std::true_type;
|
|
|
+};
|
|
|
|
|
|
struct non_default_constructible {
|
|
|
non_default_constructible(int v): value{v} {}
|
|
|
@@ -524,6 +531,93 @@ TEST(Registry, CreateDestroyCornerCase) {
|
|
|
ASSERT_EQ(registry.current(e1), entt::registry::version_type{1});
|
|
|
}
|
|
|
|
|
|
+TEST(Registry, RangeDestroy) {
|
|
|
+ entt::registry registry;
|
|
|
+ const auto iview = registry.view<int>();
|
|
|
+ const auto icview = registry.view<int, char>();
|
|
|
+
|
|
|
+ const auto e0 = registry.create();
|
|
|
+ const auto e1 = registry.create();
|
|
|
+ const auto e2 = registry.create();
|
|
|
+
|
|
|
+ registry.emplace<int>(e0);
|
|
|
+ registry.emplace<char>(e0);
|
|
|
+ registry.emplace<double>(e0);
|
|
|
+
|
|
|
+ registry.emplace<int>(e1);
|
|
|
+ registry.emplace<char>(e1);
|
|
|
+
|
|
|
+ registry.emplace<int>(e2);
|
|
|
+
|
|
|
+ ASSERT_TRUE(registry.valid(e0));
|
|
|
+ ASSERT_TRUE(registry.valid(e1));
|
|
|
+ ASSERT_TRUE(registry.valid(e2));
|
|
|
+
|
|
|
+ registry.destroy(icview.begin(), icview.end());
|
|
|
+
|
|
|
+ ASSERT_FALSE(registry.valid(e0));
|
|
|
+ ASSERT_FALSE(registry.valid(e1));
|
|
|
+ ASSERT_TRUE(registry.valid(e2));
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.size<int>(), 1u);
|
|
|
+ ASSERT_EQ(registry.size<char>(), 0u);
|
|
|
+ ASSERT_EQ(registry.size<double>(), 0u);
|
|
|
+
|
|
|
+ registry.destroy(iview.begin(), iview.end());
|
|
|
+
|
|
|
+ ASSERT_FALSE(registry.valid(e2));
|
|
|
+ ASSERT_NO_FATAL_FAILURE(registry.destroy(iview.begin(), iview.end()));
|
|
|
+ ASSERT_EQ(iview.size(), 0u);
|
|
|
+ ASSERT_EQ(icview.size_hint(), 0u);
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.size<int>(), 0u);
|
|
|
+ ASSERT_EQ(registry.size<char>(), 0u);
|
|
|
+ ASSERT_EQ(registry.size<double>(), 0u);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(Registry, StableDestroy) {
|
|
|
+ entt::registry registry;
|
|
|
+ const auto iview = registry.view<int>();
|
|
|
+ const auto icview = registry.view<int, stable_type>();
|
|
|
+
|
|
|
+ const auto e0 = registry.create();
|
|
|
+ const auto e1 = registry.create();
|
|
|
+ const auto e2 = registry.create();
|
|
|
+
|
|
|
+ registry.emplace<int>(e0);
|
|
|
+ registry.emplace<stable_type>(e0);
|
|
|
+ registry.emplace<double>(e0);
|
|
|
+
|
|
|
+ registry.emplace<int>(e1);
|
|
|
+ registry.emplace<stable_type>(e1);
|
|
|
+
|
|
|
+ registry.emplace<int>(e2);
|
|
|
+
|
|
|
+ ASSERT_TRUE(registry.valid(e0));
|
|
|
+ ASSERT_TRUE(registry.valid(e1));
|
|
|
+ ASSERT_TRUE(registry.valid(e2));
|
|
|
+
|
|
|
+ registry.destroy(icview.begin(), icview.end());
|
|
|
+
|
|
|
+ ASSERT_FALSE(registry.valid(e0));
|
|
|
+ ASSERT_FALSE(registry.valid(e1));
|
|
|
+ ASSERT_TRUE(registry.valid(e2));
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.size<int>(), 1u);
|
|
|
+ ASSERT_EQ(registry.size<stable_type>(), 2u);
|
|
|
+ ASSERT_EQ(registry.size<double>(), 0u);
|
|
|
+
|
|
|
+ registry.destroy(iview.begin(), iview.end());
|
|
|
+
|
|
|
+ ASSERT_FALSE(registry.valid(e2));
|
|
|
+ ASSERT_EQ(iview.size(), 0u);
|
|
|
+ ASSERT_EQ(icview.size_hint(), 0u);
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.size<int>(), 0u);
|
|
|
+ ASSERT_EQ(registry.size<stable_type>(), 2u);
|
|
|
+ ASSERT_EQ(registry.size<double>(), 0u);
|
|
|
+}
|
|
|
+
|
|
|
TEST(Registry, VersionOverflow) {
|
|
|
using traits_type = entt::entt_traits<entt::entity>;
|
|
|
|
|
|
@@ -1221,40 +1315,6 @@ TEST(Registry, Signals) {
|
|
|
ASSERT_EQ(listener.last, e0);
|
|
|
}
|
|
|
|
|
|
-TEST(Registry, RangeDestroy) {
|
|
|
- entt::registry registry;
|
|
|
- const auto iview = registry.view<int>();
|
|
|
- const auto icview = registry.view<int, char>();
|
|
|
-
|
|
|
- const auto e0 = registry.create();
|
|
|
- const auto e1 = registry.create();
|
|
|
- const auto e2 = registry.create();
|
|
|
-
|
|
|
- registry.emplace<int>(e0);
|
|
|
- registry.emplace<char>(e0);
|
|
|
- registry.emplace<double>(e0);
|
|
|
-
|
|
|
- registry.emplace<int>(e1);
|
|
|
- registry.emplace<char>(e1);
|
|
|
-
|
|
|
- registry.emplace<int>(e2);
|
|
|
-
|
|
|
- ASSERT_TRUE(registry.valid(e0));
|
|
|
- ASSERT_TRUE(registry.valid(e1));
|
|
|
- ASSERT_TRUE(registry.valid(e2));
|
|
|
-
|
|
|
- registry.destroy(icview.begin(), icview.end());
|
|
|
-
|
|
|
- ASSERT_FALSE(registry.valid(e0));
|
|
|
- ASSERT_FALSE(registry.valid(e1));
|
|
|
- ASSERT_TRUE(registry.valid(e2));
|
|
|
-
|
|
|
- registry.destroy(iview.begin(), iview.end());
|
|
|
-
|
|
|
- ASSERT_FALSE(registry.valid(e2));
|
|
|
- ASSERT_NO_FATAL_FAILURE(registry.destroy(iview.begin(), iview.end()));
|
|
|
-}
|
|
|
-
|
|
|
TEST(Registry, Insert) {
|
|
|
entt::registry registry;
|
|
|
|
|
|
@@ -1295,6 +1355,8 @@ TEST(Registry, Insert) {
|
|
|
|
|
|
TEST(Registry, Erase) {
|
|
|
entt::registry registry;
|
|
|
+ const auto iview = registry.view<int>();
|
|
|
+ const auto icview = registry.view<int, char>();
|
|
|
|
|
|
const auto e0 = registry.create();
|
|
|
const auto e1 = registry.create();
|
|
|
@@ -1309,60 +1371,85 @@ TEST(Registry, Erase) {
|
|
|
|
|
|
registry.emplace<int>(e2);
|
|
|
|
|
|
- ASSERT_TRUE(registry.all_of<int>(e0));
|
|
|
+ ASSERT_TRUE(registry.any_of<int>(e0));
|
|
|
ASSERT_TRUE(registry.all_of<int>(e1));
|
|
|
- ASSERT_TRUE(registry.all_of<int>(e2));
|
|
|
+ ASSERT_TRUE(registry.any_of<int>(e2));
|
|
|
|
|
|
- const auto view = registry.view<int, char>();
|
|
|
+ registry.erase<int, char>(e0);
|
|
|
+ registry.erase<int, char>(icview.begin(), icview.end());
|
|
|
+ registry.erase<int, char>(icview.begin(), icview.end());
|
|
|
|
|
|
- registry.erase<int>(e0);
|
|
|
- registry.erase<int>(view.begin(), view.end());
|
|
|
- registry.erase<int>(view.begin(), view.end());
|
|
|
+ ASSERT_FALSE(registry.any_of<int>(e0));
|
|
|
+ ASSERT_FALSE(registry.all_of<int>(e1));
|
|
|
+ ASSERT_TRUE(registry.any_of<int>(e2));
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.size<int>(), 1u);
|
|
|
+ ASSERT_EQ(registry.size<char>(), 0u);
|
|
|
+ ASSERT_EQ(registry.size<double>(), 1u);
|
|
|
+
|
|
|
+ registry.erase<int>(iview.begin(), iview.end());
|
|
|
|
|
|
ASSERT_DEATH(registry.erase<int>(e0), "");
|
|
|
ASSERT_DEATH(registry.erase<int>(e1), "");
|
|
|
|
|
|
- ASSERT_FALSE(registry.all_of<int>(e0));
|
|
|
- ASSERT_FALSE(registry.all_of<int>(e1));
|
|
|
- ASSERT_TRUE(registry.all_of<int>(e2));
|
|
|
+ ASSERT_FALSE(registry.any_of<int>(e2));
|
|
|
+ ASSERT_NO_FATAL_FAILURE(registry.erase<int>(iview.begin(), iview.end()));
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.size<int>(), 0u);
|
|
|
+ ASSERT_EQ(registry.size<char>(), 0u);
|
|
|
+ ASSERT_EQ(registry.size<double>(), 1u);
|
|
|
}
|
|
|
|
|
|
-TEST(Registry, RangeErase) {
|
|
|
+TEST(Registry, StableErase) {
|
|
|
entt::registry registry;
|
|
|
const auto iview = registry.view<int>();
|
|
|
- const auto icview = registry.view<int, char>();
|
|
|
+ const auto icview = registry.view<int, stable_type>();
|
|
|
|
|
|
const auto e0 = registry.create();
|
|
|
const auto e1 = registry.create();
|
|
|
const auto e2 = registry.create();
|
|
|
|
|
|
registry.emplace<int>(e0);
|
|
|
- registry.emplace<char>(e0);
|
|
|
+ registry.emplace<stable_type>(e0);
|
|
|
registry.emplace<double>(e0);
|
|
|
|
|
|
registry.emplace<int>(e1);
|
|
|
- registry.emplace<char>(e1);
|
|
|
+ registry.emplace<stable_type>(e1);
|
|
|
|
|
|
registry.emplace<int>(e2);
|
|
|
|
|
|
ASSERT_TRUE(registry.any_of<int>(e0));
|
|
|
- ASSERT_TRUE(registry.any_of<int>(e1));
|
|
|
+ ASSERT_TRUE(registry.all_of<int>(e1));
|
|
|
ASSERT_TRUE(registry.any_of<int>(e2));
|
|
|
|
|
|
- registry.erase<int, char>(icview.begin(), icview.end());
|
|
|
+ registry.erase<int, stable_type>(e0);
|
|
|
+ registry.erase<int, stable_type>(icview.begin(), icview.end());
|
|
|
+ registry.erase<int, stable_type>(icview.begin(), icview.end());
|
|
|
|
|
|
ASSERT_FALSE(registry.any_of<int>(e0));
|
|
|
- ASSERT_FALSE(registry.any_of<int>(e1));
|
|
|
+ ASSERT_FALSE(registry.all_of<int>(e1));
|
|
|
ASSERT_TRUE(registry.any_of<int>(e2));
|
|
|
|
|
|
+ ASSERT_EQ(registry.size<int>(), 1u);
|
|
|
+ ASSERT_EQ(registry.size<stable_type>(), 2u);
|
|
|
+ ASSERT_EQ(registry.size<double>(), 1u);
|
|
|
+
|
|
|
registry.erase<int>(iview.begin(), iview.end());
|
|
|
|
|
|
+ ASSERT_DEATH(registry.erase<int>(e0), "");
|
|
|
+ ASSERT_DEATH(registry.erase<int>(e1), "");
|
|
|
+
|
|
|
ASSERT_FALSE(registry.any_of<int>(e2));
|
|
|
- ASSERT_NO_FATAL_FAILURE(registry.erase<int>(iview.begin(), iview.end()));
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.size<int>(), 0u);
|
|
|
+ ASSERT_EQ(registry.size<stable_type>(), 2u);
|
|
|
+ ASSERT_EQ(registry.size<double>(), 1u);
|
|
|
}
|
|
|
|
|
|
TEST(Registry, Remove) {
|
|
|
entt::registry registry;
|
|
|
+ const auto iview = registry.view<int>();
|
|
|
+ const auto icview = registry.view<int, char>();
|
|
|
|
|
|
const auto e0 = registry.create();
|
|
|
const auto e1 = registry.create();
|
|
|
@@ -1377,54 +1464,113 @@ TEST(Registry, Remove) {
|
|
|
|
|
|
registry.emplace<int>(e2);
|
|
|
|
|
|
- ASSERT_TRUE(registry.all_of<int>(e0));
|
|
|
+ ASSERT_TRUE(registry.any_of<int>(e0));
|
|
|
ASSERT_TRUE(registry.all_of<int>(e1));
|
|
|
- ASSERT_TRUE(registry.all_of<int>(e2));
|
|
|
+ ASSERT_TRUE(registry.any_of<int>(e2));
|
|
|
|
|
|
- const auto view = registry.view<int, char>();
|
|
|
+ registry.remove<int, char>(e0);
|
|
|
|
|
|
- ASSERT_EQ(registry.remove<int>(e0), 1u);
|
|
|
- ASSERT_EQ(registry.remove<int>(view.begin(), view.end()), 1u);
|
|
|
- ASSERT_EQ(registry.remove<int>(view.begin(), view.end()), 0u);
|
|
|
- ASSERT_EQ(registry.remove<int>(e1), 0u);
|
|
|
+ ASSERT_EQ((registry.remove<int, char>(icview.begin(), icview.end())), 2u);
|
|
|
+ ASSERT_EQ((registry.remove<int, char>(icview.begin(), icview.end())), 0u);
|
|
|
|
|
|
- ASSERT_FALSE(registry.all_of<int>(e0));
|
|
|
+ ASSERT_FALSE(registry.any_of<int>(e0));
|
|
|
ASSERT_FALSE(registry.all_of<int>(e1));
|
|
|
- ASSERT_TRUE(registry.all_of<int>(e2));
|
|
|
+ ASSERT_TRUE(registry.any_of<int>(e2));
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.size<int>(), 1u);
|
|
|
+ ASSERT_EQ(registry.size<char>(), 0u);
|
|
|
+ ASSERT_EQ(registry.size<double>(), 1u);
|
|
|
+
|
|
|
+ ASSERT_EQ((registry.remove<int>(iview.begin(), iview.end())), 1u);
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.remove<int>(e0), 0u);
|
|
|
+ ASSERT_EQ(registry.remove<int>(e1), 0u);
|
|
|
+
|
|
|
+ ASSERT_FALSE(registry.any_of<int>(e2));
|
|
|
+ ASSERT_EQ(registry.remove<int>(iview.begin(), iview.end()), 0u);
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.size<int>(), 0u);
|
|
|
+ ASSERT_EQ(registry.size<char>(), 0u);
|
|
|
+ ASSERT_EQ(registry.size<double>(), 1u);
|
|
|
}
|
|
|
|
|
|
-TEST(Registry, RangeRemove) {
|
|
|
+TEST(Registry, StableRemove) {
|
|
|
entt::registry registry;
|
|
|
const auto iview = registry.view<int>();
|
|
|
- const auto icview = registry.view<int, char>();
|
|
|
+ const auto icview = registry.view<int, stable_type>();
|
|
|
|
|
|
const auto e0 = registry.create();
|
|
|
const auto e1 = registry.create();
|
|
|
const auto e2 = registry.create();
|
|
|
|
|
|
registry.emplace<int>(e0);
|
|
|
- registry.emplace<char>(e0);
|
|
|
+ registry.emplace<stable_type>(e0);
|
|
|
registry.emplace<double>(e0);
|
|
|
|
|
|
registry.emplace<int>(e1);
|
|
|
- registry.emplace<char>(e1);
|
|
|
+ registry.emplace<stable_type>(e1);
|
|
|
|
|
|
registry.emplace<int>(e2);
|
|
|
|
|
|
ASSERT_TRUE(registry.any_of<int>(e0));
|
|
|
- ASSERT_TRUE(registry.any_of<int>(e1));
|
|
|
+ ASSERT_TRUE(registry.all_of<int>(e1));
|
|
|
ASSERT_TRUE(registry.any_of<int>(e2));
|
|
|
|
|
|
- registry.remove<int, char>(icview.begin(), icview.end());
|
|
|
+ registry.remove<int, stable_type>(e0);
|
|
|
+
|
|
|
+ ASSERT_EQ((registry.remove<int, stable_type>(icview.begin(), icview.end())), 2u);
|
|
|
+ ASSERT_EQ((registry.remove<int, stable_type>(icview.begin(), icview.end())), 0u);
|
|
|
|
|
|
ASSERT_FALSE(registry.any_of<int>(e0));
|
|
|
- ASSERT_FALSE(registry.any_of<int>(e1));
|
|
|
+ ASSERT_FALSE(registry.all_of<int>(e1));
|
|
|
ASSERT_TRUE(registry.any_of<int>(e2));
|
|
|
|
|
|
- registry.remove<int>(iview.begin(), iview.end());
|
|
|
+ ASSERT_EQ(registry.size<int>(), 1u);
|
|
|
+ ASSERT_EQ(registry.size<stable_type>(), 2u);
|
|
|
+ ASSERT_EQ(registry.size<double>(), 1u);
|
|
|
+
|
|
|
+ ASSERT_EQ((registry.remove<int>(iview.begin(), iview.end())), 1u);
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.remove<int>(e0), 0u);
|
|
|
+ ASSERT_EQ(registry.remove<int>(e1), 0u);
|
|
|
|
|
|
ASSERT_FALSE(registry.any_of<int>(e2));
|
|
|
- ASSERT_EQ(registry.remove<int>(iview.begin(), iview.end()), 0u);
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.size<int>(), 0u);
|
|
|
+ ASSERT_EQ(registry.size<stable_type>(), 2u);
|
|
|
+ ASSERT_EQ(registry.size<double>(), 1u);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(Registry, Compact) {
|
|
|
+ entt::registry registry;
|
|
|
+
|
|
|
+ const auto e0 = registry.create();
|
|
|
+ const auto e1 = registry.create();
|
|
|
+
|
|
|
+ registry.emplace<int>(e0);
|
|
|
+ registry.emplace<stable_type>(e0);
|
|
|
+
|
|
|
+ registry.emplace<int>(e1);
|
|
|
+ registry.emplace<stable_type>(e1);
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.size<int>(), 2u);
|
|
|
+ ASSERT_EQ(registry.size<stable_type>(), 2u);
|
|
|
+
|
|
|
+ registry.destroy(e0);
|
|
|
+ registry.destroy(e1);
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.size<int>(), 0u);
|
|
|
+ ASSERT_EQ(registry.size<stable_type>(), 2u);
|
|
|
+
|
|
|
+ registry.compact<int>();
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.size<int>(), 0u);
|
|
|
+ ASSERT_EQ(registry.size<stable_type>(), 2u);
|
|
|
+
|
|
|
+ registry.compact();
|
|
|
+
|
|
|
+ ASSERT_EQ(registry.size<int>(), 0u);
|
|
|
+ ASSERT_EQ(registry.size<stable_type>(), 0u);
|
|
|
}
|
|
|
|
|
|
TEST(Registry, NonOwningGroupInterleaved) {
|