|
|
@@ -11,6 +11,8 @@ TEST(NonOwningGroup, Functionalities) {
|
|
|
auto cgroup = std::as_const(registry).group<>(entt::get<const int, const char>);
|
|
|
|
|
|
ASSERT_TRUE(group.empty());
|
|
|
+ ASSERT_TRUE(group.empty<int>());
|
|
|
+ ASSERT_TRUE(cgroup.empty<const char>());
|
|
|
|
|
|
const auto e0 = registry.create();
|
|
|
registry.assign<char>(e0);
|
|
|
@@ -20,20 +22,28 @@ TEST(NonOwningGroup, Functionalities) {
|
|
|
registry.assign<char>(e1);
|
|
|
|
|
|
ASSERT_FALSE(group.empty());
|
|
|
+ ASSERT_FALSE(group.empty<int>());
|
|
|
+ ASSERT_FALSE(cgroup.empty<const char>());
|
|
|
ASSERT_NO_THROW((group.begin()++));
|
|
|
ASSERT_NO_THROW((++cgroup.begin()));
|
|
|
|
|
|
ASSERT_NE(group.begin(), group.end());
|
|
|
ASSERT_NE(cgroup.begin(), cgroup.end());
|
|
|
ASSERT_EQ(group.size(), typename decltype(group)::size_type{1});
|
|
|
+ ASSERT_EQ(group.size<int>(), typename decltype(group)::size_type{1});
|
|
|
+ ASSERT_EQ(cgroup.size<const char>(), typename decltype(group)::size_type{2});
|
|
|
|
|
|
registry.assign<int>(e0);
|
|
|
|
|
|
ASSERT_EQ(group.size(), typename decltype(group)::size_type{2});
|
|
|
+ ASSERT_EQ(group.size<int>(), typename decltype(group)::size_type{2});
|
|
|
+ ASSERT_EQ(cgroup.size<const char>(), typename decltype(group)::size_type{2});
|
|
|
|
|
|
registry.remove<int>(e0);
|
|
|
|
|
|
ASSERT_EQ(group.size(), typename decltype(group)::size_type{1});
|
|
|
+ ASSERT_EQ(group.size<int>(), typename decltype(group)::size_type{1});
|
|
|
+ ASSERT_EQ(cgroup.size<const char>(), typename decltype(group)::size_type{2});
|
|
|
|
|
|
registry.get<char>(e0) = '1';
|
|
|
registry.get<char>(e1) = '2';
|
|
|
@@ -47,58 +57,13 @@ TEST(NonOwningGroup, Functionalities) {
|
|
|
|
|
|
ASSERT_EQ(*(group.data() + 0), e1);
|
|
|
|
|
|
- registry.remove<char>(e0);
|
|
|
- registry.remove<char>(e1);
|
|
|
-
|
|
|
- ASSERT_EQ(group.begin(), group.end());
|
|
|
- ASSERT_EQ(cgroup.begin(), cgroup.end());
|
|
|
- ASSERT_TRUE(group.empty());
|
|
|
-}
|
|
|
-
|
|
|
-TEST(OwningGroup, Functionalities) {
|
|
|
- entt::registry registry;
|
|
|
- auto group = registry.group<int>(entt::get<char>);
|
|
|
- auto cgroup = std::as_const(registry).group<const int>(entt::get<const char>);
|
|
|
-
|
|
|
- ASSERT_TRUE(group.empty());
|
|
|
-
|
|
|
- const auto e0 = registry.create();
|
|
|
- registry.assign<char>(e0);
|
|
|
-
|
|
|
- const auto e1 = registry.create();
|
|
|
- registry.assign<int>(e1);
|
|
|
- registry.assign<char>(e1);
|
|
|
-
|
|
|
- ASSERT_FALSE(group.empty());
|
|
|
- ASSERT_NO_THROW((group.begin()++));
|
|
|
- ASSERT_NO_THROW((++cgroup.begin()));
|
|
|
-
|
|
|
- ASSERT_NE(group.begin(), group.end());
|
|
|
- ASSERT_NE(cgroup.begin(), cgroup.end());
|
|
|
- ASSERT_EQ(group.size(), typename decltype(group)::size_type{1});
|
|
|
-
|
|
|
- registry.assign<int>(e0);
|
|
|
-
|
|
|
- ASSERT_EQ(group.size(), typename decltype(group)::size_type{2});
|
|
|
-
|
|
|
- registry.remove<int>(e0);
|
|
|
-
|
|
|
- ASSERT_EQ(group.size(), typename decltype(group)::size_type{1});
|
|
|
-
|
|
|
- registry.get<char>(e0) = '1';
|
|
|
- registry.get<char>(e1) = '2';
|
|
|
- registry.get<int>(e1) = 42;
|
|
|
+ ASSERT_EQ(*(group.data<int>() + 0), e1);
|
|
|
+ ASSERT_EQ(*(group.data<char>() + 0), e0);
|
|
|
+ ASSERT_EQ(*(cgroup.data<const char>() + 1), e1);
|
|
|
|
|
|
- ASSERT_EQ(*(cgroup.raw<const int>() + 0), 42);
|
|
|
ASSERT_EQ(*(group.raw<int>() + 0), 42);
|
|
|
-
|
|
|
- for(auto entity: group) {
|
|
|
- ASSERT_EQ(std::get<0>(cgroup.get<const int, const char>(entity)), 42);
|
|
|
- ASSERT_EQ(std::get<1>(group.get<int, char>(entity)), '2');
|
|
|
- ASSERT_EQ(cgroup.get<const char>(entity), '2');
|
|
|
- }
|
|
|
-
|
|
|
- ASSERT_EQ(*(group.data() + 0), e1);
|
|
|
+ ASSERT_EQ(*(group.raw<char>() + 0), '1');
|
|
|
+ ASSERT_EQ(*(cgroup.raw<const char>() + 1), '2');
|
|
|
|
|
|
registry.remove<char>(e0);
|
|
|
registry.remove<char>(e1);
|
|
|
@@ -127,25 +92,6 @@ TEST(NonOwningGroup, ElementAccess) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-TEST(OwningGroup, ElementAccess) {
|
|
|
- entt::registry registry;
|
|
|
- auto group = registry.group<int>(entt::get<char>);
|
|
|
- auto cgroup = std::as_const(registry).group<const int>(entt::get<const char>);
|
|
|
-
|
|
|
- const auto e0 = registry.create();
|
|
|
- registry.assign<int>(e0);
|
|
|
- registry.assign<char>(e0);
|
|
|
-
|
|
|
- const auto e1 = registry.create();
|
|
|
- registry.assign<int>(e1);
|
|
|
- registry.assign<char>(e1);
|
|
|
-
|
|
|
- for(typename decltype(group)::size_type i{}; i < group.size(); ++i) {
|
|
|
- ASSERT_EQ(group[i], i ? e0 : e1);
|
|
|
- ASSERT_EQ(cgroup[i], i ? e0 : e1);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
TEST(NonOwningGroup, Contains) {
|
|
|
entt::registry registry;
|
|
|
auto group = registry.group<>(entt::get<int, char>);
|
|
|
@@ -164,24 +110,6 @@ TEST(NonOwningGroup, Contains) {
|
|
|
ASSERT_TRUE(group.contains(e1));
|
|
|
}
|
|
|
|
|
|
-TEST(OwningGroup, Contains) {
|
|
|
- entt::registry registry;
|
|
|
- auto group = registry.group<int>(entt::get<char>);
|
|
|
-
|
|
|
- const auto e0 = registry.create();
|
|
|
- registry.assign<int>(e0);
|
|
|
- registry.assign<char>(e0);
|
|
|
-
|
|
|
- const auto e1 = registry.create();
|
|
|
- registry.assign<int>(e1);
|
|
|
- registry.assign<char>(e1);
|
|
|
-
|
|
|
- registry.destroy(e0);
|
|
|
-
|
|
|
- ASSERT_FALSE(group.contains(e0));
|
|
|
- ASSERT_TRUE(group.contains(e1));
|
|
|
-}
|
|
|
-
|
|
|
TEST(NonOwningGroup, Empty) {
|
|
|
entt::registry registry;
|
|
|
|
|
|
@@ -205,29 +133,6 @@ TEST(NonOwningGroup, Empty) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-TEST(OwningGroup, Empty) {
|
|
|
- entt::registry registry;
|
|
|
-
|
|
|
- const auto e0 = registry.create();
|
|
|
- registry.assign<double>(e0);
|
|
|
- registry.assign<int>(e0);
|
|
|
- registry.assign<float>(e0);
|
|
|
-
|
|
|
- const auto e1 = registry.create();
|
|
|
- registry.assign<char>(e1);
|
|
|
- registry.assign<float>(e1);
|
|
|
-
|
|
|
- for(auto entity: registry.group<char, int>(entt::get<float>)) {
|
|
|
- (void)entity;
|
|
|
- FAIL();
|
|
|
- }
|
|
|
-
|
|
|
- for(auto entity: registry.group<double, float>(entt::get<char, int>)) {
|
|
|
- (void)entity;
|
|
|
- FAIL();
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
TEST(NonOwningGroup, Each) {
|
|
|
entt::registry registry;
|
|
|
auto group = registry.group<>(entt::get<int, char>);
|
|
|
@@ -254,32 +159,6 @@ TEST(NonOwningGroup, Each) {
|
|
|
ASSERT_EQ(cnt, std::size_t{0});
|
|
|
}
|
|
|
|
|
|
-TEST(OwningGroup, Each) {
|
|
|
- entt::registry registry;
|
|
|
- auto group = registry.group<int>(entt::get<char>);
|
|
|
-
|
|
|
- const auto e0 = registry.create();
|
|
|
- registry.assign<int>(e0);
|
|
|
- registry.assign<char>(e0);
|
|
|
-
|
|
|
- const auto e1 = registry.create();
|
|
|
- registry.assign<int>(e1);
|
|
|
- registry.assign<char>(e1);
|
|
|
-
|
|
|
- auto cgroup = std::as_const(registry).group<const int>(entt::get<const char>);
|
|
|
- std::size_t cnt = 0;
|
|
|
-
|
|
|
- group.each([&cnt](auto, int &, char &) { ++cnt; });
|
|
|
- group.each([&cnt](int &, char &) { ++cnt; });
|
|
|
-
|
|
|
- ASSERT_EQ(cnt, std::size_t{4});
|
|
|
-
|
|
|
- cgroup.each([&cnt](auto, const int &, const char &) { --cnt; });
|
|
|
- cgroup.each([&cnt](const int &, const char &) { --cnt; });
|
|
|
-
|
|
|
- ASSERT_EQ(cnt, std::size_t{0});
|
|
|
-}
|
|
|
-
|
|
|
TEST(NonOwningGroup, Sort) {
|
|
|
entt::registry registry;
|
|
|
auto group = registry.group<>(entt::get<const int, unsigned int>);
|
|
|
@@ -341,34 +220,6 @@ TEST(NonOwningGroup, IndexRebuiltOnDestroy) {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
-TEST(OwningGroup, IndexRebuiltOnDestroy) {
|
|
|
- entt::registry registry;
|
|
|
- auto group = registry.group<int>(entt::get<unsigned int>);
|
|
|
-
|
|
|
- const auto e0 = registry.create();
|
|
|
- const auto e1 = registry.create();
|
|
|
-
|
|
|
- registry.assign<unsigned int>(e0, 0u);
|
|
|
- registry.assign<unsigned int>(e1, 1u);
|
|
|
-
|
|
|
- registry.assign<int>(e0, 0);
|
|
|
- registry.assign<int>(e1, 1);
|
|
|
-
|
|
|
- registry.destroy(e0);
|
|
|
- registry.assign<int>(registry.create(), 42);
|
|
|
-
|
|
|
- ASSERT_EQ(group.size(), typename decltype(group)::size_type{1});
|
|
|
- ASSERT_EQ(group[{}], e1);
|
|
|
- ASSERT_EQ(group.get<int>(e1), 1);
|
|
|
- ASSERT_EQ(group.get<unsigned int>(e1), 1u);
|
|
|
-
|
|
|
- group.each([e1](auto entity, auto ivalue, auto uivalue) {
|
|
|
- ASSERT_EQ(entity, e1);
|
|
|
- ASSERT_EQ(ivalue, 1);
|
|
|
- ASSERT_EQ(uivalue, 1u);
|
|
|
- });
|
|
|
-}
|
|
|
-
|
|
|
TEST(NonOwningGroup, ConstNonConstAndAllInBetween) {
|
|
|
entt::registry registry;
|
|
|
auto group = registry.group<>(entt::get<int, const char>);
|
|
|
@@ -386,6 +237,8 @@ TEST(NonOwningGroup, ConstNonConstAndAllInBetween) {
|
|
|
ASSERT_TRUE((std::is_same_v<decltype(group.get<const char>(0)), const char &>));
|
|
|
ASSERT_TRUE((std::is_same_v<decltype(group.get<int, const char>(0)), std::tuple<int &, const char &>>));
|
|
|
ASSERT_TRUE((std::is_same_v<decltype(group.get<const int, const char>(0)), std::tuple<const int &, const char &>>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(group.raw<const char>()), const char *>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(group.raw<int>()), int *>));
|
|
|
|
|
|
group.each([](auto, auto &&i, auto &&c) {
|
|
|
ASSERT_TRUE((std::is_same_v<decltype(i), int &>));
|
|
|
@@ -393,37 +246,6 @@ TEST(NonOwningGroup, ConstNonConstAndAllInBetween) {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
-TEST(OwningGroup, ConstNonConstAndAllInBetween) {
|
|
|
- entt::registry registry;
|
|
|
- auto group = registry.group<int, const char>(entt::get<double, const float>);
|
|
|
-
|
|
|
- ASSERT_EQ(group.size(), decltype(group.size()){0});
|
|
|
-
|
|
|
- const auto entity = registry.create();
|
|
|
- registry.assign<int>(entity, 0);
|
|
|
- registry.assign<char>(entity, 'c');
|
|
|
- registry.assign<double>(entity, 0.);
|
|
|
- registry.assign<float>(entity, 0.f);
|
|
|
-
|
|
|
- ASSERT_EQ(group.size(), decltype(group.size()){1});
|
|
|
-
|
|
|
- ASSERT_TRUE((std::is_same_v<decltype(group.get<int>(0)), int &>));
|
|
|
- ASSERT_TRUE((std::is_same_v<decltype(group.get<const int>(0)), const int &>));
|
|
|
- ASSERT_TRUE((std::is_same_v<decltype(group.get<const char>(0)), const char &>));
|
|
|
- ASSERT_TRUE((std::is_same_v<decltype(group.get<double>(0)), double &>));
|
|
|
- ASSERT_TRUE((std::is_same_v<decltype(group.get<const double>(0)), const double &>));
|
|
|
- ASSERT_TRUE((std::is_same_v<decltype(group.get<const float>(0)), const float &>));
|
|
|
- ASSERT_TRUE((std::is_same_v<decltype(group.get<int, const char, double, const float>(0)), std::tuple<int &, const char &, double &, const float &>>));
|
|
|
- ASSERT_TRUE((std::is_same_v<decltype(group.get<const int, const char, const double, const float>(0)), std::tuple<const int &, const char &, const double &, const float &>>));
|
|
|
-
|
|
|
- group.each([](auto, auto &&i, auto &&c, auto &&d, auto &&f) {
|
|
|
- ASSERT_TRUE((std::is_same_v<decltype(i), int &>));
|
|
|
- ASSERT_TRUE((std::is_same_v<decltype(c), const char &>));
|
|
|
- ASSERT_TRUE((std::is_same_v<decltype(d), double &>));
|
|
|
- ASSERT_TRUE((std::is_same_v<decltype(f), const float &>));
|
|
|
- });
|
|
|
-}
|
|
|
-
|
|
|
TEST(NonOwningGroup, Find) {
|
|
|
entt::registry registry;
|
|
|
auto group = registry.group<>(entt::get<int, const char>);
|
|
|
@@ -469,51 +291,6 @@ TEST(NonOwningGroup, Find) {
|
|
|
ASSERT_EQ(group.find(e4), group.end());
|
|
|
}
|
|
|
|
|
|
-TEST(OwningGroup, Find) {
|
|
|
- entt::registry registry;
|
|
|
- auto group = registry.group<int>(entt::get<const char>);
|
|
|
-
|
|
|
- const auto e0 = registry.create();
|
|
|
- registry.assign<int>(e0);
|
|
|
- registry.assign<char>(e0);
|
|
|
-
|
|
|
- const auto e1 = registry.create();
|
|
|
- registry.assign<int>(e1);
|
|
|
- registry.assign<char>(e1);
|
|
|
-
|
|
|
- const auto e2 = registry.create();
|
|
|
- registry.assign<int>(e2);
|
|
|
- registry.assign<char>(e2);
|
|
|
-
|
|
|
- const auto e3 = registry.create();
|
|
|
- registry.assign<int>(e3);
|
|
|
- registry.assign<char>(e3);
|
|
|
-
|
|
|
- registry.remove<int>(e1);
|
|
|
-
|
|
|
- ASSERT_NE(group.find(e0), group.end());
|
|
|
- ASSERT_EQ(group.find(e1), group.end());
|
|
|
- ASSERT_NE(group.find(e2), group.end());
|
|
|
- ASSERT_NE(group.find(e3), group.end());
|
|
|
-
|
|
|
- auto it = group.find(e2);
|
|
|
-
|
|
|
- ASSERT_EQ(*it, e2);
|
|
|
- ASSERT_EQ(*(++it), e3);
|
|
|
- ASSERT_EQ(*(++it), e0);
|
|
|
- ASSERT_EQ(++it, group.end());
|
|
|
- ASSERT_EQ(++group.find(e0), group.end());
|
|
|
-
|
|
|
- const auto e4 = registry.create();
|
|
|
- registry.destroy(e4);
|
|
|
- const auto e5 = registry.create();
|
|
|
- registry.assign<int>(e5);
|
|
|
- registry.assign<char>(e5);
|
|
|
-
|
|
|
- ASSERT_NE(group.find(e5), group.end());
|
|
|
- ASSERT_EQ(group.find(e4), group.end());
|
|
|
-}
|
|
|
-
|
|
|
TEST(NonOwningGroup, ExcludedComponents) {
|
|
|
entt::registry registry;
|
|
|
|
|
|
@@ -562,20 +339,330 @@ TEST(NonOwningGroup, ExcludedComponents) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-TEST(OwningGroup, ExcludedComponents) {
|
|
|
+TEST(NonOwningGroup, EmptyAndNonEmptyTypes) {
|
|
|
+ struct empty_type {};
|
|
|
entt::registry registry;
|
|
|
+ const auto group = registry.group<>(entt::get<int, empty_type>);
|
|
|
|
|
|
const auto e0 = registry.create();
|
|
|
- registry.assign<int>(e0, 0);
|
|
|
+ registry.assign<empty_type>(e0);
|
|
|
+ registry.assign<int>(e0);
|
|
|
|
|
|
const auto e1 = registry.create();
|
|
|
- registry.assign<int>(e1, 1);
|
|
|
- registry.assign<char>(e1);
|
|
|
-
|
|
|
- const auto group = registry.group<int>(entt::exclude<char>);
|
|
|
+ registry.assign<empty_type>(e1);
|
|
|
+ registry.assign<int>(e1);
|
|
|
|
|
|
- const auto e2 = registry.create();
|
|
|
- registry.assign<int>(e2, 2);
|
|
|
+ registry.assign<int>(registry.create());
|
|
|
+
|
|
|
+ for(const auto entity: group) {
|
|
|
+ ASSERT_TRUE(entity == e0 || entity == e1);
|
|
|
+ }
|
|
|
+
|
|
|
+ group.each([e0, e1](const auto entity, const int &, const empty_type &) {
|
|
|
+ ASSERT_TRUE(entity == e0 || entity == e1);
|
|
|
+ });
|
|
|
+
|
|
|
+ ASSERT_EQ(group.size(), typename decltype(group)::size_type{2});
|
|
|
+ ASSERT_EQ(&group.get<empty_type>(e0), &group.get<empty_type>(e1));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(NonOwningGroup, TrackEntitiesOnComponentDestruction) {
|
|
|
+ entt::registry registry;
|
|
|
+ const auto group = registry.group<>(entt::get<int>, entt::exclude<char>);
|
|
|
+ const auto cgroup = std::as_const(registry).group<>(entt::get<const int>, entt::exclude<char>);
|
|
|
+
|
|
|
+ const auto entity = registry.create();
|
|
|
+ registry.assign<int>(entity);
|
|
|
+ registry.assign<char>(entity);
|
|
|
+
|
|
|
+ ASSERT_TRUE(group.empty());
|
|
|
+ ASSERT_TRUE(cgroup.empty());
|
|
|
+
|
|
|
+ registry.remove<char>(entity);
|
|
|
+
|
|
|
+ ASSERT_FALSE(group.empty());
|
|
|
+ ASSERT_FALSE(cgroup.empty());
|
|
|
+}
|
|
|
+
|
|
|
+TEST(OwningGroup, Functionalities) {
|
|
|
+ entt::registry registry;
|
|
|
+ auto group = registry.group<int>(entt::get<char>);
|
|
|
+ auto cgroup = std::as_const(registry).group<const int>(entt::get<const char>);
|
|
|
+
|
|
|
+ ASSERT_TRUE(group.empty());
|
|
|
+ ASSERT_TRUE(group.empty<int>());
|
|
|
+ ASSERT_TRUE(cgroup.empty<const char>());
|
|
|
+
|
|
|
+ const auto e0 = registry.create();
|
|
|
+ registry.assign<char>(e0);
|
|
|
+
|
|
|
+ const auto e1 = registry.create();
|
|
|
+ registry.assign<int>(e1);
|
|
|
+ registry.assign<char>(e1);
|
|
|
+
|
|
|
+ ASSERT_FALSE(group.empty());
|
|
|
+ ASSERT_FALSE(group.empty<int>());
|
|
|
+ ASSERT_FALSE(cgroup.empty<const char>());
|
|
|
+ ASSERT_NO_THROW((group.begin()++));
|
|
|
+ ASSERT_NO_THROW((++cgroup.begin()));
|
|
|
+
|
|
|
+ ASSERT_NE(group.begin(), group.end());
|
|
|
+ ASSERT_NE(cgroup.begin(), cgroup.end());
|
|
|
+ ASSERT_EQ(group.size(), typename decltype(group)::size_type{1});
|
|
|
+ ASSERT_EQ(group.size<int>(), typename decltype(group)::size_type{1});
|
|
|
+ ASSERT_EQ(cgroup.size<const char>(), typename decltype(group)::size_type{2});
|
|
|
+
|
|
|
+ registry.assign<int>(e0);
|
|
|
+
|
|
|
+ ASSERT_EQ(group.size(), typename decltype(group)::size_type{2});
|
|
|
+ ASSERT_EQ(group.size<int>(), typename decltype(group)::size_type{2});
|
|
|
+ ASSERT_EQ(cgroup.size<const char>(), typename decltype(group)::size_type{2});
|
|
|
+
|
|
|
+ registry.remove<int>(e0);
|
|
|
+
|
|
|
+ ASSERT_EQ(group.size(), typename decltype(group)::size_type{1});
|
|
|
+ ASSERT_EQ(group.size<int>(), typename decltype(group)::size_type{1});
|
|
|
+ ASSERT_EQ(cgroup.size<const char>(), typename decltype(group)::size_type{2});
|
|
|
+
|
|
|
+ registry.get<char>(e0) = '1';
|
|
|
+ registry.get<char>(e1) = '2';
|
|
|
+ registry.get<int>(e1) = 42;
|
|
|
+
|
|
|
+ ASSERT_EQ(*(cgroup.raw<const int>() + 0), 42);
|
|
|
+ ASSERT_EQ(*(group.raw<int>() + 0), 42);
|
|
|
+
|
|
|
+ for(auto entity: group) {
|
|
|
+ ASSERT_EQ(std::get<0>(cgroup.get<const int, const char>(entity)), 42);
|
|
|
+ ASSERT_EQ(std::get<1>(group.get<int, char>(entity)), '2');
|
|
|
+ ASSERT_EQ(cgroup.get<const char>(entity), '2');
|
|
|
+ }
|
|
|
+
|
|
|
+ ASSERT_EQ(*(group.data() + 0), e1);
|
|
|
+
|
|
|
+ ASSERT_EQ(*(group.data<int>() + 0), e1);
|
|
|
+ ASSERT_EQ(*(group.data<char>() + 0), e0);
|
|
|
+ ASSERT_EQ(*(cgroup.data<const char>() + 1), e1);
|
|
|
+
|
|
|
+ ASSERT_EQ(*(group.raw<int>() + 0), 42);
|
|
|
+ ASSERT_EQ(*(group.raw<char>() + 0), '1');
|
|
|
+ ASSERT_EQ(*(cgroup.raw<const char>() + 1), '2');
|
|
|
+
|
|
|
+ registry.remove<char>(e0);
|
|
|
+ registry.remove<char>(e1);
|
|
|
+
|
|
|
+ ASSERT_EQ(group.begin(), group.end());
|
|
|
+ ASSERT_EQ(cgroup.begin(), cgroup.end());
|
|
|
+ ASSERT_TRUE(group.empty());
|
|
|
+}
|
|
|
+
|
|
|
+TEST(OwningGroup, ElementAccess) {
|
|
|
+ entt::registry registry;
|
|
|
+ auto group = registry.group<int>(entt::get<char>);
|
|
|
+ auto cgroup = std::as_const(registry).group<const int>(entt::get<const char>);
|
|
|
+
|
|
|
+ const auto e0 = registry.create();
|
|
|
+ registry.assign<int>(e0);
|
|
|
+ registry.assign<char>(e0);
|
|
|
+
|
|
|
+ const auto e1 = registry.create();
|
|
|
+ registry.assign<int>(e1);
|
|
|
+ registry.assign<char>(e1);
|
|
|
+
|
|
|
+ for(typename decltype(group)::size_type i{}; i < group.size(); ++i) {
|
|
|
+ ASSERT_EQ(group[i], i ? e0 : e1);
|
|
|
+ ASSERT_EQ(cgroup[i], i ? e0 : e1);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+TEST(OwningGroup, Contains) {
|
|
|
+ entt::registry registry;
|
|
|
+ auto group = registry.group<int>(entt::get<char>);
|
|
|
+
|
|
|
+ const auto e0 = registry.create();
|
|
|
+ registry.assign<int>(e0);
|
|
|
+ registry.assign<char>(e0);
|
|
|
+
|
|
|
+ const auto e1 = registry.create();
|
|
|
+ registry.assign<int>(e1);
|
|
|
+ registry.assign<char>(e1);
|
|
|
+
|
|
|
+ registry.destroy(e0);
|
|
|
+
|
|
|
+ ASSERT_FALSE(group.contains(e0));
|
|
|
+ ASSERT_TRUE(group.contains(e1));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(OwningGroup, Empty) {
|
|
|
+ entt::registry registry;
|
|
|
+
|
|
|
+ const auto e0 = registry.create();
|
|
|
+ registry.assign<double>(e0);
|
|
|
+ registry.assign<int>(e0);
|
|
|
+ registry.assign<float>(e0);
|
|
|
+
|
|
|
+ const auto e1 = registry.create();
|
|
|
+ registry.assign<char>(e1);
|
|
|
+ registry.assign<float>(e1);
|
|
|
+
|
|
|
+ for(auto entity: registry.group<char, int>(entt::get<float>)) {
|
|
|
+ (void)entity;
|
|
|
+ FAIL();
|
|
|
+ }
|
|
|
+
|
|
|
+ for(auto entity: registry.group<double, float>(entt::get<char, int>)) {
|
|
|
+ (void)entity;
|
|
|
+ FAIL();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+TEST(OwningGroup, Each) {
|
|
|
+ entt::registry registry;
|
|
|
+ auto group = registry.group<int>(entt::get<char>);
|
|
|
+
|
|
|
+ const auto e0 = registry.create();
|
|
|
+ registry.assign<int>(e0);
|
|
|
+ registry.assign<char>(e0);
|
|
|
+
|
|
|
+ const auto e1 = registry.create();
|
|
|
+ registry.assign<int>(e1);
|
|
|
+ registry.assign<char>(e1);
|
|
|
+
|
|
|
+ auto cgroup = std::as_const(registry).group<const int>(entt::get<const char>);
|
|
|
+ std::size_t cnt = 0;
|
|
|
+
|
|
|
+ group.each([&cnt](auto, int &, char &) { ++cnt; });
|
|
|
+ group.each([&cnt](int &, char &) { ++cnt; });
|
|
|
+
|
|
|
+ ASSERT_EQ(cnt, std::size_t{4});
|
|
|
+
|
|
|
+ cgroup.each([&cnt](auto, const int &, const char &) { --cnt; });
|
|
|
+ cgroup.each([&cnt](const int &, const char &) { --cnt; });
|
|
|
+
|
|
|
+ ASSERT_EQ(cnt, std::size_t{0});
|
|
|
+}
|
|
|
+
|
|
|
+TEST(OwningGroup, IndexRebuiltOnDestroy) {
|
|
|
+ entt::registry registry;
|
|
|
+ auto group = registry.group<int>(entt::get<unsigned int>);
|
|
|
+
|
|
|
+ const auto e0 = registry.create();
|
|
|
+ const auto e1 = registry.create();
|
|
|
+
|
|
|
+ registry.assign<unsigned int>(e0, 0u);
|
|
|
+ registry.assign<unsigned int>(e1, 1u);
|
|
|
+
|
|
|
+ registry.assign<int>(e0, 0);
|
|
|
+ registry.assign<int>(e1, 1);
|
|
|
+
|
|
|
+ registry.destroy(e0);
|
|
|
+ registry.assign<int>(registry.create(), 42);
|
|
|
+
|
|
|
+ ASSERT_EQ(group.size(), typename decltype(group)::size_type{1});
|
|
|
+ ASSERT_EQ(group[{}], e1);
|
|
|
+ ASSERT_EQ(group.get<int>(e1), 1);
|
|
|
+ ASSERT_EQ(group.get<unsigned int>(e1), 1u);
|
|
|
+
|
|
|
+ group.each([e1](auto entity, auto ivalue, auto uivalue) {
|
|
|
+ ASSERT_EQ(entity, e1);
|
|
|
+ ASSERT_EQ(ivalue, 1);
|
|
|
+ ASSERT_EQ(uivalue, 1u);
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+TEST(OwningGroup, ConstNonConstAndAllInBetween) {
|
|
|
+ entt::registry registry;
|
|
|
+ auto group = registry.group<int, const char>(entt::get<double, const float>);
|
|
|
+
|
|
|
+ ASSERT_EQ(group.size(), decltype(group.size()){0});
|
|
|
+
|
|
|
+ const auto entity = registry.create();
|
|
|
+ registry.assign<int>(entity, 0);
|
|
|
+ registry.assign<char>(entity, 'c');
|
|
|
+ registry.assign<double>(entity, 0.);
|
|
|
+ registry.assign<float>(entity, 0.f);
|
|
|
+
|
|
|
+ ASSERT_EQ(group.size(), decltype(group.size()){1});
|
|
|
+
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(group.get<int>(0)), int &>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(group.get<const int>(0)), const int &>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(group.get<const char>(0)), const char &>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(group.get<double>(0)), double &>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(group.get<const double>(0)), const double &>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(group.get<const float>(0)), const float &>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(group.get<int, const char, double, const float>(0)), std::tuple<int &, const char &, double &, const float &>>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(group.get<const int, const char, const double, const float>(0)), std::tuple<const int &, const char &, const double &, const float &>>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(group.raw<const float>()), const float *>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(group.raw<double>()), double *>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(group.raw<const char>()), const char *>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(group.raw<int>()), int *>));
|
|
|
+
|
|
|
+ group.each([](auto, auto &&i, auto &&c, auto &&d, auto &&f) {
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(i), int &>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(c), const char &>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(d), double &>));
|
|
|
+ ASSERT_TRUE((std::is_same_v<decltype(f), const float &>));
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+TEST(OwningGroup, Find) {
|
|
|
+ entt::registry registry;
|
|
|
+ auto group = registry.group<int>(entt::get<const char>);
|
|
|
+
|
|
|
+ const auto e0 = registry.create();
|
|
|
+ registry.assign<int>(e0);
|
|
|
+ registry.assign<char>(e0);
|
|
|
+
|
|
|
+ const auto e1 = registry.create();
|
|
|
+ registry.assign<int>(e1);
|
|
|
+ registry.assign<char>(e1);
|
|
|
+
|
|
|
+ const auto e2 = registry.create();
|
|
|
+ registry.assign<int>(e2);
|
|
|
+ registry.assign<char>(e2);
|
|
|
+
|
|
|
+ const auto e3 = registry.create();
|
|
|
+ registry.assign<int>(e3);
|
|
|
+ registry.assign<char>(e3);
|
|
|
+
|
|
|
+ registry.remove<int>(e1);
|
|
|
+
|
|
|
+ ASSERT_NE(group.find(e0), group.end());
|
|
|
+ ASSERT_EQ(group.find(e1), group.end());
|
|
|
+ ASSERT_NE(group.find(e2), group.end());
|
|
|
+ ASSERT_NE(group.find(e3), group.end());
|
|
|
+
|
|
|
+ auto it = group.find(e2);
|
|
|
+
|
|
|
+ ASSERT_EQ(*it, e2);
|
|
|
+ ASSERT_EQ(*(++it), e3);
|
|
|
+ ASSERT_EQ(*(++it), e0);
|
|
|
+ ASSERT_EQ(++it, group.end());
|
|
|
+ ASSERT_EQ(++group.find(e0), group.end());
|
|
|
+
|
|
|
+ const auto e4 = registry.create();
|
|
|
+ registry.destroy(e4);
|
|
|
+ const auto e5 = registry.create();
|
|
|
+ registry.assign<int>(e5);
|
|
|
+ registry.assign<char>(e5);
|
|
|
+
|
|
|
+ ASSERT_NE(group.find(e5), group.end());
|
|
|
+ ASSERT_EQ(group.find(e4), group.end());
|
|
|
+}
|
|
|
+
|
|
|
+TEST(OwningGroup, ExcludedComponents) {
|
|
|
+ entt::registry registry;
|
|
|
+
|
|
|
+ const auto e0 = registry.create();
|
|
|
+ registry.assign<int>(e0, 0);
|
|
|
+
|
|
|
+ const auto e1 = registry.create();
|
|
|
+ registry.assign<int>(e1, 1);
|
|
|
+ registry.assign<char>(e1);
|
|
|
+
|
|
|
+ const auto group = registry.group<int>(entt::exclude<char>);
|
|
|
+
|
|
|
+ const auto e2 = registry.create();
|
|
|
+ registry.assign<int>(e2, 2);
|
|
|
|
|
|
const auto e3 = registry.create();
|
|
|
registry.assign<int>(e3, 3);
|
|
|
@@ -610,33 +697,6 @@ TEST(OwningGroup, ExcludedComponents) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-TEST(NonOwningGroup, EmptyAndNonEmptyTypes) {
|
|
|
- struct empty_type {};
|
|
|
- entt::registry registry;
|
|
|
- const auto group = registry.group<>(entt::get<int, empty_type>);
|
|
|
-
|
|
|
- const auto e0 = registry.create();
|
|
|
- registry.assign<empty_type>(e0);
|
|
|
- registry.assign<int>(e0);
|
|
|
-
|
|
|
- const auto e1 = registry.create();
|
|
|
- registry.assign<empty_type>(e1);
|
|
|
- registry.assign<int>(e1);
|
|
|
-
|
|
|
- registry.assign<int>(registry.create());
|
|
|
-
|
|
|
- for(const auto entity: group) {
|
|
|
- ASSERT_TRUE(entity == e0 || entity == e1);
|
|
|
- }
|
|
|
-
|
|
|
- group.each([e0, e1](const auto entity, const int &, const empty_type &) {
|
|
|
- ASSERT_TRUE(entity == e0 || entity == e1);
|
|
|
- });
|
|
|
-
|
|
|
- ASSERT_EQ(group.size(), typename decltype(group)::size_type{2});
|
|
|
- ASSERT_EQ(&group.get<empty_type>(e0), &group.get<empty_type>(e1));
|
|
|
-}
|
|
|
-
|
|
|
TEST(OwningGroup, EmptyAndNonEmptyTypes) {
|
|
|
struct empty_type {};
|
|
|
entt::registry registry;
|
|
|
@@ -664,24 +724,6 @@ TEST(OwningGroup, EmptyAndNonEmptyTypes) {
|
|
|
ASSERT_EQ(&group.get<empty_type>(e0), &group.get<empty_type>(e1));
|
|
|
}
|
|
|
|
|
|
-TEST(NonOwningGroup, TrackEntitiesOnComponentDestruction) {
|
|
|
- entt::registry registry;
|
|
|
- const auto group = registry.group<>(entt::get<int>, entt::exclude<char>);
|
|
|
- const auto cgroup = std::as_const(registry).group<>(entt::get<const int>, entt::exclude<char>);
|
|
|
-
|
|
|
- const auto entity = registry.create();
|
|
|
- registry.assign<int>(entity);
|
|
|
- registry.assign<char>(entity);
|
|
|
-
|
|
|
- ASSERT_TRUE(group.empty());
|
|
|
- ASSERT_TRUE(cgroup.empty());
|
|
|
-
|
|
|
- registry.remove<char>(entity);
|
|
|
-
|
|
|
- ASSERT_FALSE(group.empty());
|
|
|
- ASSERT_FALSE(cgroup.empty());
|
|
|
-}
|
|
|
-
|
|
|
TEST(OwningGroup, TrackEntitiesOnComponentDestruction) {
|
|
|
entt::registry registry;
|
|
|
const auto group = registry.group<int>(entt::exclude<char>);
|