Browse Source

entity:
* review sparse_set_iterator::operator[]
* review storage_iterator::operator[]
* code coverage

Michele Caini 4 years ago
parent
commit
193b102013

+ 2 - 1
src/entt/entity/sparse_set.hpp

@@ -73,7 +73,8 @@ struct sparse_set_iterator final {
     }
 
     [[nodiscard]] reference operator[](const difference_type value) const {
-        return *operator+(value);
+        const auto pos = index - value - 1;
+        return packed->data()[pos];
     }
 
     [[nodiscard]] pointer operator->() const {

+ 2 - 1
src/entt/entity/storage.hpp

@@ -97,7 +97,8 @@ public:
     }
 
     [[nodiscard]] reference operator[](const difference_type value) const ENTT_NOEXCEPT {
-        return *operator+(value);
+        const auto pos = index - value - 1;
+        return (*packed)[pos / packed_page_v][fast_mod(pos, packed_page_v)];
     }
 
     [[nodiscard]] pointer operator->() const ENTT_NOEXCEPT {

+ 13 - 0
test/entt/entity/sparse_set.cpp

@@ -830,6 +830,12 @@ TEST(SparseSet, Iterator) {
 
     ASSERT_EQ(*begin, entt::entity{3});
     ASSERT_EQ(*begin.operator->(), entt::entity{3});
+
+    set.emplace(entt::entity{42});
+    begin = set.begin();
+
+    ASSERT_EQ(begin[0u], entt::entity{42});
+    ASSERT_EQ(begin[1u], entt::entity{3});
 }
 
 TEST(SparseSet, ReverseIterator) {
@@ -878,6 +884,13 @@ TEST(SparseSet, ReverseIterator) {
     ASSERT_GE(end, set.rend());
 
     ASSERT_EQ(*begin, entt::entity{3});
+    ASSERT_EQ(*begin.operator->(), entt::entity{3});
+
+    set.emplace(entt::entity{42});
+    begin = set.rbegin();
+
+    ASSERT_EQ(begin[0u], entt::entity{3});
+    ASSERT_EQ(begin[1u], entt::entity{42});
 }
 
 TEST(SparseSet, Find) {

+ 18 - 0
test/entt/entity/storage.cpp

@@ -791,6 +791,12 @@ TEST(Storage, Iterator) {
 
     ASSERT_GT(end, begin);
     ASSERT_GE(end, pool.end());
+
+    pool.emplace(entt::entity{42}, 3);
+    begin = pool.begin();
+
+    ASSERT_EQ(begin[0u], boxed_int{3});
+    ASSERT_EQ(begin[1u], boxed_int{42});
 }
 
 TEST(Storage, ConstIterator) {
@@ -837,6 +843,12 @@ TEST(Storage, ConstIterator) {
 
     ASSERT_GT(cend, cbegin);
     ASSERT_GE(cend, pool.cend());
+
+    pool.emplace(entt::entity{42}, 3);
+    cbegin = pool.cbegin();
+
+    ASSERT_EQ(cbegin[0u], boxed_int{3});
+    ASSERT_EQ(cbegin[1u], boxed_int{42});
 }
 
 TEST(Storage, ReverseIterator) {
@@ -883,6 +895,12 @@ TEST(Storage, ReverseIterator) {
 
     ASSERT_GT(end, begin);
     ASSERT_GE(end, pool.rend());
+
+    pool.emplace(entt::entity{42}, 3);
+    begin = pool.rbegin();
+
+    ASSERT_EQ(begin[0u], boxed_int{42});
+    ASSERT_EQ(begin[1u], boxed_int{3});
 }
 
 TEST(Storage, ConstReverseIterator) {