diff --git a/src/entt/meta/meta.hpp b/src/entt/meta/meta.hpp index ed6dc071d..6363a479d 100644 --- a/src/entt/meta/meta.hpp +++ b/src/entt/meta/meta.hpp @@ -164,14 +164,14 @@ using meta_any_policy [[deprecated("use any_policy instead")]] = any_policy; /*! @brief Opaque wrapper for values of any type. */ class meta_any { - using vtable_type = void(const internal::meta_traits op, const bool, const meta_any &, void *); + using vtable_type = void(const internal::meta_traits op, const meta_any &, void *); template - static void basic_vtable([[maybe_unused]] const internal::meta_traits req, [[maybe_unused]] const bool const_only, [[maybe_unused]] const meta_any &self, [[maybe_unused]] void *other) { + static void basic_vtable([[maybe_unused]] const internal::meta_traits req, [[maybe_unused]] const meta_any &self, [[maybe_unused]] void *other) { static_assert(std::is_same_v>, Type>, "Invalid type"); if constexpr(is_meta_pointer_like_v) { - if(req == internal::meta_traits::is_meta_pointer_like) { + if(!!(req & internal::meta_traits::is_meta_pointer_like)) { if constexpr(std::is_function_v::element_type>) { static_cast(other)->emplace(*static_cast(self.data())); } else if constexpr(!std::is_void_v::element_type>>) { @@ -189,14 +189,14 @@ class meta_any { } if constexpr(is_complete_v>) { - if(req == internal::meta_traits::is_meta_sequence_container) { - *static_cast(other) = const_only ? meta_sequence_container{*self.ctx, *static_cast(self.data())} : meta_sequence_container{*self.ctx, *static_cast(const_cast(self.data()))}; + if(!!(req & internal::meta_traits::is_meta_sequence_container)) { + *static_cast(other) = !!(req & internal::meta_traits::is_const) ? meta_sequence_container{*self.ctx, *static_cast(self.data())} : meta_sequence_container{*self.ctx, *static_cast(const_cast(self.data()))}; } } if constexpr(is_complete_v>) { - if(req == internal::meta_traits::is_meta_associative_container) { - *static_cast(other) = const_only ? meta_associative_container{*self.ctx, *static_cast(self.data())} : meta_associative_container{*self.ctx, *static_cast(const_cast(self.data()))}; + if(!!(req & internal::meta_traits::is_meta_associative_container)) { + *static_cast(other) = !!(req & internal::meta_traits::is_const) ? meta_associative_container{*self.ctx, *static_cast(self.data())} : meta_associative_container{*self.ctx, *static_cast(const_cast(self.data()))}; } } } @@ -526,14 +526,14 @@ public: */ [[nodiscard]] meta_sequence_container as_sequence_container() noexcept { meta_sequence_container proxy{}; - vtable(internal::meta_traits::is_meta_sequence_container, storage.policy() == any_policy::cref, *this, &proxy); + vtable(internal::meta_traits::is_meta_sequence_container | (storage.policy() == any_policy::cref ? internal::meta_traits::is_const : internal::meta_traits::is_none), *this, &proxy); return proxy; } /*! @copydoc as_sequence_container */ [[nodiscard]] meta_sequence_container as_sequence_container() const noexcept { meta_sequence_container proxy{}; - vtable(internal::meta_traits::is_meta_sequence_container, true, *this, &proxy); + vtable(internal::meta_traits::is_meta_sequence_container | internal::meta_traits::is_const, *this, &proxy); return proxy; } @@ -543,14 +543,14 @@ public: */ [[nodiscard]] meta_associative_container as_associative_container() noexcept { meta_associative_container proxy{}; - vtable(internal::meta_traits::is_meta_associative_container, storage.policy() == any_policy::cref, *this, &proxy); + vtable(internal::meta_traits::is_meta_associative_container | (storage.policy() == any_policy::cref ? internal::meta_traits::is_const : internal::meta_traits::is_none), *this, &proxy); return proxy; } /*! @copydoc as_associative_container */ [[nodiscard]] meta_associative_container as_associative_container() const noexcept { meta_associative_container proxy{}; - vtable(internal::meta_traits::is_meta_associative_container, true, *this, &proxy); + vtable(internal::meta_traits::is_meta_associative_container | internal::meta_traits::is_const, *this, &proxy); return proxy; } @@ -561,7 +561,7 @@ public: */ [[nodiscard]] meta_any operator*() const noexcept { meta_any ret{meta_ctx_arg, *ctx}; - vtable(internal::meta_traits::is_meta_pointer_like, true, *this, &ret); + vtable(internal::meta_traits::is_meta_pointer_like, *this, &ret); return ret; }