Quellcode durchsuchen

meta: turn the meta_range class into an alias of iterable_adaptor

Michele Caini vor 3 Jahren
Ursprung
Commit
4b74163306

+ 7 - 7
src/entt/meta/factory.hpp

@@ -27,7 +27,7 @@ namespace entt {
 namespace internal {
 
 inline void link_prop_if_required(internal::meta_prop_node **ref, internal::meta_prop_node &node) noexcept {
-    if(meta_range<internal::meta_prop_node *, internal::meta_prop_node> range{*ref}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) {
+    if(meta_range<internal::meta_prop_node *, internal::meta_prop_node> range{*ref, nullptr}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) {
         ENTT_ASSERT(std::find_if(range.cbegin(), range.cend(), [&node](const auto *curr) { return curr->id == node.id; }) == range.cend(), "Duplicate identifier");
         node.next = *ref;
         *ref = &node;
@@ -35,7 +35,7 @@ inline void link_prop_if_required(internal::meta_prop_node **ref, internal::meta
 }
 
 inline void link_type_if_required(meta_type_node *owner, const id_type id) noexcept {
-    meta_range<meta_type_node *, meta_type_node> range{*meta_context::global()};
+    meta_range<meta_type_node *, meta_type_node> range{*meta_context::global(), nullptr};
     ENTT_ASSERT(std::find_if(range.cbegin(), range.cend(), [&](const auto *curr) { return curr != owner && curr->id == id; }) == range.cend(), "Duplicate identifier");
     owner->id = id;
 
@@ -46,28 +46,28 @@ inline void link_type_if_required(meta_type_node *owner, const id_type id) noexc
 }
 
 inline void link_base_if_required(meta_type_node *owner, meta_base_node &node) noexcept {
-    if(meta_range<meta_base_node *, meta_base_node> range{owner->base}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) {
+    if(meta_range<meta_base_node *, meta_base_node> range{owner->base, nullptr}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) {
         node.next = owner->base;
         owner->base = &node;
     }
 }
 
 inline void link_conv_if_required(meta_type_node *owner, meta_conv_node &node) noexcept {
-    if(meta_range<meta_conv_node *, meta_conv_node> range{owner->conv}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) {
+    if(meta_range<meta_conv_node *, meta_conv_node> range{owner->conv, nullptr}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) {
         node.next = owner->conv;
         owner->conv = &node;
     }
 }
 
 inline void link_ctor_if_required(meta_type_node *owner, meta_ctor_node &node) noexcept {
-    if(meta_range<meta_ctor_node *, meta_ctor_node> range{owner->ctor}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) {
+    if(meta_range<meta_ctor_node *, meta_ctor_node> range{owner->ctor, nullptr}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) {
         node.next = owner->ctor;
         owner->ctor = &node;
     }
 }
 
 inline void link_data_if_required(meta_type_node *owner, const id_type id, meta_data_node &node) noexcept {
-    meta_range<meta_data_node *, meta_data_node> range{owner->data};
+    meta_range<meta_data_node *, meta_data_node> range{owner->data, nullptr};
     ENTT_ASSERT(std::find_if(range.cbegin(), range.cend(), [id, &node](const auto *curr) { return curr != &node && curr->id == id; }) == range.cend(), "Duplicate identifier");
     node.id = id;
 
@@ -80,7 +80,7 @@ inline void link_data_if_required(meta_type_node *owner, const id_type id, meta_
 inline void link_func_if_required(meta_type_node *owner, const id_type id, meta_func_node &node) noexcept {
     node.id = id;
 
-    if(meta_range<meta_func_node *, meta_func_node> range{owner->func}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) {
+    if(meta_range<meta_func_node *, meta_func_node> range{owner->func, nullptr}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) {
         node.next = owner->func;
         owner->func = &node;
     }

+ 6 - 6
src/entt/meta/meta.hpp

@@ -783,7 +783,7 @@ struct meta_data {
      * @return An iterable range to visit registered meta properties.
      */
     [[nodiscard]] meta_range<meta_prop> prop() const noexcept {
-        return node->prop;
+        return {node->prop, nullptr};
     }
 
     /**
@@ -902,7 +902,7 @@ struct meta_func {
 
     /*! @copydoc meta_data::prop */
     [[nodiscard]] meta_range<meta_prop> prop() const noexcept {
-        return node->prop;
+        return {node->prop, nullptr};
     }
 
     /**
@@ -1150,7 +1150,7 @@ public:
      * @return An iterable range to visit registered top-level base meta types.
      */
     [[nodiscard]] meta_range<meta_type, internal::meta_base_node> base() const noexcept {
-        return node->base;
+        return {node->base, nullptr};
     }
 
     /**
@@ -1167,7 +1167,7 @@ public:
      * @return An iterable range to visit registered top-level meta data.
      */
     [[nodiscard]] meta_range<meta_data> data() const noexcept {
-        return node->data;
+        return {node->data, nullptr};
     }
 
     /**
@@ -1187,7 +1187,7 @@ public:
      * @return An iterable range to visit registered top-level functions.
      */
     [[nodiscard]] meta_range<meta_func> func() const noexcept {
-        return node->func;
+        return {node->func, nullptr};
     }
 
     /**
@@ -1316,7 +1316,7 @@ public:
      * @return An iterable range to visit registered top-level meta properties.
      */
     [[nodiscard]] meta_range<meta_prop> prop() const noexcept {
-        return node->prop;
+        return {node->prop, nullptr};
     }
 
     /**

+ 1 - 48
src/entt/meta/range.hpp

@@ -71,54 +71,7 @@ private:
  * @tparam Node Type of meta nodes iterated.
  */
 template<typename Type, typename Node = typename Type::node_type>
-struct meta_range final {
-    /*! @brief Node type. */
-    using node_type = Node;
-    /*! @brief Input iterator type. */
-    using iterator = internal::meta_range_iterator<Type, Node>;
-    /*! @brief Constant input iterator type. */
-    using const_iterator = iterator;
-
-    /*! @brief Default constructor. */
-    meta_range() noexcept = default;
-
-    /**
-     * @brief Constructs a meta range from a given node.
-     * @param head The underlying node with which to construct the range.
-     */
-    meta_range(node_type *head) noexcept
-        : node{head} {}
-
-    /**
-     * @brief Returns an iterator to the beginning.
-     * @return An iterator to the first meta object of the range.
-     */
-    [[nodiscard]] const_iterator cbegin() const noexcept {
-        return iterator{node};
-    }
-
-    /*! @copydoc cbegin */
-    [[nodiscard]] iterator begin() const noexcept {
-        return cbegin();
-    }
-
-    /**
-     * @brief Returns an iterator to the end.
-     * @return An iterator to the element following the last meta object of the
-     * range.
-     */
-    [[nodiscard]] const_iterator cend() const noexcept {
-        return iterator{};
-    }
-
-    /*! @copydoc cend */
-    [[nodiscard]] iterator end() const noexcept {
-        return cend();
-    }
-
-private:
-    node_type *node{nullptr};
-};
+using meta_range = iterable_adaptor<internal::meta_range_iterator<Type, Node>>;
 
 } // namespace entt
 

+ 1 - 1
src/entt/meta/resolve.hpp

@@ -25,7 +25,7 @@ template<typename Type>
  * @return An iterable range to use to visit all meta types.
  */
 [[nodiscard]] inline meta_range<meta_type> resolve() noexcept {
-    return *internal::meta_context::global();
+    return {*internal::meta_context::global(), nullptr};
 }
 
 /**

+ 1 - 18
test/entt/meta/meta_range.cpp

@@ -22,7 +22,7 @@ struct MetaRange: ::testing::Test {
 TEST_F(MetaRange, Range) {
     using namespace entt::literals;
 
-    entt::meta_range<entt::meta_type> range{entt::internal::meta_context::local()};
+    entt::meta_range<entt::meta_type> range{entt::internal::meta_context::local(), nullptr};
     auto it = range.begin();
 
     ASSERT_NE(it, range.end());
@@ -40,20 +40,3 @@ TEST_F(MetaRange, EmptyRange) {
     entt::meta_range<entt::meta_data> range{};
     ASSERT_EQ(range.begin(), range.end());
 }
-
-TEST_F(MetaRange, IteratorConversion) {
-    using namespace entt::literals;
-
-    entt::meta_range<entt::meta_type> range{entt::internal::meta_context::local()};
-    typename decltype(range)::iterator it = range.begin();
-    typename decltype(range)::const_iterator cit = it;
-
-    static_assert(std::is_same_v<decltype(*it), entt::meta_type>);
-    static_assert(std::is_same_v<decltype(*cit), entt::meta_type>);
-
-    ASSERT_EQ(*it, entt::resolve<double>());
-    ASSERT_EQ(*it, *cit);
-
-    ASSERT_EQ(it, cit);
-    ASSERT_NE(++cit, it);
-}