Skip to content

Commit 4208eaa

Browse files
committed
entity: make to_entity work with stable types - close #1233
1 parent 5ef09c0 commit 4208eaa

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

src/entt/entity/helper.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,11 @@ typename basic_storage<Args...>::entity_type to_entity(const basic_storage<Args.
127127
using traits_type = component_traits<typename basic_storage<Args...>::value_type, typename basic_storage<Args...>::entity_type>;
128128
static_assert(traits_type::page_size != 0u, "Unexpected page size");
129129
const typename basic_storage<Args...>::base_type &base = storage;
130-
const auto *addr = std::addressof(instance);
130+
const auto *page = storage.raw();
131131

132-
for(auto it = base.rbegin(), last = base.rend(); it < last; it += traits_type::page_size) {
133-
if(const auto dist = (addr - std::addressof(storage.get(*it))); dist >= 0 && dist < static_cast<decltype(dist)>(traits_type::page_size)) {
134-
return *(it + dist);
132+
for(std::size_t pos{}, count = storage.size(); pos < count; pos += traits_type::page_size, ++page) {
133+
if(const auto dist = (std::addressof(instance) - *page); dist >= 0 && dist < static_cast<decltype(dist)>(traits_type::page_size)) {
134+
return *(base.rbegin() + static_cast<decltype(dist)>(pos) + dist);
135135
}
136136
}
137137

test/entt/entity/helper.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ TYPED_TEST(ToEntity, Functionalities) {
9696
ASSERT_EQ(*storage.entt::sparse_set::rbegin(), entity);
9797
ASSERT_EQ(&*(storage.rbegin() + traits_type::page_size - (1u + traits_type::in_place_delete)), &storage.get(other));
9898

99-
registry.destroy(other);
99+
// erase in the middle
100+
storage.erase(other);
100101

101102
ASSERT_EQ(entt::to_entity(storage, storage.get(entity)), entity);
102103
ASSERT_EQ(entt::to_entity(storage, storage.get(next)), next);
@@ -105,6 +106,18 @@ TYPED_TEST(ToEntity, Functionalities) {
105106
ASSERT_EQ(&*(storage.rbegin() + traits_type::page_size - 1u), &storage.get(next));
106107

107108
ASSERT_EQ(entt::to_entity(storage, value), null);
109+
110+
storage.clear();
111+
112+
storage.emplace(entity);
113+
storage.emplace(other);
114+
storage.emplace(next);
115+
116+
// erase first
117+
storage.erase(entity);
118+
119+
ASSERT_EQ(entt::to_entity(storage, value), null);
120+
ASSERT_EQ(entt::to_entity(storage, storage.get(other)), other);
108121
}
109122

110123
TEST(SighHelper, Functionalities) {

0 commit comments

Comments
 (0)