Răsfoiți Sursa

view/group: updated range iterators (thanks to @Lawrencemm for pointing this out)

Michele Caini 5 ani în urmă
părinte
comite
c12c32d26e
2 a modificat fișierele cu 18 adăugiri și 8 ștergeri
  1. 11 4
      src/entt/entity/group.hpp
  2. 7 4
      src/entt/entity/view.hpp

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

@@ -98,10 +98,13 @@ class basic_group<Entity, exclude_t<Exclude...>, get_t<Get...>> {
             using difference_type = std::ptrdiff_t;
             using value_type = decltype(std::tuple_cat(
                 std::declval<std::tuple<Entity>>(),
-                std::declval<std::conditional_t<ENTT_IS_EMPTY(Get), std::tuple<>, std::tuple<Get &>>>()...
+                std::declval<std::conditional_t<ENTT_IS_EMPTY(Get), std::tuple<>, std::tuple<Get>>>()...
             ));
             using pointer = void;
-            using reference = value_type;
+            using reference = decltype(std::tuple_cat(
+                std::declval<std::tuple<Entity>>(),
+                std::declval<std::conditional_t<ENTT_IS_EMPTY(Get), std::tuple<>, std::tuple<Get &>>>()...
+            ));
             using iterator_category = std::input_iterator_tag;
 
             range_iterator() ENTT_NOEXCEPT = default;
@@ -610,12 +613,16 @@ class basic_group<Entity, exclude_t<Exclude...>, get_t<Get...>, Owned...> {
         public:
             using difference_type = std::ptrdiff_t;
             using value_type = decltype(std::tuple_cat(
+                std::declval<std::tuple<Entity>>(),
+                std::declval<std::conditional_t<ENTT_IS_EMPTY(Owned), std::tuple<>, std::tuple<Owned>>>()...,
+                std::declval<std::conditional_t<ENTT_IS_EMPTY(Get), std::tuple<>, std::tuple<Get>>>()...
+            ));
+            using pointer = void;
+            using reference = decltype(std::tuple_cat(
                 std::declval<std::tuple<Entity>>(),
                 std::declval<std::conditional_t<ENTT_IS_EMPTY(Owned), std::tuple<>, std::tuple<Owned &>>>()...,
                 std::declval<std::conditional_t<ENTT_IS_EMPTY(Get), std::tuple<>, std::tuple<Get &>>>()...
             ));
-            using pointer = void;
-            using reference = value_type;
             using iterator_category = std::input_iterator_tag;
 
             range_iterator() ENTT_NOEXCEPT = default;

+ 7 - 4
src/entt/entity/view.hpp

@@ -175,10 +175,13 @@ class basic_view<Entity, exclude_t<Exclude...>, Component...> {
             using difference_type = std::ptrdiff_t;
             using value_type = decltype(std::tuple_cat(
                 std::declval<std::tuple<Entity>>(),
-                std::declval<std::conditional_t<ENTT_IS_EMPTY(Component), std::tuple<>, std::tuple<Component &>>>()...
+                std::declval<std::conditional_t<ENTT_IS_EMPTY(Component), std::tuple<>, std::tuple<Component>>>()...
             ));
             using pointer = void;
-            using reference = value_type;
+            using reference = decltype(std::tuple_cat(
+                std::declval<std::tuple<Entity>>(),
+                std::declval<std::conditional_t<ENTT_IS_EMPTY(Component), std::tuple<>, std::tuple<Component &>>>()...
+            ));
             using iterator_category = std::input_iterator_tag;
 
             range_iterator() ENTT_NOEXCEPT = default;
@@ -645,9 +648,9 @@ class basic_view<Entity, exclude_t<>, Component> {
 
         public:
             using difference_type = std::ptrdiff_t;
-            using value_type = std::conditional_t<ENTT_IS_EMPTY(Component), std::tuple<Entity>, std::tuple<Entity, Component &>>;
+            using value_type = std::conditional_t<ENTT_IS_EMPTY(Component), std::tuple<Entity>, std::tuple<Entity, Component>>;
             using pointer = void;
-            using reference = value_type;
+            using reference = std::conditional_t<ENTT_IS_EMPTY(Component), std::tuple<Entity>, std::tuple<Entity, Component &>>;
             using iterator_category = std::input_iterator_tag;
 
             range_iterator() ENTT_NOEXCEPT = default;