Browse Source

meta: minor changes

Michele Caini 5 years ago
parent
commit
a8d004334a
1 changed files with 22 additions and 28 deletions
  1. 22 28
      src/entt/meta/meta.hpp

+ 22 - 28
src/entt/meta/meta.hpp

@@ -139,20 +139,20 @@ class meta_any {
     }
     }
 
 
     template<typename Type>
     template<typename Type>
-    [[nodiscard]] static auto * meta_sequence_container_factory() ENTT_NOEXCEPT {
+    [[nodiscard]] static meta_sequence_container meta_sequence_container_factory([[maybe_unused]] void *container) ENTT_NOEXCEPT {
         if constexpr(has_meta_sequence_container_traits_v<Type>) {
         if constexpr(has_meta_sequence_container_traits_v<Type>) {
-            return +[](void *container) -> meta_sequence_container { return *static_cast<Type *>(container); };
+            return *static_cast<Type *>(container);
         } else {
         } else {
-            return static_cast<decltype(seq_factory)>(nullptr);
+            return {};
         }
         }
     }
     }
 
 
     template<typename Type>
     template<typename Type>
-    [[nodiscard]] static auto * meta_associative_container_factory() ENTT_NOEXCEPT {
+    [[nodiscard]] static meta_associative_container meta_associative_container_factory([[maybe_unused]] void *container) ENTT_NOEXCEPT {
         if constexpr(has_meta_associative_container_traits_v<Type>) {
         if constexpr(has_meta_associative_container_traits_v<Type>) {
-            return +[](void *container) -> meta_associative_container { return *static_cast<Type *>(container); };
+            return *static_cast<Type *>(container);
         } else {
         } else {
-            return static_cast<decltype(assoc_factory)>(nullptr);
+            return {};
         }
         }
     }
     }
 
 
@@ -177,8 +177,8 @@ public:
         : storage(std::in_place_type<Type>, std::forward<Args>(args)...),
         : storage(std::in_place_type<Type>, std::forward<Args>(args)...),
           node{internal::meta_info<Type>::resolve()},
           node{internal::meta_info<Type>::resolve()},
           deref{&dereference_operator<Type>},
           deref{&dereference_operator<Type>},
-          seq_factory{meta_sequence_container_factory<Type>()},
-          assoc_factory{meta_associative_container_factory<Type>()}
+          seq_factory{&meta_sequence_container_factory<Type>},
+          assoc_factory{&meta_associative_container_factory<Type>}
     {}
     {}
 
 
     /**
     /**
@@ -191,8 +191,8 @@ public:
         : storage{value},
         : storage{value},
           node{internal::meta_info<Type>::resolve()},
           node{internal::meta_info<Type>::resolve()},
           deref{&dereference_operator<Type>},
           deref{&dereference_operator<Type>},
-          seq_factory{meta_sequence_container_factory<Type>()},
-          assoc_factory{meta_associative_container_factory<Type>()}
+          seq_factory{&meta_sequence_container_factory<Type>},
+          assoc_factory{&meta_associative_container_factory<Type>}
     {}
     {}
 
 
     /**
     /**
@@ -380,7 +380,7 @@ public:
      * @return A sequence container proxy for the underlying object.
      * @return A sequence container proxy for the underlying object.
      */
      */
     [[nodiscard]] meta_sequence_container as_sequence_container() ENTT_NOEXCEPT {
     [[nodiscard]] meta_sequence_container as_sequence_container() ENTT_NOEXCEPT {
-        return seq_factory ? seq_factory(storage.data()) : meta_sequence_container{};
+        return seq_factory(storage.data());
     }
     }
 
 
     /**
     /**
@@ -388,7 +388,7 @@ public:
      * @return An associative container proxy for the underlying object.
      * @return An associative container proxy for the underlying object.
      */
      */
     [[nodiscard]] meta_associative_container as_associative_container() ENTT_NOEXCEPT {
     [[nodiscard]] meta_associative_container as_associative_container() ENTT_NOEXCEPT {
-        return assoc_factory ? assoc_factory(storage.data()) : meta_associative_container{};
+        return assoc_factory(storage.data());
     }
     }
 
 
     /**
     /**
@@ -424,8 +424,8 @@ public:
      */
      */
     friend void swap(meta_any &lhs, meta_any &rhs) {
     friend void swap(meta_any &lhs, meta_any &rhs) {
         using std::swap;
         using std::swap;
-        swap(lhs.node, rhs.node);
         swap(lhs.storage, rhs.storage);
         swap(lhs.storage, rhs.storage);
+        swap(lhs.node, rhs.node);
         swap(lhs.deref, rhs.deref);
         swap(lhs.deref, rhs.deref);
         swap(lhs.seq_factory, rhs.seq_factory);
         swap(lhs.seq_factory, rhs.seq_factory);
         swap(lhs.assoc_factory, rhs.assoc_factory);
         swap(lhs.assoc_factory, rhs.assoc_factory);
@@ -900,14 +900,12 @@ struct meta_func {
      */
      */
     template<typename... Args>
     template<typename... Args>
     meta_any invoke(meta_handle instance, Args &&... args) const {
     meta_any invoke(meta_handle instance, Args &&... args) const {
-        meta_any any{};
-
         if(sizeof...(Args) == size()) {
         if(sizeof...(Args) == size()) {
             std::array<meta_any, sizeof...(Args)> arguments{std::forward<Args>(args)...};
             std::array<meta_any, sizeof...(Args)> arguments{std::forward<Args>(args)...};
-            any = node->invoke(std::move(instance), arguments.data());
+            return node->invoke(std::move(instance), arguments.data());
+        } else {
+            return meta_any{};
         }
         }
-
-        return any;
     }
     }
 
 
     /*! @copydoc meta_ctor::prop */
     /*! @copydoc meta_ctor::prop */
@@ -1338,18 +1336,14 @@ public:
      */
      */
     template<typename... Args>
     template<typename... Args>
     [[nodiscard]] meta_any construct(Args &&... args) const {
     [[nodiscard]] meta_any construct(Args &&... args) const {
-        auto construct_if = [this](meta_any *params) {
-            meta_any any{};
-
-            internal::find_if<&node_type::ctor>([params, &any](const auto *curr) {
-                return (curr->size == sizeof...(args)) && (any = curr->invoke(params));
-            }, node);
+        std::array<meta_any, sizeof...(Args)> arguments{std::forward<Args>(args)...};
+        meta_any any{};
 
 
-            return any;
-        };
+        internal::find_if<&node_type::ctor>([&arguments, &any](const auto *curr) {
+            return (curr->size == sizeof...(args)) && (any = curr->invoke(arguments.data()));
+        }, node);
 
 
-        std::array<meta_any, sizeof...(Args)> arguments{std::forward<Args>(args)...};
-        return construct_if(arguments.data());
+        return any;
     }
     }
 
 
     /**
     /**