Browse Source

meta: further reduce vtable size for meta associative containers

Michele Caini 2 years ago
parent
commit
3ae6613445
2 changed files with 13 additions and 26 deletions
  1. 10 23
      src/entt/meta/container.hpp
  2. 3 3
      src/entt/meta/meta.hpp

+ 10 - 23
src/entt/meta/container.hpp

@@ -178,34 +178,21 @@ class basic_meta_associative_container_traits {
 
             return true;
         case operation::insert:
-            if(key->allow_cast<const typename Type::key_type &>()) {
-                if constexpr(key_only) {
-                    return static_cast<Type *>(value)->insert(key->cast<const typename Type::key_type &>()).second;
-                } else {
-                    auto &as_any = *static_cast<meta_any *>(const_cast<void *>(cvalue));
-                    return as_any.allow_cast<const typename Type::mapped_type &>() && static_cast<Type *>(value)->emplace(key->cast<const typename Type::key_type &>(), as_any.cast<const typename Type::mapped_type &>()).second;
-                }
+            if constexpr(key_only) {
+                return static_cast<Type *>(value)->insert(key->cast<const typename Type::key_type &>()).second;
+            } else {
+                return static_cast<Type *>(value)->emplace(key->cast<const typename Type::key_type &>(), static_cast<meta_any *>(const_cast<void *>(cvalue))->cast<const typename Type::mapped_type &>()).second;
             }
-
-            break;
         case operation::erase:
-            if(key->allow_cast<const typename Type::key_type &>()) {
-                return static_cast<Type *>(value)->erase(key->cast<const typename Type::key_type &>());
-            }
-
-            break;
+            return static_cast<Type *>(value)->erase(key->cast<const typename Type::key_type &>());
         case operation::find:
-            if(key->allow_cast<const typename Type::key_type &>()) {
-                if(value) {
-                    it->rebind<key_only>(static_cast<Type *>(value)->find(key->cast<const typename Type::key_type &>()));
-                } else {
-                    it->rebind<key_only>(static_cast<const Type *>(cvalue)->find(key->cast<const typename Type::key_type &>()));
-                }
-
-                return true;
+            if(value) {
+                it->rebind<key_only>(static_cast<Type *>(value)->find(key->cast<const typename Type::key_type &>()));
+            } else {
+                it->rebind<key_only>(static_cast<const Type *>(cvalue)->find(key->cast<const typename Type::key_type &>()));
             }
 
-            break;
+            return true;
         }
 
         return false;

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

@@ -1922,7 +1922,7 @@ inline bool meta_associative_container::reserve(const size_type sz) {
  * @return A bool denoting whether the insertion took place.
  */
 inline bool meta_associative_container::insert(meta_any key, meta_any value = {}) {
-    return ((storage.policy() != any_policy::cref) && vtable(operation::insert, &value, storage.data(), &key, nullptr));
+    return (storage.policy() != any_policy::cref) && key.allow_cast(meta_type{*ctx, key_type_node(internal::meta_context::from(*ctx))}) && (!mapped_type_node || value.allow_cast(meta_type{*ctx, mapped_type_node(internal::meta_context::from(*ctx))})) && vtable(operation::insert, &value, storage.data(), &key, nullptr);
 }
 
 /**
@@ -1931,7 +1931,7 @@ inline bool meta_associative_container::insert(meta_any key, meta_any value = {}
  * @return A bool denoting whether the removal took place.
  */
 inline meta_associative_container::size_type meta_associative_container::erase(meta_any key) {
-    return ((storage.policy() != any_policy::cref) && vtable(operation::erase, nullptr, storage.data(), &key, nullptr));
+    return (storage.policy() != any_policy::cref) && key.allow_cast(meta_type{*ctx, key_type_node(internal::meta_context::from(*ctx))}) && vtable(operation::erase, nullptr, storage.data(), &key, nullptr);
 }
 
 /**
@@ -1942,7 +1942,7 @@ inline meta_associative_container::size_type meta_associative_container::erase(m
 [[nodiscard]] inline meta_associative_container::iterator meta_associative_container::find(meta_any key) {
     iterator it{*ctx};
     const void *data = std::as_const(storage).data();
-    vtable(operation::find, data, storage.policy() == any_policy::cref ? nullptr : const_cast<void *>(data), &key, &it);
+    key.allow_cast(meta_type{*ctx, key_type_node(internal::meta_context::from(*ctx))}) && vtable(operation::find, data, storage.policy() == any_policy::cref ? nullptr : const_cast<void *>(data), &key, &it);
     return it;
 }