diff --git a/include/proxy/v4/proxy.h b/include/proxy/v4/proxy.h index ae9903f..96ef1d1 100644 --- a/include/proxy/v4/proxy.h +++ b/include/proxy/v4/proxy.h @@ -924,6 +924,43 @@ class proxy_indirect_accessor proxy_indirect_accessor() = default; proxy_indirect_accessor(const proxy_indirect_accessor&) = default; proxy_indirect_accessor& operator=(const proxy_indirect_accessor&) = default; + +public: + template + friend auto invoke(proxy_indirect_accessor& p, Args&&... args) -> + typename details::overload_traits::return_type { + return details::invoke_impl( + details::as_proxy(p), + std::forward(args)...); + } + template + friend auto invoke(const proxy_indirect_accessor& p, Args&&... args) -> + typename details::overload_traits::return_type { + return details::invoke_impl( + details::as_proxy(p), + std::forward(args)...); + } + template + friend auto invoke(proxy_indirect_accessor&& p, Args&&... args) -> + typename details::overload_traits::return_type { + return details::invoke_impl( + details::as_proxy(std::move(p)), + std::forward(args)...); + } + template + friend auto invoke(const proxy_indirect_accessor&& p, Args&&... args) -> + typename details::overload_traits::return_type { + return details::invoke_impl( + details::as_proxy(std::move(p)), + std::forward(args)...); + } + template + friend const R& reflect(const proxy_indirect_accessor& p) noexcept { + return static_cast&>( + details::proxy_helper::get_meta( + details::as_proxy(p))) + .reflector; + } }; template @@ -1118,6 +1155,34 @@ class proxy : public details::facade_traits::direct_accessor, friend bool operator==(const proxy& lhs, std::nullptr_t) noexcept { return !lhs.has_value(); } + template + friend auto invoke(proxy& p, Args&&... args) -> + typename details::overload_traits::return_type { + return details::invoke_impl(p, std::forward(args)...); + } + template + friend auto invoke(const proxy& p, Args&&... args) -> + typename details::overload_traits::return_type { + return details::invoke_impl(p, std::forward(args)...); + } + template + friend auto invoke(proxy&& p, Args&&... args) -> + typename details::overload_traits::return_type { + return details::invoke_impl(std::move(p), + std::forward(args)...); + } + template + friend auto invoke(const proxy&& p, Args&&... args) -> + typename details::overload_traits::return_type { + return details::invoke_impl(std::move(p), + std::forward(args)...); + } + template + friend const R& reflect(const proxy& p) noexcept { + return static_cast&>( + details::proxy_helper::get_meta(p)) + .reflector; + } private: void initialize() { @@ -1133,10 +1198,9 @@ class proxy : public details::facade_traits::direct_accessor, std::ranges::uninitialized_copy(rhs.ptr_, ptr_); meta_ = rhs.meta_; } else { - proxy_invoke(rhs, - *this); + invoke(rhs, *this); } } else { meta_.reset(); @@ -1152,9 +1216,9 @@ class proxy : public details::facade_traits::direct_accessor, meta_ = rhs.meta_; rhs.meta_.reset(); } else { - proxy_invoke( + invoke( std::move(rhs), *this); } } else { @@ -1179,9 +1243,9 @@ class proxy : public details::facade_traits::direct_accessor, { if constexpr (F::destructibility != constraint_level::trivial) { if (meta_.has_value()) { - proxy_invoke(*this); + invoke(*this); } } } @@ -1200,68 +1264,63 @@ class proxy : public details::facade_traits::direct_accessor, }; template -auto proxy_invoke(proxy_indirect_accessor& p, Args&&... args) -> +[[deprecated("Use unqualified invoke instead")]] auto + proxy_invoke(proxy_indirect_accessor& p, Args&&... args) -> typename details::overload_traits::return_type { - return details::invoke_impl( - details::as_proxy(p), - std::forward(args)...); + return invoke(p, std::forward(args)...); } template -auto proxy_invoke(const proxy_indirect_accessor& p, Args&&... args) -> +[[deprecated("Use unqualified invoke instead")]] auto + proxy_invoke(const proxy_indirect_accessor& p, Args&&... args) -> typename details::overload_traits::return_type { - return details::invoke_impl( - details::as_proxy(p), - std::forward(args)...); + return invoke(p, std::forward(args)...); } template -auto proxy_invoke(proxy_indirect_accessor&& p, Args&&... args) -> +[[deprecated("Use unqualified invoke instead")]] auto + proxy_invoke(proxy_indirect_accessor&& p, Args&&... args) -> typename details::overload_traits::return_type { - return details::invoke_impl( - details::as_proxy(std::move(p)), - std::forward(args)...); + return invoke(std::move(p), std::forward(args)...); } template -auto proxy_invoke(const proxy_indirect_accessor&& p, Args&&... args) -> +[[deprecated("Use unqualified invoke instead")]] auto + proxy_invoke(const proxy_indirect_accessor&& p, Args&&... args) -> typename details::overload_traits::return_type { - return details::invoke_impl( - details::as_proxy(std::move(p)), - std::forward(args)...); + return invoke(std::move(p), std::forward(args)...); } template -auto proxy_invoke(proxy& p, Args&&... args) -> +[[deprecated("Use unqualified invoke instead")]] auto + proxy_invoke(proxy& p, Args&&... args) -> typename details::overload_traits::return_type { - return details::invoke_impl(p, std::forward(args)...); + return invoke(p, std::forward(args)...); } template -auto proxy_invoke(const proxy& p, Args&&... args) -> +[[deprecated("Use unqualified invoke instead")]] auto + proxy_invoke(const proxy& p, Args&&... args) -> typename details::overload_traits::return_type { - return details::invoke_impl(p, std::forward(args)...); + return invoke(p, std::forward(args)...); } template -auto proxy_invoke(proxy&& p, Args&&... args) -> +[[deprecated("Use unqualified invoke instead")]] auto + proxy_invoke(proxy&& p, Args&&... args) -> typename details::overload_traits::return_type { - return details::invoke_impl(std::move(p), - std::forward(args)...); + return invoke(std::move(p), std::forward(args)...); } template -auto proxy_invoke(const proxy&& p, Args&&... args) -> +[[deprecated("Use unqualified invoke instead")]] auto + proxy_invoke(const proxy&& p, Args&&... args) -> typename details::overload_traits::return_type { - return details::invoke_impl(std::move(p), - std::forward(args)...); + return invoke(std::move(p), std::forward(args)...); } template -const R& proxy_reflect(const proxy_indirect_accessor& p) noexcept { - return static_cast&>( - details::proxy_helper::get_meta( - details::as_proxy(p))) - .reflector; +[[deprecated("Use unqualified reflect instead")]] const R& + proxy_reflect(const proxy_indirect_accessor& p) noexcept { + return reflect(p); } template -const R& proxy_reflect(const proxy& p) noexcept { - return static_cast&>( - details::proxy_helper::get_meta(p)) - .reflector; +[[deprecated("Use unqualified reflect instead")]] const R& + proxy_reflect(const proxy& p) noexcept { + return reflect(p); } // ============================================================================= @@ -1324,7 +1383,7 @@ struct converter { return nullptr; \ } \ } \ - return proxy_invoke(static_cast

(*this)); \ + return invoke(static_cast

(*this)); \ } \ } template @@ -2209,7 +2268,7 @@ struct proxy_cast_accessor_impl { .is_ref = true, .is_const = std::is_const_v, .result_ptr = &result}; - proxy_invoke(static_cast(self), ctx); + invoke(static_cast(self), ctx); if (result == nullptr) [[unlikely]] { PRO4D_THROW(bad_proxy_cast{}); } @@ -2220,7 +2279,7 @@ struct proxy_cast_accessor_impl { .is_ref = false, .is_const = false, .result_ptr = &result}; - proxy_invoke(static_cast(self), ctx); + invoke(static_cast(self), ctx); if (!result.has_value()) [[unlikely]] { PRO4D_THROW(bad_proxy_cast{}); } @@ -2236,7 +2295,7 @@ struct proxy_cast_accessor_impl { .is_ref = true, .is_const = std::is_const_v, .result_ptr = &result}; - proxy_invoke(*self, ctx); + invoke(*self, ctx); return static_cast(result); } }; @@ -2276,7 +2335,7 @@ struct proxy_typeid_reflector { template struct accessor { friend const std::type_info& proxy_typeid(const Self& self) noexcept { - const proxy_typeid_reflector& refl = proxy_reflect(self); + const proxy_typeid_reflector& refl = reflect(self); return *refl.info; } PRO4D_DEBUG( @@ -2397,7 +2456,7 @@ struct operator_dispatch; struct accessor { \ PRO4D_GEN_DEBUG_SYMBOL_FOR_MEM_ACCESSOR(__VA_ARGS__) \ R __VA_ARGS__() oq ne { \ - return proxy_invoke(static_cast

(*this)); \ + return invoke(static_cast

(*this)); \ } \ } #define PROD_DEF_LHS_UNARY_OP_ACCESSOR(oq, pq, ne, ...) \ @@ -2405,7 +2464,7 @@ struct operator_dispatch; struct accessor { \ PRO4D_GEN_DEBUG_SYMBOL_FOR_MEM_ACCESSOR(__VA_ARGS__) \ decltype(auto) __VA_ARGS__() oq ne { \ - proxy_invoke(static_cast

(*this)); \ + invoke(static_cast

(*this)); \ return static_cast

(*this); \ } \ }; \ @@ -2413,7 +2472,7 @@ struct operator_dispatch; struct accessor { \ PRO4D_GEN_DEBUG_SYMBOL_FOR_MEM_ACCESSOR(__VA_ARGS__) \ R __VA_ARGS__(int) oq ne { \ - return proxy_invoke(static_cast

(*this), 0); \ + return invoke(static_cast

(*this), 0); \ } \ } #define PROD_DEF_LHS_BINARY_OP_ACCESSOR PRO4D_DEF_MEM_ACCESSOR @@ -2448,8 +2507,8 @@ struct operator_dispatch; template \ struct accessor { \ friend R operator __VA_ARGS__(Arg arg, P pq self) ne { \ - return proxy_invoke(static_cast

(self), \ - std::forward(arg)); \ + return invoke(static_cast

(self), \ + std::forward(arg)); \ } \ PRO4D_DEBUG( \ accessor() noexcept { std::ignore = &pro_symbol_guard; } \ @@ -2484,8 +2543,8 @@ struct operator_dispatch; struct accessor { \ PRO4D_GEN_DEBUG_SYMBOL_FOR_MEM_ACCESSOR(__VA_ARGS__) \ decltype(auto) __VA_ARGS__(Arg arg) oq ne { \ - proxy_invoke(static_cast

(*this), \ - std::forward(arg)); \ + invoke(static_cast

(*this), \ + std::forward(arg)); \ return static_cast

(*this); \ } \ } @@ -2493,7 +2552,7 @@ struct operator_dispatch; template \ struct accessor { \ friend Arg& operator __VA_ARGS__(Arg& arg, P pq self) ne { \ - proxy_invoke(static_cast

(self), arg); \ + invoke(static_cast

(self), arg); \ return arg; \ } \ PRO4D_DEBUG( \ @@ -2661,9 +2720,8 @@ struct formatter, CharT> { template OutIt format(const pro::v4::proxy_indirect_accessor& p, basic_format_context& fc) const { - return pro::v4::proxy_invoke>( - p, spec_, fc); + return invoke>(p, spec_, fc); } private: diff --git a/include/proxy/v4/proxy_fmt.h b/include/proxy/v4/proxy_fmt.h index 378310c..60690e4 100644 --- a/include/proxy/v4/proxy_fmt.h +++ b/include/proxy/v4/proxy_fmt.h @@ -84,9 +84,8 @@ struct formatter, CharT> { template auto format(const pro::v4::proxy_indirect_accessor& p, FormatContext& fc) const -> typename FormatContext::iterator { - return pro::v4::proxy_invoke< - pro::v4::details::fmt_format_dispatch, - pro::v4::details::fmt_format_overload_t>(p, spec_, fc); + return invoke>(p, spec_, fc); } private: diff --git a/include/proxy/v4/proxy_macros.h b/include/proxy/v4/proxy_macros.h index 74ad2f4..e50dd51 100644 --- a/include/proxy/v4/proxy_macros.h +++ b/include/proxy/v4/proxy_macros.h @@ -83,7 +83,7 @@ struct accessor { \ PRO4D_GEN_DEBUG_SYMBOL_FOR_MEM_ACCESSOR(__VA_ARGS__) \ ProR __VA_ARGS__(ProArgs... pro_args) oq ne { \ - return ::pro::v4::proxy_invoke( \ + return invoke( \ static_cast(*this), ::std::forward(pro_args)...); \ } \ } @@ -106,7 +106,7 @@ template \ struct accessor { \ friend ProR __VA_ARGS__(ProP pq pro_self, ProArgs... pro_args) ne { \ - return ::pro::v4::proxy_invoke( \ + return invoke( \ static_cast(pro_self), \ ::std::forward(pro_args)...); \ } \ diff --git a/tests/proxy_creation_tests.cpp b/tests/proxy_creation_tests.cpp index d88dc24..d83e00c 100644 --- a/tests/proxy_creation_tests.cpp +++ b/tests/proxy_creation_tests.cpp @@ -55,7 +55,7 @@ struct LifetimeModelReflector { struct accessor { LifetimeModelType GetLifetimeType() const noexcept { const LifetimeModelReflector& refl = - pro::proxy_reflect(static_cast(*this)); + reflect(static_cast(*this)); return refl.Type; } }; diff --git a/tests/proxy_reflection_tests.cpp b/tests/proxy_reflection_tests.cpp index ab24402..717205a 100644 --- a/tests/proxy_reflection_tests.cpp +++ b/tests/proxy_reflection_tests.cpp @@ -24,7 +24,7 @@ struct TraitsReflector { template struct accessor { const TraitsReflector& ReflectTraits() const noexcept { - return pro::proxy_reflect(static_cast(*this)); + return reflect(static_cast(*this)); } }; diff --git a/tests/utils.h b/tests/utils.h index 000b356..287224b 100644 --- a/tests/utils.h +++ b/tests/utils.h @@ -112,8 +112,7 @@ class RttiReflector { template struct accessor { const char* GetTypeName() const noexcept { - const RttiReflector& self = - pro::proxy_reflect(static_cast(*this)); + const RttiReflector& self = reflect(static_cast(*this)); return self.type_.name(); } };