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

sparse_set: tombstone/null debug check in ::contains

Michele Caini 4 лет назад
Родитель
Сommit
d4b59aff97
2 измененных файлов с 8 добавлено и 9 удалено
  1. 4 0
      src/entt/entity/sparse_set.hpp
  2. 4 9
      test/entt/entity/sparse_set.cpp

+ 4 - 0
src/entt/entity/sparse_set.hpp

@@ -507,6 +507,7 @@ public:
      * @return True if the sparse set contains the entity, false otherwise.
      */
     [[nodiscard]] bool contains(const entity_type entt) const ENTT_NOEXCEPT {
+        ENTT_ASSERT(entt != tombstone && entt != null, "Invalid entity");
         const auto curr = page(entt);
         // testing versions permits to avoid accessing the packed array
         return (curr < bucket && sparse[curr] && sparse[curr][offset(entt)] != null);
@@ -692,6 +693,9 @@ public:
      * @param rhs A valid entity identifier.
      */
     void swap(const entity_type lhs, const entity_type rhs) {
+        ENTT_ASSERT(contains(lhs), "Set does not contain entity");
+        ENTT_ASSERT(contains(rhs), "Set does not contain entity");
+
         auto &entt = sparse[page(lhs)][offset(lhs)];
         auto &other = sparse[page(rhs)][offset(rhs)];
 

+ 4 - 9
test/entt/entity/sparse_set.cpp

@@ -78,9 +78,6 @@ TEST(SparseSet, Contains) {
 
     entt::sparse_set set{entt::deletion_policy::in_place};
 
-    ASSERT_FALSE(set.contains(entt::null));
-    ASSERT_FALSE(set.contains(entt::tombstone));
-
     set.emplace(entt::entity{0});
     set.emplace(entt::entity{3});
     set.emplace(entt::entity{42});
@@ -106,12 +103,10 @@ TEST(SparseSet, Contains) {
     ASSERT_FALSE(set.contains(entt::entity{99}));
     ASSERT_TRUE(set.contains(entt::entity{1}));
 
-    ASSERT_FALSE(set.contains(entt::null));
-    ASSERT_FALSE(set.contains(entt::tombstone));
-
-    // tombstones and null entities can trigger false positives
-    ASSERT_TRUE(set.contains(entt::tombstone | entt::entity{1u}));
-    ASSERT_FALSE(set.contains(entt::null | entt::entity{1u}));
+    ASSERT_DEATH(set.contains(entt::null), "");
+    ASSERT_DEATH(set.contains(entt::tombstone), "");
+    ASSERT_DEATH(set.contains(entt::tombstone | entt::entity{1u}), "");
+    ASSERT_DEATH(set.contains(entt::null | entt::entity{1u}), "");
 }
 
 TEST(SparseSet, Move) {