Kaynağa Gözat

view: minor changes

Michele Caini 4 yıl önce
ebeveyn
işleme
02636a7108
1 değiştirilmiş dosya ile 72 ekleme ve 71 silme
  1. 72 71
      src/entt/entity/view.hpp

+ 72 - 71
src/entt/entity/view.hpp

@@ -109,6 +109,77 @@ private:
     Storage *const pool;
 };
 
+template<typename View>
+class iterable_view final {
+    template<typename It>
+    struct iterable_view_iterator final {
+        using difference_type = std::ptrdiff_t;
+        using value_type = decltype(std::tuple_cat(std::tuple<typename View::entity_type>{}, std::declval<View>().get({})));
+        using pointer = input_iterator_pointer<value_type>;
+        using reference = value_type;
+        using iterator_category = std::input_iterator_tag;
+
+        iterable_view_iterator(It from, const View *parent) ENTT_NOEXCEPT
+            : it{from},
+              view{parent} {}
+
+        iterable_view_iterator &operator++() ENTT_NOEXCEPT {
+            return ++it, *this;
+        }
+
+        iterable_view_iterator operator++(int) ENTT_NOEXCEPT {
+            iterable_view_iterator orig = *this;
+            return ++(*this), orig;
+        }
+
+        [[nodiscard]] reference operator*() const ENTT_NOEXCEPT {
+            return std::tuple_cat(std::make_tuple(*it), view->get(*it));
+        }
+
+        [[nodiscard]] pointer operator->() const ENTT_NOEXCEPT {
+            return operator*();
+        }
+
+        [[nodiscard]] bool operator==(const iterable_view_iterator &other) const ENTT_NOEXCEPT {
+            return other.it == it;
+        }
+
+        [[nodiscard]] bool operator!=(const iterable_view_iterator &other) const ENTT_NOEXCEPT {
+            return !(*this == other);
+        }
+
+    private:
+        It it;
+        const View *view;
+    };
+
+public:
+    using iterator = iterable_view_iterator<typename View::iterator>;
+    using reverse_iterator = iterable_view_iterator<typename View::reverse_iterator>;
+
+    iterable_view(const View &parent)
+        : view{parent} {}
+
+    [[nodiscard]] iterator begin() const ENTT_NOEXCEPT {
+        return {view.begin(), &view};
+    }
+
+    [[nodiscard]] iterator end() const ENTT_NOEXCEPT {
+        return {view.end(), &view};
+    }
+
+    [[nodiscard]] reverse_iterator rbegin() const ENTT_NOEXCEPT {
+        return {view.rbegin(), &view};
+    }
+
+    [[nodiscard]] reverse_iterator rend() const ENTT_NOEXCEPT {
+        return {view.rend(), &view};
+    }
+
+private:
+    const View view;
+};
+
 template<typename Type, typename It, std::size_t Component, std::size_t Exclude>
 class view_iterator final {
     [[nodiscard]] bool valid() const {
@@ -237,76 +308,6 @@ class basic_view<Entity, get_t<Component...>, exclude_t<Exclude...>> {
 
     using basic_common_type = std::common_type_t<typename basic_storage_type<Component>::base_type...>;
 
-    class iterable final {
-        template<typename It>
-        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 = input_iterator_pointer<value_type>;
-            using reference = value_type;
-            using iterator_category = std::input_iterator_tag;
-
-            iterable_iterator(It from, const basic_view *parent) ENTT_NOEXCEPT
-                : it{from},
-                  view{parent} {}
-
-            iterable_iterator &operator++() ENTT_NOEXCEPT {
-                return ++it, *this;
-            }
-
-            iterable_iterator operator++(int) ENTT_NOEXCEPT {
-                iterable_iterator orig = *this;
-                return ++(*this), orig;
-            }
-
-            [[nodiscard]] reference operator*() const ENTT_NOEXCEPT {
-                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;
-            }
-
-            [[nodiscard]] bool operator!=(const iterable_iterator &other) const ENTT_NOEXCEPT {
-                return !(*this == other);
-            }
-
-        private:
-            It it;
-            const basic_view *view;
-        };
-
-    public:
-        using iterator = iterable_iterator<internal::view_iterator<basic_common_type, typename basic_common_type::iterator, sizeof...(Component) - 1u, sizeof...(Exclude)>>;
-        using reverse_iterator = iterable_iterator<internal::view_iterator<basic_common_type, typename basic_common_type::reverse_iterator, sizeof...(Component) - 1u, sizeof...(Exclude)>>;
-
-        iterable(const basic_view &parent)
-            : view{parent} {}
-
-        [[nodiscard]] iterator begin() const ENTT_NOEXCEPT {
-            return {view.begin(), &view};
-        }
-
-        [[nodiscard]] iterator end() const ENTT_NOEXCEPT {
-            return {view.end(), &view};
-        }
-
-        [[nodiscard]] reverse_iterator rbegin() const ENTT_NOEXCEPT {
-            return {view.rbegin(), &view};
-        }
-
-        [[nodiscard]] reverse_iterator rend() const ENTT_NOEXCEPT {
-            return {view.rend(), &view};
-        }
-
-    private:
-        const basic_view view;
-    };
-
     template<std::size_t... Index>
     [[nodiscard]] auto test_set(std::index_sequence<Index...>) const ENTT_NOEXCEPT {
         std::size_t pos{};
@@ -356,7 +357,7 @@ public:
     /*! @brief Reverse iterator type. */
     using reverse_iterator = internal::view_iterator<basic_common_type, typename basic_common_type::reverse_iterator, sizeof...(Component) - 1u, sizeof...(Exclude)>;
     /*! @brief Iterable view type. */
-    using iterable_view = iterable;
+    using iterable_view = internal::iterable_view<basic_view>;
     /*! @brief Common type among all storage types. */
     using base_type = basic_common_type;