Skip to content

Commit 9e62e1d

Browse files
committed
sparse_set: ::contains uses the right version mask
1 parent 42529d0 commit 9e62e1d

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

src/entt/entity/sparse_set.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -724,8 +724,9 @@ class basic_sparse_set {
724724
[[nodiscard]] bool contains(const entity_type entt) const noexcept {
725725
const auto elem = sparse_ptr(entt);
726726
constexpr auto cap = traits_type::entity_mask;
727+
constexpr auto mask = traits_type::to_integral(null) & ~cap;
727728
// testing versions permits to avoid accessing the packed array
728-
return elem && (((~cap & traits_type::to_integral(entt)) ^ traits_type::to_integral(*elem)) < cap);
729+
return elem && (((mask & traits_type::to_integral(entt)) ^ traits_type::to_integral(*elem)) < cap);
729730
}
730731

731732
/**

test/entt/entity/sparse_set.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ struct custom_entity_traits {
2121
using entity_type = std::uint32_t;
2222
using version_type = std::uint16_t;
2323
static constexpr entity_type entity_mask = 0x3FFFF; // 18b
24-
static constexpr entity_type version_mask = 0x3FFF; // 14b
24+
static constexpr entity_type version_mask = 0x0FFF; // 12b
2525
};
2626

2727
template<>
@@ -765,6 +765,36 @@ TYPED_TEST(SparseSet, Contains) {
765765

766766
ASSERT_FALSE(set.contains(entity));
767767
ASSERT_FALSE(set.contains(other));
768+
769+
if constexpr(traits_type::to_integral(entt::tombstone) != ~traits_type::entity_type{}) {
770+
// test reserved bits, if any
771+
constexpr entity_type reserved{traits_type::to_integral(entity) | (traits_type::to_integral(entt::tombstone) + 1u)};
772+
773+
ASSERT_NE(entity, reserved);
774+
775+
set.push(reserved);
776+
777+
ASSERT_TRUE(set.contains(entity));
778+
ASSERT_TRUE(set.contains(reserved));
779+
780+
ASSERT_NE(*set.find(entity), entity);
781+
ASSERT_EQ(*set.find(entity), reserved);
782+
783+
set.bump(entity);
784+
785+
ASSERT_TRUE(set.contains(entity));
786+
ASSERT_TRUE(set.contains(reserved));
787+
788+
ASSERT_NE(*set.find(reserved), reserved);
789+
ASSERT_EQ(*set.find(reserved), entity);
790+
791+
set.erase(reserved);
792+
793+
ASSERT_FALSE(set.contains(entity));
794+
ASSERT_FALSE(set.contains(reserved));
795+
796+
ASSERT_EQ(set.find(reserved), set.end());
797+
}
768798
}
769799
}
770800

0 commit comments

Comments
 (0)