Jelajahi Sumber

meta: further reduce the number of instantiations due to meta sequence containers

Michele Caini 4 tahun lalu
induk
melakukan
32bbb27c9f
2 mengubah file dengan 7 tambahan dan 19 penghapusan
  1. 3 13
      src/entt/meta/container.hpp
  2. 4 6
      src/entt/meta/meta.hpp

+ 3 - 13
src/entt/meta/container.hpp

@@ -54,25 +54,15 @@ struct basic_meta_sequence_container_traits {
         return false;
     }
 
-    [[nodiscard]] static iterator begin(any &container) {
+    [[nodiscard]] static iterator iter(any &container, const bool end) {
         using std::begin;
 
         if(auto *const cont = any_cast<Type>(&container); cont) {
-            return iterator{begin(*cont), 0};
-        }
-
-        return iterator{begin(any_cast<const Type &>(container)), 0};
-    }
-
-    [[nodiscard]] static iterator end(any &container) {
-        using std::end;
-
-        if(auto *const cont = any_cast<Type>(&container); cont) {
-            return iterator{end(*cont), static_cast<typename iterator::difference_type>(cont->size())};
+            return iterator{begin(*cont), end ? static_cast<typename iterator::difference_type>(cont->size()) : 0};
         }
 
         const Type &as_const = any_cast<const Type &>(container);
-        return iterator{end(as_const), static_cast<typename iterator::difference_type>(as_const.size())};
+        return iterator{begin(as_const), end ? static_cast<typename iterator::difference_type>(as_const.size()) : 0};
     }
 
     [[nodiscard]] static iterator insert([[maybe_unused]] any &container, [[maybe_unused]] const std::ptrdiff_t offset, [[maybe_unused]] meta_any &value) {

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

@@ -62,8 +62,7 @@ struct meta_sequence_container {
         : value_type_node{internal::meta_node<std::remove_const_t<std::remove_reference_t<typename Type::value_type>>>::resolve()},
           size_fn{&meta_sequence_container_traits<Type>::size},
           resize_fn{&meta_sequence_container_traits<Type>::resize},
-          begin_fn{&meta_sequence_container_traits<Type>::begin},
-          end_fn{&meta_sequence_container_traits<Type>::end},
+          iter_fn{&meta_sequence_container_traits<Type>::iter},
           insert_fn{&meta_sequence_container_traits<Type>::insert},
           erase_fn{&meta_sequence_container_traits<Type>::erase},
           storage{std::move(instance)} {}
@@ -83,8 +82,7 @@ private:
     internal::meta_type_node *value_type_node = nullptr;
     size_type (*size_fn)(const any &) ENTT_NOEXCEPT = nullptr;
     bool (*resize_fn)(any &, size_type) = nullptr;
-    iterator (*begin_fn)(any &) = nullptr;
-    iterator (*end_fn)(any &) = nullptr;
+    iterator (*iter_fn)(any &, const bool) = nullptr;
     iterator (*insert_fn)(any &, const std::ptrdiff_t, meta_any &) = nullptr;
     iterator (*erase_fn)(any &, const std::ptrdiff_t) = nullptr;
     any storage{};
@@ -1645,7 +1643,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 begin_fn(storage);
+    return iter_fn(storage, false);
 }
 
 /**
@@ -1653,7 +1651,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 end_fn(storage);
+    return iter_fn(storage, true);
 }
 
 /**