From c06280894b19f00a1b1db92fc68eb1efbead87ff Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Mon, 10 Oct 2022 15:13:22 +0200 Subject: [PATCH] meta: make internal meta_invoke accept meta contexts and use them properly --- src/entt/meta/utility.hpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/entt/meta/utility.hpp b/src/entt/meta/utility.hpp index 160cf962b..a49133e84 100644 --- a/src/entt/meta/utility.hpp +++ b/src/entt/meta/utility.hpp @@ -309,34 +309,34 @@ template namespace internal { template -[[nodiscard]] meta_any meta_invoke_with_args(Candidate &&candidate, Args &&...args) { +[[nodiscard]] meta_any meta_invoke_with_args(const meta_ctx &ctx, Candidate &&candidate, Args &&...args) { if constexpr(std::is_same_v(candidate), args...)), void>) { std::invoke(std::forward(candidate), args...); - return meta_any{std::in_place_type}; + return meta_any{ctx, std::in_place_type}; } else { - return meta_dispatch(std::invoke(std::forward(candidate), args...)); + return meta_dispatch(ctx, std::invoke(std::forward(candidate), args...)); } } template -[[nodiscard]] meta_any meta_invoke([[maybe_unused]] meta_handle instance, Candidate &&candidate, [[maybe_unused]] meta_any *args, std::index_sequence) { +[[nodiscard]] meta_any meta_invoke(const meta_ctx &ctx, [[maybe_unused]] meta_handle instance, Candidate &&candidate, [[maybe_unused]] meta_any *args, std::index_sequence) { using descriptor = meta_function_helper_t>; if constexpr(std::is_invocable_v, const Type &, type_list_element_t...>) { if(const auto *const clazz = instance->try_cast(); clazz && ((args + Index)->allow_cast>() && ...)) { - return meta_invoke_with_args(std::forward(candidate), *clazz, (args + Index)->cast>()...); + return meta_invoke_with_args(ctx, std::forward(candidate), *clazz, (args + Index)->cast>()...); } } else if constexpr(std::is_invocable_v, Type &, type_list_element_t...>) { if(auto *const clazz = instance->try_cast(); clazz && ((args + Index)->allow_cast>() && ...)) { - return meta_invoke_with_args(std::forward(candidate), *clazz, (args + Index)->cast>()...); + return meta_invoke_with_args(ctx, std::forward(candidate), *clazz, (args + Index)->cast>()...); } } else { if(((args + Index)->allow_cast>() && ...)) { - return meta_invoke_with_args(std::forward(candidate), (args + Index)->cast>()...); + return meta_invoke_with_args(ctx, std::forward(candidate), (args + Index)->cast>()...); } } - return meta_any{}; + return meta_any{meta_ctx_arg, ctx}; } template @@ -368,7 +368,7 @@ template */ template [[nodiscard]] meta_any meta_invoke_with(const meta_ctx &ctx, Candidate &&candidate, meta_handle instance, meta_any *const args) { - return internal::meta_invoke(std::move(instance), std::forward(candidate), args, std::make_index_sequence>::args_type::size>{}); + return internal::meta_invoke(ctx, std::move(instance), std::forward(candidate), args, std::make_index_sequence>::args_type::size>{}); } /** @@ -397,8 +397,8 @@ template * @return A meta any containing the returned value, if any. */ template -[[nodiscard]] meta_any meta_invoke(const meta_ctx &ctx /*_TODO*/, meta_handle instance, meta_any *const args) { - return internal::meta_invoke(std::move(instance), Candidate, args, std::make_index_sequence>::args_type::size>{}); +[[nodiscard]] meta_any meta_invoke(const meta_ctx &ctx, meta_handle instance, meta_any *const args) { + return internal::meta_invoke(ctx, std::move(instance), Candidate, args, std::make_index_sequence>::args_type::size>{}); } /** @@ -451,11 +451,11 @@ template * @return A meta any containing the returned value, if any. */ template -[[nodiscard]] meta_any meta_construct_with(const meta_ctx &ctx /*_TODO*/, Candidate &&candidate, meta_any *const args) { +[[nodiscard]] meta_any meta_construct_with(const meta_ctx &ctx, Candidate &&candidate, meta_any *const args) { if constexpr(meta_function_helper_t::is_static || std::is_class_v>>) { - return internal::meta_invoke({}, std::forward(candidate), args, std::make_index_sequence>::args_type::size>{}); + return internal::meta_invoke(ctx, {}, std::forward(candidate), args, std::make_index_sequence>::args_type::size>{}); } else { - return internal::meta_invoke(*args, std::forward(candidate), args + 1u, std::make_index_sequence>::args_type::size>{}); + return internal::meta_invoke(ctx, *args, std::forward(candidate), args + 1u, std::make_index_sequence>::args_type::size>{}); } }