From 6bb4800ecdc827e8dffd43ae26631e0ca6ed3093 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Thu, 5 Sep 2019 15:08:48 +0200 Subject: [PATCH] fix batch creation (close #305) --- src/entt/entity/registry.hpp | 3 ++- src/entt/entity/sparse_set.hpp | 2 +- test/entt/entity/sparse_set.cpp | 8 ++++++-- test/entt/entity/storage.cpp | 8 ++++---- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/entt/entity/registry.hpp b/src/entt/entity/registry.hpp index 971aead13..db913752e 100644 --- a/src/entt/entity/registry.hpp +++ b/src/entt/entity/registry.hpp @@ -606,7 +606,8 @@ public: }); if constexpr(sizeof...(Component) > 0) { - return std::make_tuple(assure()->batch(*this, first, last)...); + // the reverse iterators guarantee the ordering between entities and components (hint: the pools return begin()) + return std::make_tuple(assure()->batch(*this, std::make_reverse_iterator(last), std::make_reverse_iterator(first))...); } } diff --git a/src/entt/entity/sparse_set.hpp b/src/entt/entity/sparse_set.hpp index c352d3308..8627adf39 100644 --- a/src/entt/entity/sparse_set.hpp +++ b/src/entt/entity/sparse_set.hpp @@ -419,7 +419,7 @@ public: */ template void batch(It first, It last) { - std::for_each(std::make_reverse_iterator(last), std::make_reverse_iterator(first), [this, next = direct.size()](const auto entt) mutable { + std::for_each(first, last, [this, next = direct.size()](const auto entt) mutable { ENTT_ASSERT(!has(entt)); auto [page, offset] = map(entt); assure(page); diff --git a/test/entt/entity/sparse_set.cpp b/test/entt/entity/sparse_set.cpp index 1a3bdf07f..f52fd92cd 100644 --- a/test/entt/entity/sparse_set.cpp +++ b/test/entt/entity/sparse_set.cpp @@ -135,9 +135,13 @@ TEST(SparseSet, BatchAdd) { ASSERT_FALSE(set.empty()); ASSERT_EQ(set.size(), 4u); ASSERT_EQ(set.index(entt::entity{12}), 0u); - ASSERT_EQ(set.index(entities[0]), 2u); - ASSERT_EQ(set.index(entities[1]), 1u); + ASSERT_EQ(set.index(entities[0]), 1u); + ASSERT_EQ(set.index(entities[1]), 2u); ASSERT_EQ(set.index(entt::entity{24}), 3u); + ASSERT_EQ(set.data()[set.index(entt::entity{12})], entt::entity{12}); + ASSERT_EQ(set.data()[set.index(entities[0])], entities[0]); + ASSERT_EQ(set.data()[set.index(entities[1])], entities[1]); + ASSERT_EQ(set.data()[set.index(entt::entity{24})], entt::entity{24}); } TEST(SparseSet, Iterator) { diff --git a/test/entt/entity/storage.cpp b/test/entt/entity/storage.cpp index dc06c156c..186dd278f 100644 --- a/test/entt/entity/storage.cpp +++ b/test/entt/entity/storage.cpp @@ -113,8 +113,8 @@ TEST(Storage, BatchAdd) { it[0] = 1; it[1] = 2; - ASSERT_EQ(pool.get(entities[0]), 1); - ASSERT_EQ(pool.get(entities[1]), 2); + ASSERT_EQ(pool.get(entities[0]), 2); + ASSERT_EQ(pool.get(entities[1]), 1); } TEST(Storage, BatchAddByCopy) { @@ -136,8 +136,8 @@ TEST(Storage, BatchAddByCopy) { it[0] = 1; it[1] = 2; - ASSERT_EQ(pool.get(entities[0]), 1); - ASSERT_EQ(pool.get(entities[1]), 2); + ASSERT_EQ(pool.get(entities[0]), 2); + ASSERT_EQ(pool.get(entities[1]), 1); } TEST(Storage, BatchAddEmptyType) {