diff --git a/src/entt/meta/container.hpp b/src/entt/meta/container.hpp index 7d6eff44e..60e13db65 100644 --- a/src/entt/meta/container.hpp +++ b/src/entt/meta/container.hpp @@ -52,44 +52,44 @@ struct basic_meta_sequence_container_traits { using size_type = typename meta_sequence_container::size_type; using iterator = typename meta_sequence_container::iterator; - static size_type basic_vtable(const operation op, const meta_ctx &ctx, const void *container, void *value, iterator *it) { - switch(const Type *cont = static_cast(container); op) { + static size_type basic_vtable(const operation op, const meta_ctx &ctx, const void *cvalue, void *value, iterator *it) { + switch(op) { case operation::size: - return cont->size(); + return static_cast(cvalue)->size(); case operation::clear: if constexpr(dynamic_sequence_container::value) { - const_cast(cont)->clear(); + static_cast(value)->clear(); return true; } else { break; } case operation::reserve: if constexpr(reserve_aware_container::value) { - const_cast(cont)->reserve(*static_cast(value)); + static_cast(value)->reserve(*static_cast(cvalue)); return true; } else { break; } case operation::resize: if constexpr(dynamic_sequence_container::value) { - const_cast(cont)->resize(*static_cast(value)); + static_cast(value)->resize(*static_cast(cvalue)); return true; } else { break; } case operation::begin: if(value) { - *it = iterator{ctx, const_cast(cont)->begin()}; + *it = iterator{ctx, static_cast(value)->begin()}; } else { - *it = iterator{ctx, cont->begin()}; + *it = iterator{ctx, static_cast(cvalue)->begin()}; } return true; case operation::end: if(value) { - *it = iterator{ctx, const_cast(cont)->end()}; + *it = iterator{ctx, static_cast(value)->end()}; } else { - *it = iterator{ctx, cont->end()}; + *it = iterator{ctx, static_cast(cvalue)->end()}; } return true; @@ -101,13 +101,13 @@ struct basic_meta_sequence_container_traits { if(op == operation::insert) { // this abomination is necessary because only on macos value_type and const_reference are different types for std::vector - if(static_cast(value)->allow_cast() || static_cast(value)->allow_cast()) { - const auto *element = static_cast(value)->try_cast>(); - *it = iterator{ctx, const_cast(cont)->insert(underlying, element ? *element : static_cast(value)->cast())}; + if(auto &any = *static_cast(const_cast(cvalue)); any.allow_cast() || any.allow_cast()) { + const auto *element = any.try_cast>(); + *it = iterator{ctx, static_cast(value)->insert(underlying, element ? *element : any.cast())}; return true; } } else { - *it = iterator{ctx, const_cast(cont)->erase(underlying)}; + *it = iterator{ctx, static_cast(value)->erase(underlying)}; return true; } } @@ -129,63 +129,63 @@ struct basic_meta_associative_container_traits { static constexpr auto key_only = key_only_associative_container::value; - static size_type basic_vtable(const operation op, const meta_ctx &ctx, const void *container, meta_any *key, void *value, iterator *it) { - switch(const Type *cont = static_cast(container); op) { + static size_type basic_vtable(const operation op, const meta_ctx &ctx, const void *cvalue, void *value, meta_any *key, iterator *it) { + switch(op) { case operation::size: - return cont->size(); + return static_cast(cvalue)->size(); case operation::clear: - const_cast(cont)->clear(); + static_cast(value)->clear(); return true; case operation::reserve: if constexpr(reserve_aware_container::value) { - const_cast(cont)->reserve(*static_cast(value)); + static_cast(value)->reserve(*static_cast(cvalue)); return true; } else { break; } case operation::begin: if(value) { - *it = iterator{ctx, std::bool_constant{}, const_cast(cont)->begin()}; + *it = iterator{ctx, std::bool_constant{}, static_cast(value)->begin()}; } else { - *it = iterator{ctx, std::bool_constant{}, cont->begin()}; + *it = iterator{ctx, std::bool_constant{}, static_cast(cvalue)->begin()}; } return true; case operation::end: if(value) { - *it = iterator{ctx, std::bool_constant{}, const_cast(cont)->end()}; + *it = iterator{ctx, std::bool_constant{}, static_cast(value)->end()}; } else { - *it = iterator{ctx, std::bool_constant{}, cont->end()}; + *it = iterator{ctx, std::bool_constant{}, static_cast(cvalue)->end()}; } return true; case operation::insert: if(key->allow_cast()) { if constexpr(key_only) { - return const_cast(cont)->insert(key->cast()).second; + return static_cast(value)->insert(key->cast()).second; } else { - meta_any *val = static_cast(value); - return val->allow_cast() && const_cast(cont)->emplace(key->cast(), val->cast()).second; + auto &any = *static_cast(const_cast(cvalue)); + return any.allow_cast() && static_cast(value)->emplace(key->cast(), any.cast()).second; } } break; case operation::erase: if(key->allow_cast()) { - return const_cast(cont)->erase(key->cast()); + return static_cast(value)->erase(key->cast()); } break; case operation::find: if(key->allow_cast()) { if(value) { - *it = iterator{ctx, std::bool_constant{}, const_cast(cont)->find(key->cast())}; + *it = iterator{ctx, std::bool_constant{}, static_cast(value)->find(key->cast())}; } else { - *it = iterator{ctx, std::bool_constant{}, cont->find(key->cast())}; + *it = iterator{ctx, std::bool_constant{}, static_cast(cvalue)->find(key->cast())}; } return true; - } + } break; } diff --git a/src/entt/meta/meta.hpp b/src/entt/meta/meta.hpp index 9d26f5c79..fc86da6a2 100644 --- a/src/entt/meta/meta.hpp +++ b/src/entt/meta/meta.hpp @@ -170,7 +170,7 @@ private: internal::meta_type_node (*key_type_node)(const internal::meta_context &){}; internal::meta_type_node (*mapped_type_node)(const internal::meta_context &){}; internal::meta_type_node (*value_type_node)(const internal::meta_context &){}; - size_type (*vtable)(const operation, const meta_ctx &, const void *, meta_any *, void *, iterator *){}; + size_type (*vtable)(const operation, const meta_ctx &, const void *, void *, meta_any *, iterator *){}; any storage{}; }; @@ -1875,8 +1875,7 @@ private: * @return True in case of success, false otherwise. */ inline bool meta_sequence_container::resize(const size_type sz) { - auto local = sz; - return (storage.policy() != any_policy::cref) && vtable(operation::resize, *ctx, storage.data(), &local, nullptr); + return (storage.policy() != any_policy::cref) && vtable(operation::resize, *ctx, &sz, storage.data(), nullptr); } /** @@ -1884,7 +1883,7 @@ inline bool meta_sequence_container::resize(const size_type sz) { * @return True in case of success, false otherwise. */ inline bool meta_sequence_container::clear() { - return (storage.policy() != any_policy::cref) && vtable(operation::clear, *ctx, storage.data(), nullptr, nullptr); + return (storage.policy() != any_policy::cref) && vtable(operation::clear, *ctx, nullptr, storage.data(), nullptr); } /** @@ -1893,8 +1892,7 @@ inline bool meta_sequence_container::clear() { * @return True in case of success, false otherwise. */ inline bool meta_sequence_container::reserve(const size_type sz) { - auto local = sz; - return (storage.policy() != any_policy::cref) && vtable(operation::reserve, *ctx, storage.data(), &local, nullptr); + return (storage.policy() != any_policy::cref) && vtable(operation::reserve, *ctx, &sz, storage.data(), nullptr); } /** @@ -1926,7 +1924,7 @@ inline bool meta_sequence_container::reserve(const size_type sz) { * @return A possibly invalid iterator to the inserted element. */ inline meta_sequence_container::iterator meta_sequence_container::insert(iterator it, meta_any value) { - return ((storage.policy() != any_policy::cref) && vtable(operation::insert, *ctx, storage.data(), &value, &it)) ? it : iterator{}; + return ((storage.policy() != any_policy::cref) && vtable(operation::insert, *ctx, &value, storage.data(), &it)) ? it : iterator{}; } /** @@ -1935,7 +1933,7 @@ inline meta_sequence_container::iterator meta_sequence_container::insert(iterato * @return A possibly invalid iterator following the last removed element. */ inline meta_sequence_container::iterator meta_sequence_container::erase(iterator it) { - return ((storage.policy() != any_policy::cref) && vtable(operation::erase, *ctx, storage.data(), nullptr, &it)) ? it : iterator{}; + return ((storage.policy() != any_policy::cref) && vtable(operation::erase, *ctx, nullptr, storage.data(), &it)) ? it : iterator{}; } /** @@ -1994,20 +1992,19 @@ inline meta_sequence_container::iterator meta_sequence_container::erase(iterator /*! @copydoc meta_sequence_container::clear */ inline bool meta_associative_container::clear() { - return (storage.policy() != any_policy::cref) && vtable(operation::clear, *ctx, storage.data(), nullptr, nullptr, nullptr); + return (storage.policy() != any_policy::cref) && vtable(operation::clear, *ctx, nullptr, storage.data(), nullptr, nullptr); } /*! @copydoc meta_sequence_container::reserve */ inline bool meta_associative_container::reserve(const size_type sz) { - auto local = sz; - return (storage.policy() != any_policy::cref) && vtable(operation::reserve, *ctx, storage.data(), nullptr, &local, nullptr); + return (storage.policy() != any_policy::cref) && vtable(operation::reserve, *ctx, &sz, storage.data(), nullptr, nullptr); } /*! @copydoc meta_sequence_container::begin */ [[nodiscard]] inline meta_associative_container::iterator meta_associative_container::begin() { iterator it{}; const void *data = std::as_const(storage).data(); - vtable(operation::begin, *ctx, data, nullptr, storage.policy() == any_policy::cref ? nullptr : const_cast(data), &it); + vtable(operation::begin, *ctx, data, storage.policy() == any_policy::cref ? nullptr : const_cast(data), nullptr, &it); return it; } @@ -2015,7 +2012,7 @@ inline bool meta_associative_container::reserve(const size_type sz) { [[nodiscard]] inline meta_associative_container::iterator meta_associative_container::end() { iterator it{}; const void *data = std::as_const(storage).data(); - vtable(operation::end, *ctx, data, nullptr, storage.policy() == any_policy::cref ? nullptr : const_cast(data), &it); + vtable(operation::end, *ctx, data, storage.policy() == any_policy::cref ? nullptr : const_cast(data), nullptr, &it); return it; } @@ -2026,7 +2023,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, *ctx, storage.data(), &key, &value, nullptr)); + return ((storage.policy() != any_policy::cref) && vtable(operation::insert, *ctx, &value, storage.data(), &key, nullptr)); } /** @@ -2035,7 +2032,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, *ctx, storage.data(), &key, nullptr, nullptr)); + return ((storage.policy() != any_policy::cref) && vtable(operation::erase, *ctx, nullptr, storage.data(), &key, nullptr)); } /** @@ -2046,7 +2043,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{}; const void *data = std::as_const(storage).data(); - vtable(operation::find, *ctx, data, &key, storage.policy() == any_policy::cref ? nullptr : const_cast(data), &it); + vtable(operation::find, *ctx, data, storage.policy() == any_policy::cref ? nullptr : const_cast(data), &key, &it); return it; }