Browse Source

view/group: added missing operator-> here and there

Michele Caini 4 years ago
parent
commit
c4723f3b24
4 changed files with 34 additions and 4 deletions
  1. 11 2
      src/entt/entity/group.hpp
  2. 11 2
      src/entt/entity/view.hpp
  3. 6 0
      test/entt/entity/group.cpp
  4. 6 0
      test/entt/entity/view.cpp

+ 11 - 2
src/entt/entity/group.hpp

@@ -5,6 +5,7 @@
 #include <type_traits>
 #include <utility>
 #include "../config/config.h"
+#include "../core/iterator.hpp"
 #include "../core/type_traits.hpp"
 #include "entity.hpp"
 #include "fwd.hpp"
@@ -74,7 +75,7 @@ class basic_group<Entity, owned_t<>, get_t<Get...>, exclude_t<Exclude...>> final
         struct iterable_iterator final {
             using difference_type = std::ptrdiff_t;
             using value_type = decltype(std::tuple_cat(std::tuple<Entity>{}, std::declval<basic_group>().get({})));
-            using pointer = void;
+            using pointer = input_iterator_pointer<value_type>;
             using reference = value_type;
             using iterator_category = std::input_iterator_tag;
 
@@ -97,6 +98,10 @@ class basic_group<Entity, owned_t<>, get_t<Get...>, exclude_t<Exclude...>> final
                 return std::tuple_cat(std::make_tuple(entt), std::get<storage_type<Get> *>(pools)->get_as_tuple(entt)...);
             }
 
+            [[nodiscard]] pointer operator->() const ENTT_NOEXCEPT {
+                return operator*();
+            }
+
             [[nodiscard]] bool operator==(const iterable_iterator &other) const ENTT_NOEXCEPT {
                 return other.it == it;
             }
@@ -539,7 +544,7 @@ class basic_group<Entity, owned_t<Owned...>, get_t<Get...>, exclude_t<Exclude...
         struct iterable_iterator<It, type_list<OIt...>> final {
             using difference_type = std::ptrdiff_t;
             using value_type = decltype(std::tuple_cat(std::tuple<Entity>{}, std::declval<basic_group>().get({})));
-            using pointer = void;
+            using pointer = input_iterator_pointer<value_type>;
             using reference = value_type;
             using iterator_category = std::input_iterator_tag;
 
@@ -565,6 +570,10 @@ class basic_group<Entity, owned_t<Owned...>, get_t<Get...>, exclude_t<Exclude...
                     std::get<storage_type<Get> *>(get)->get_as_tuple(*it)...);
             }
 
+            [[nodiscard]] pointer operator->() const ENTT_NOEXCEPT {
+                return operator*();
+            }
+
             [[nodiscard]] bool operator==(const iterable_iterator &other) const ENTT_NOEXCEPT {
                 return other.it == it;
             }

+ 11 - 2
src/entt/entity/view.hpp

@@ -8,6 +8,7 @@
 #include <type_traits>
 #include <utility>
 #include "../config/config.h"
+#include "../core/iterator.hpp"
 #include "../core/type_traits.hpp"
 #include "component.hpp"
 #include "entity.hpp"
@@ -34,7 +35,7 @@ class iterable_storage final {
     struct iterable_storage_iterator final {
         using difference_type = std::ptrdiff_t;
         using value_type = decltype(std::tuple_cat(std::tuple<Entity>{}, std::declval<decltype(std::declval<storage_type &>().get_as_tuple({}))>()));
-        using pointer = void;
+        using pointer = input_iterator_pointer<value_type>;
         using reference = value_type;
         using iterator_category = std::input_iterator_tag;
 
@@ -55,6 +56,10 @@ class iterable_storage final {
             return {*std::get<It>(it)...};
         }
 
+        [[nodiscard]] pointer operator->() const ENTT_NOEXCEPT {
+            return operator*();
+        }
+
         [[nodiscard]] bool operator==(const iterable_storage_iterator &other) const ENTT_NOEXCEPT {
             return std::get<0>(other.it) == std::get<0>(it);
         }
@@ -242,7 +247,7 @@ class basic_view<Entity, get_t<Component...>, exclude_t<Exclude...>> {
         struct iterable_iterator final {
             using difference_type = std::ptrdiff_t;
             using value_type = decltype(std::tuple_cat(std::tuple<Entity>{}, std::declval<basic_view>().get({})));
-            using pointer = void;
+            using pointer = input_iterator_pointer<value_type>;
             using reference = value_type;
             using iterator_category = std::input_iterator_tag;
 
@@ -263,6 +268,10 @@ class basic_view<Entity, get_t<Component...>, exclude_t<Exclude...>> {
                 return std::tuple_cat(std::make_tuple(*it), view->get(*it));
             }
 
+            [[nodiscard]] pointer operator->() const ENTT_NOEXCEPT {
+                return operator*();
+            }
+
             [[nodiscard]] bool operator==(const iterable_iterator &other) const ENTT_NOEXCEPT {
                 return other.it == it;
             }

+ 6 - 0
test/entt/entity/group.cpp

@@ -172,6 +172,9 @@ TEST(NonOwningGroup, Each) {
     registry.emplace<int>(e1, 1);
     registry.emplace<char>(e1);
 
+    ASSERT_NE(iterable.begin(), iterable.end());
+    ASSERT_NO_THROW(iterable.begin()->swap(*iterable.begin()));
+
     auto cgroup = std::as_const(registry).group_if_exists(entt::get<const int, const char>);
     auto citerable = cgroup.each();
     std::size_t cnt = 0;
@@ -791,6 +794,9 @@ TEST(OwningGroup, Each) {
     registry.emplace<int>(e1, 1);
     registry.emplace<char>(e1);
 
+    ASSERT_NE(iterable.begin(), iterable.end());
+    ASSERT_NO_THROW(iterable.begin()->swap(*iterable.begin()));
+
     auto cgroup = std::as_const(registry).group_if_exists<const int>(entt::get<const char>);
     auto citerable = cgroup.each();
     std::size_t cnt = 0;

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

@@ -190,6 +190,9 @@ TEST(SingleComponentView, Each) {
     auto view = registry.view<int>();
     auto iterable = view.each();
 
+    ASSERT_NE(iterable.begin(), iterable.end());
+    ASSERT_NO_THROW(iterable.begin()->swap(*iterable.begin()));
+
     auto cview = std::as_const(registry).view<const int>();
     auto citerable = cview.each();
 
@@ -676,6 +679,9 @@ TEST(MultiComponentView, Each) {
     auto view = registry.view<int, char>();
     auto iterable = view.each();
 
+    ASSERT_NE(iterable.begin(), iterable.end());
+    ASSERT_NO_THROW(iterable.begin()->swap(*iterable.begin()));
+
     auto cview = std::as_const(registry).view<const int, const char>();
     auto citerable = cview.each();