Browse Source

sparse_set/storage: iterator's ::index returns the right offset

Michele Caini 4 năm trước cách đây
mục cha
commit
1caa8d923d

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

@@ -89,7 +89,7 @@ struct sparse_set_iterator final {
     }
 
     [[nodiscard]] difference_type index() const ENTT_NOEXCEPT {
-        return offset;
+        return offset - 1;
     }
 
 private:

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

@@ -113,7 +113,7 @@ public:
     }
 
     [[nodiscard]] difference_type index() const ENTT_NOEXCEPT {
-        return offset;
+        return offset - 1;
     }
 
 private:

+ 19 - 1
test/entt/entity/sparse_set.cpp

@@ -832,6 +832,9 @@ TEST(SparseSet, Iterator) {
     ASSERT_EQ(end, set.cend());
     ASSERT_NE(begin, end);
 
+    ASSERT_EQ(begin.index(), 0);
+    ASSERT_EQ(end.index(), -1);
+
     ASSERT_EQ(begin++, set.begin());
     ASSERT_EQ(begin--, set.end());
 
@@ -861,9 +864,15 @@ TEST(SparseSet, Iterator) {
     ASSERT_EQ(*begin, entt::entity{3});
     ASSERT_EQ(*begin.operator->(), entt::entity{3});
 
+    ASSERT_EQ(begin.index(), 0);
+    ASSERT_EQ(end.index(), -1);
+
     set.emplace(entt::entity{42});
     begin = set.begin();
 
+    ASSERT_EQ(begin.index(), 1);
+    ASSERT_EQ(end.index(), -1);
+
     ASSERT_EQ(begin[0u], entt::entity{42});
     ASSERT_EQ(begin[1u], entt::entity{3});
 }
@@ -887,6 +896,9 @@ TEST(SparseSet, ReverseIterator) {
     ASSERT_EQ(end, set.crend());
     ASSERT_NE(begin, end);
 
+    ASSERT_EQ(begin.base().index(), -1);
+    ASSERT_EQ(end.base().index(), 0);
+
     ASSERT_EQ(begin++, set.rbegin());
     ASSERT_EQ(begin--, set.rend());
 
@@ -916,8 +928,14 @@ TEST(SparseSet, ReverseIterator) {
     ASSERT_EQ(*begin, entt::entity{3});
     ASSERT_EQ(*begin.operator->(), entt::entity{3});
 
+    ASSERT_EQ(begin.base().index(), -1);
+    ASSERT_EQ(end.base().index(), 0);
+
     set.emplace(entt::entity{42});
-    begin = set.rbegin();
+    end = set.rend();
+
+    ASSERT_EQ(begin.base().index(), -1);
+    ASSERT_EQ(end.base().index(), 1);
 
     ASSERT_EQ(begin[0u], entt::entity{3});
     ASSERT_EQ(begin[1u], entt::entity{42});

+ 43 - 1
test/entt/entity/storage.cpp

@@ -891,6 +891,9 @@ TEST(Storage, Iterator) {
     ASSERT_EQ(end, pool.end());
     ASSERT_NE(begin, end);
 
+    ASSERT_EQ(begin.index(), 0);
+    ASSERT_EQ(end.index(), -1);
+
     ASSERT_EQ(begin++, pool.begin());
     ASSERT_EQ(begin--, pool.end());
 
@@ -917,9 +920,15 @@ TEST(Storage, Iterator) {
     ASSERT_GT(end, begin);
     ASSERT_GE(end, pool.end());
 
+    ASSERT_EQ(begin.index(), 0);
+    ASSERT_EQ(end.index(), -1);
+
     pool.emplace(entt::entity{42}, 3);
     begin = pool.begin();
 
+    ASSERT_EQ(begin.index(), 1);
+    ASSERT_EQ(end.index(), -1);
+
     ASSERT_EQ(begin[0u], boxed_int{3});
     ASSERT_EQ(begin[1u], boxed_int{42});
 }
@@ -943,6 +952,9 @@ TEST(Storage, ConstIterator) {
     ASSERT_EQ(cend, pool.cend());
     ASSERT_NE(cbegin, cend);
 
+    ASSERT_EQ(cbegin.index(), 0);
+    ASSERT_EQ(cend.index(), -1);
+
     ASSERT_EQ(cbegin++, pool.cbegin());
     ASSERT_EQ(cbegin--, pool.cend());
 
@@ -969,9 +981,15 @@ TEST(Storage, ConstIterator) {
     ASSERT_GT(cend, cbegin);
     ASSERT_GE(cend, pool.cend());
 
+    ASSERT_EQ(cbegin.index(), 0);
+    ASSERT_EQ(cend.index(), -1);
+
     pool.emplace(entt::entity{42}, 3);
     cbegin = pool.cbegin();
 
+    ASSERT_EQ(cbegin.index(), 1);
+    ASSERT_EQ(cend.index(), -1);
+
     ASSERT_EQ(cbegin[0u], boxed_int{3});
     ASSERT_EQ(cbegin[1u], boxed_int{42});
 }
@@ -995,6 +1013,9 @@ TEST(Storage, ReverseIterator) {
     ASSERT_EQ(end, pool.rend());
     ASSERT_NE(begin, end);
 
+    ASSERT_EQ(begin.base().index(), -1);
+    ASSERT_EQ(end.base().index(), 0);
+
     ASSERT_EQ(begin++, pool.rbegin());
     ASSERT_EQ(begin--, pool.rend());
 
@@ -1021,8 +1042,14 @@ TEST(Storage, ReverseIterator) {
     ASSERT_GT(end, begin);
     ASSERT_GE(end, pool.rend());
 
+    ASSERT_EQ(begin.base().index(), -1);
+    ASSERT_EQ(end.base().index(), 0);
+
     pool.emplace(entt::entity{42}, 3);
-    begin = pool.rbegin();
+    end = pool.rend();
+
+    ASSERT_EQ(begin.base().index(), -1);
+    ASSERT_EQ(end.base().index(), 1);
 
     ASSERT_EQ(begin[0u], boxed_int{42});
     ASSERT_EQ(begin[1u], boxed_int{3});
@@ -1047,6 +1074,9 @@ TEST(Storage, ConstReverseIterator) {
     ASSERT_EQ(cend, pool.crend());
     ASSERT_NE(cbegin, cend);
 
+    ASSERT_EQ(cbegin.base().index(), -1);
+    ASSERT_EQ(cend.base().index(), 0);
+
     ASSERT_EQ(cbegin++, pool.crbegin());
     ASSERT_EQ(cbegin--, pool.crend());
 
@@ -1072,6 +1102,18 @@ TEST(Storage, ConstReverseIterator) {
 
     ASSERT_GT(cend, cbegin);
     ASSERT_GE(cend, pool.crend());
+
+    ASSERT_EQ(cbegin.base().index(), -1);
+    ASSERT_EQ(cend.base().index(), 0);
+
+    pool.emplace(entt::entity{42}, 3);
+    cend = pool.crend();
+
+    ASSERT_EQ(cbegin.base().index(), -1);
+    ASSERT_EQ(cend.base().index(), 1);
+
+    ASSERT_EQ(cbegin[0u], boxed_int{42});
+    ASSERT_EQ(cbegin[1u], boxed_int{3});
 }
 
 TEST(Storage, IteratorConversion) {