Selaa lähdekoodia

Fix entt::collector::where (#319)

* fix observer
* add chained entt::collector::where test
Andrej Suvoraŭ 6 vuotta sitten
vanhempi
commit
c133686dde
2 muutettua tiedostoa jossa 68 lisäystä ja 2 poistoa
  1. 2 2
      src/entt/entity/observer.hpp
  2. 66 0
      test/entt/entity/observer.cpp

+ 2 - 2
src/entt/entity/observer.hpp

@@ -83,7 +83,7 @@ struct basic_collector<matcher<matcher<type_list<Reject...>, type_list<Require..
     template<typename... AllOf, typename... NoneOf>
     static constexpr auto group(exclude_t<NoneOf...> = {}) ENTT_NOEXCEPT {
         using first = matcher<matcher<type_list<Reject...>, type_list<Require...>>, Rule...>;
-        return basic_collector<first, Other..., matcher<matcher<type_list<>, type_list<>>, type_list<NoneOf...>, type_list<AllOf...>>>{};
+        return basic_collector<matcher<matcher<type_list<>, type_list<>>, type_list<NoneOf...>, type_list<AllOf...>>, first, Other...>{};
     }
 
     /**
@@ -94,7 +94,7 @@ struct basic_collector<matcher<matcher<type_list<Reject...>, type_list<Require..
     template<typename AnyOf>
     static constexpr auto replace() ENTT_NOEXCEPT {
         using first = matcher<matcher<type_list<Reject...>, type_list<Require...>>, Rule...>;
-        return basic_collector<first, Other..., matcher<matcher<type_list<>, type_list<>>, AnyOf>>{};
+        return basic_collector<matcher<matcher<type_list<>, type_list<>>, AnyOf>, first, Other...>{};
     }
 
     /**

+ 66 - 0
test/entt/entity/observer.cpp

@@ -130,6 +130,72 @@ TEST(Observer, AllOfFiltered) {
     ASSERT_TRUE(observer.empty());
 }
 
+TEST(Observer, WhereChain) {
+    constexpr auto collector =  entt::collector
+            .replace<int>().where<char>()
+            .replace<double>().where<float>();
+
+    entt::registry registry;
+    entt::observer observer{registry, collector};
+    const auto entity = registry.create();
+
+    ASSERT_TRUE(observer.empty());
+
+    registry.assign<int>(entity);
+
+    ASSERT_TRUE(observer.empty());
+
+    registry.assign_or_replace<int>(entity);
+
+    ASSERT_TRUE(observer.empty());
+
+    registry.assign<char>(entity);
+
+    ASSERT_TRUE(observer.empty());
+
+    registry.assign_or_replace<int>(entity);
+
+    ASSERT_EQ(observer.size(), entt::observer::size_type{ 1 });
+    ASSERT_FALSE(observer.empty());
+    ASSERT_EQ(*observer.data(), entity);
+
+    observer.clear();
+    registry.assign<double>(entity);
+
+    ASSERT_TRUE(observer.empty());
+
+    registry.assign_or_replace<double>(entity);
+
+    ASSERT_TRUE(observer.empty());
+
+    registry.assign<float>(entity);
+
+    ASSERT_TRUE(observer.empty());
+
+    registry.assign_or_replace<double>(entity);
+
+    ASSERT_EQ(observer.size(), entt::observer::size_type{ 1 });
+    ASSERT_FALSE(observer.empty());
+    ASSERT_EQ(*observer.data(), entity);
+
+    registry.remove<float>(entity);
+
+    ASSERT_TRUE(observer.empty());
+
+    registry.assign_or_replace<int>(entity);
+
+    ASSERT_EQ(observer.size(), entt::observer::size_type{ 1 });
+    ASSERT_FALSE(observer.empty());
+    ASSERT_EQ(*observer.data(), entity);
+
+    observer.clear();
+    observer.disconnect();
+
+    registry.assign_or_replace<int>(entity);
+
+    ASSERT_TRUE(observer.empty());
+}
+
 TEST(Observer, Observe) {
     entt::registry registry;
     entt::observer observer{registry, entt::collector.replace<int>().replace<char>()};