Explorar o código

meta: context aware meta sequence container

Michele Caini %!s(int64=3) %!d(string=hai) anos
pai
achega
5f9faf7a32
Modificáronse 2 ficheiros con 21 adicións e 22 borrados
  1. 9 12
      src/entt/meta/container.hpp
  2. 12 10
      src/entt/meta/meta.hpp

+ 9 - 12
src/entt/meta/container.hpp

@@ -13,6 +13,7 @@
 #include <vector>
 #include "../container/dense_map.hpp"
 #include "../container/dense_set.hpp"
+#include "context.hpp"
 #include "meta.hpp"
 #include "type_traits.hpp"
 
@@ -57,20 +58,16 @@ struct basic_meta_sequence_container_traits {
         return false;
     }
 
-    [[nodiscard]] static iterator iter(any &container, const bool as_end) {
-        // TODO
-
+    [[nodiscard]] static iterator iter(const meta_ctx &ctx, any &container, const bool as_end) {
         if(auto *const cont = any_cast<Type>(&container); cont) {
-            return iterator{as_end ? cont->end() : cont->begin()};
+            return iterator{ctx, as_end ? cont->end() : cont->begin()};
         }
 
         const Type &as_const = any_cast<const Type &>(container);
-        return iterator{as_end ? as_const.end() : as_const.begin()};
+        return iterator{ctx, as_end ? as_const.end() : as_const.begin()};
     }
 
-    [[nodiscard]] static iterator insert_or_erase([[maybe_unused]] any &container, [[maybe_unused]] const any &handle, [[maybe_unused]] meta_any &value) {
-        // TODO
-
+    [[nodiscard]] static iterator insert_or_erase([[maybe_unused]] const meta_ctx &ctx, [[maybe_unused]] any &container, [[maybe_unused]] const any &handle, [[maybe_unused]] meta_any &value) {
         if constexpr(is_dynamic_sequence_container<Type>::value) {
             if(auto *const cont = any_cast<Type>(&container); cont) {
                 typename Type::const_iterator it{};
@@ -85,15 +82,15 @@ struct basic_meta_sequence_container_traits {
                     // this abomination is necessary because only on macos value_type and const_reference are different types for std::vector<bool>
                     if(value.allow_cast<typename Type::const_reference>() || value.allow_cast<typename Type::value_type>()) {
                         const auto *element = value.try_cast<std::remove_reference_t<typename Type::const_reference>>();
-                        return iterator{cont->insert(it, element ? *element : value.cast<typename Type::value_type>())};
+                        return iterator{ctx, cont->insert(it, element ? *element : value.cast<typename Type::value_type>())};
                     }
                 } else {
-                    return iterator{cont->erase(it)};
+                    return iterator{ctx, cont->erase(it)};
                 }
             }
         }
 
-        return {};
+        return iterator{};
     }
 };
 
@@ -155,7 +152,7 @@ struct basic_meta_associative_container_traits {
             return iterator{std::bool_constant<key_only>{}, any_cast<const Type &>(container).find(key.cast<const typename Type::key_type &>())};
         }
 
-        return {};
+        return iterator{};
     }
 };
 

+ 12 - 10
src/entt/meta/meta.hpp

@@ -74,8 +74,8 @@ private:
     internal::meta_type_node (*value_type_node)(const internal::meta_context &){};
     size_type (*size_fn)(const any &) noexcept {};
     bool (*resize_fn)(any &, size_type){};
-    iterator (*iter_fn)(any &, const bool){};
-    iterator (*insert_or_erase_fn)(any &, const any &, meta_any &){};
+    iterator (*iter_fn)(const meta_ctx &, any &, const bool){};
+    iterator (*insert_or_erase_fn)(const meta_ctx &, any &, const any &, meta_any &){};
     any storage{};
 };
 
@@ -1639,12 +1639,14 @@ public:
     using iterator_category = std::input_iterator_tag;
 
     constexpr meta_iterator() noexcept
-        : vtable{},
+        : ctx{},
+          vtable{},
           handle{} {}
 
     template<typename It>
-    explicit meta_iterator(It iter) noexcept
-        : vtable{&basic_vtable<It>},
+    explicit meta_iterator(const meta_ctx &area, It iter) noexcept
+        : ctx{&area},
+          vtable{&basic_vtable<It>},
           handle{std::move(iter)} {}
 
     meta_iterator &operator++() noexcept {
@@ -1670,8 +1672,7 @@ public:
     }
 
     [[nodiscard]] reference operator*() const {
-        // TODO
-        reference other;
+        reference other{meta_ctx_arg, *ctx};
         vtable(operation::deref, handle, 0, &other);
         return other;
     }
@@ -1693,6 +1694,7 @@ public:
     }
 
 private:
+    const meta_ctx *ctx;
     vtable_type *vtable;
     any handle;
 };
@@ -1820,7 +1822,7 @@ inline bool meta_sequence_container::clear() {
  * @return An iterator to the first element of the container.
  */
 [[nodiscard]] inline meta_sequence_container::iterator meta_sequence_container::begin() {
-    return iter_fn(storage, false);
+    return iter_fn(*ctx, storage, false);
 }
 
 /**
@@ -1828,7 +1830,7 @@ inline bool meta_sequence_container::clear() {
  * @return An iterator that is past the last element of the container.
  */
 [[nodiscard]] inline meta_sequence_container::iterator meta_sequence_container::end() {
-    return iter_fn(storage, true);
+    return iter_fn(*ctx, storage, true);
 }
 
 /**
@@ -1838,7 +1840,7 @@ inline bool meta_sequence_container::clear() {
  * @return A possibly invalid iterator to the inserted element.
  */
 inline meta_sequence_container::iterator meta_sequence_container::insert(iterator it, meta_any value) {
-    return insert_or_erase_fn(storage, it.handle, value);
+    return insert_or_erase_fn(*ctx, storage, it.handle, value);
 }
 
 /**