Browse Source

view: extended_view_iterator::base to return the underlying iterator

Michele Caini 3 years ago
parent
commit
433ed863e5
3 changed files with 10 additions and 1 deletions
  1. 1 1
      TODO
  2. 5 0
      src/entt/entity/view.hpp
  3. 4 0
      test/entt/entity/view.cpp

+ 1 - 1
TODO

@@ -15,7 +15,7 @@ TODO (high prio):
 * check natvis files (periodically :)
 * remove the static storage from the const assure in the registry
 * pop_if to improve further destroying entities (drastically)
-* add iterator_type/base to extended storage iterators (view, group)
+* add iterator_type/base to extended storage iterators (group)
 
 WIP:
 * get rid of observers, storage based views made them pointless - document alternatives

+ 5 - 0
src/entt/entity/view.hpp

@@ -104,6 +104,7 @@ template<typename LhsType, auto... LhsArgs, typename RhsType, auto... RhsArgs>
 
 template<typename It, typename... Type>
 struct extended_view_iterator final {
+    using iterator_type = It;
     using difference_type = std::ptrdiff_t;
     using value_type = decltype(std::tuple_cat(std::make_tuple(*std::declval<It>()), std::declval<Type>().get_as_tuple({})...));
     using pointer = input_iterator_pointer<value_type>;
@@ -135,6 +136,10 @@ struct extended_view_iterator final {
         return operator*();
     }
 
+    constexpr iterator_type base() const noexcept {
+        return it;
+    }
+
     template<typename... Lhs, typename... Rhs>
     friend bool constexpr operator==(const extended_view_iterator<Lhs...> &, const extended_view_iterator<Rhs...> &) noexcept;
 

+ 4 - 0
test/entt/entity/view.cpp

@@ -198,7 +198,9 @@ TEST(SingleComponentView, Each) {
 
     auto it = iterable.begin();
 
+    ASSERT_EQ(it.base(), view.begin());
     ASSERT_EQ((it++, ++it), iterable.end());
+    ASSERT_EQ(it.base(), view.end());
 
     view.each([expected = 1](auto entt, int &value) mutable {
         ASSERT_EQ(static_cast<int>(entt::to_integral(entt)), expected);
@@ -721,7 +723,9 @@ TEST(MultiComponentView, Each) {
 
     auto it = iterable.begin();
 
+    ASSERT_EQ(it.base(), view.begin());
     ASSERT_EQ((it++, ++it), iterable.end());
+    ASSERT_EQ(it.base(), view.end());
 
     view.each([expected = 1](auto entt, int &ivalue, char &cvalue) mutable {
         ASSERT_EQ(static_cast<int>(entt::to_integral(entt)), expected);