Skip to content

Commit ac3b12f

Browse files
committed
Make invoke and reflect unqualified
1 parent bcbe0c7 commit ac3b12f

6 files changed

Lines changed: 114 additions & 44 deletions

File tree

include/proxy/v4/proxy.h

Lines changed: 107 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -924,6 +924,43 @@ class proxy_indirect_accessor
924924
proxy_indirect_accessor() = default;
925925
proxy_indirect_accessor(const proxy_indirect_accessor&) = default;
926926
proxy_indirect_accessor& operator=(const proxy_indirect_accessor&) = default;
927+
928+
public:
929+
template <class D, class O, class... Args>
930+
friend auto invoke(proxy_indirect_accessor& p, Args&&... args) ->
931+
typename details::overload_traits<O>::return_type {
932+
return details::invoke_impl<F, false, D, O>(
933+
details::as_proxy<F, details::qualifier_type::lv>(p),
934+
std::forward<Args>(args)...);
935+
}
936+
template <class D, class O, class... Args>
937+
friend auto invoke(const proxy_indirect_accessor& p, Args&&... args) ->
938+
typename details::overload_traits<O>::return_type {
939+
return details::invoke_impl<F, false, D, O>(
940+
details::as_proxy<F, details::qualifier_type::const_lv>(p),
941+
std::forward<Args>(args)...);
942+
}
943+
template <class D, class O, class... Args>
944+
friend auto invoke(proxy_indirect_accessor&& p, Args&&... args) ->
945+
typename details::overload_traits<O>::return_type {
946+
return details::invoke_impl<F, false, D, O>(
947+
details::as_proxy<F, details::qualifier_type::rv>(std::move(p)),
948+
std::forward<Args>(args)...);
949+
}
950+
template <class D, class O, class... Args>
951+
friend auto invoke(const proxy_indirect_accessor&& p, Args&&... args) ->
952+
typename details::overload_traits<O>::return_type {
953+
return details::invoke_impl<F, false, D, O>(
954+
details::as_proxy<F, details::qualifier_type::const_rv>(std::move(p)),
955+
std::forward<Args>(args)...);
956+
}
957+
template <class R>
958+
friend const R& reflect(const proxy_indirect_accessor& p) noexcept {
959+
return static_cast<const details::refl_meta<false, R>&>(
960+
details::proxy_helper::get_meta(
961+
details::as_proxy<F, details::qualifier_type::const_lv>(p)))
962+
.reflector;
963+
}
927964
};
928965

929966
template <facade F>
@@ -1118,6 +1155,34 @@ class proxy : public details::facade_traits<F>::direct_accessor,
11181155
friend bool operator==(const proxy& lhs, std::nullptr_t) noexcept {
11191156
return !lhs.has_value();
11201157
}
1158+
template <class D, class O, class... Args>
1159+
friend auto invoke(proxy& p, Args&&... args) ->
1160+
typename details::overload_traits<O>::return_type {
1161+
return details::invoke_impl<F, true, D, O>(p, std::forward<Args>(args)...);
1162+
}
1163+
template <class D, class O, class... Args>
1164+
friend auto invoke(const proxy& p, Args&&... args) ->
1165+
typename details::overload_traits<O>::return_type {
1166+
return details::invoke_impl<F, true, D, O>(p, std::forward<Args>(args)...);
1167+
}
1168+
template <class D, class O, class... Args>
1169+
friend auto invoke(proxy<F>&& p, Args&&... args) ->
1170+
typename details::overload_traits<O>::return_type {
1171+
return details::invoke_impl<F, true, D, O>(std::move(p),
1172+
std::forward<Args>(args)...);
1173+
}
1174+
template <class D, class O, class... Args>
1175+
friend auto invoke(const proxy&& p, Args&&... args) ->
1176+
typename details::overload_traits<O>::return_type {
1177+
return details::invoke_impl<F, true, D, O>(std::move(p),
1178+
std::forward<Args>(args)...);
1179+
}
1180+
template <class R>
1181+
friend const R& reflect(const proxy& p) noexcept {
1182+
return static_cast<const details::refl_meta<true, R>&>(
1183+
details::proxy_helper::get_meta(p))
1184+
.reflector;
1185+
}
11211186

11221187
private:
11231188
void initialize() {
@@ -1133,10 +1198,9 @@ class proxy : public details::facade_traits<F>::direct_accessor,
11331198
std::ranges::uninitialized_copy(rhs.ptr_, ptr_);
11341199
meta_ = rhs.meta_;
11351200
} else {
1136-
proxy_invoke<details::copy_dispatch,
1137-
void(proxy&) const noexcept(
1138-
F::copyability == constraint_level::nothrow)>(rhs,
1139-
*this);
1201+
invoke<details::copy_dispatch,
1202+
void(proxy&) const noexcept(
1203+
F::copyability == constraint_level::nothrow)>(rhs, *this);
11401204
}
11411205
} else {
11421206
meta_.reset();
@@ -1152,9 +1216,9 @@ class proxy : public details::facade_traits<F>::direct_accessor,
11521216
meta_ = rhs.meta_;
11531217
rhs.meta_.reset();
11541218
} else {
1155-
proxy_invoke<details::relocate_dispatch,
1156-
void(proxy&) && noexcept(F::relocatability ==
1157-
constraint_level::nothrow)>(
1219+
invoke<details::relocate_dispatch,
1220+
void(proxy&) &&
1221+
noexcept(F::relocatability == constraint_level::nothrow)>(
11581222
std::move(rhs), *this);
11591223
}
11601224
} else {
@@ -1179,9 +1243,9 @@ class proxy : public details::facade_traits<F>::direct_accessor,
11791243
{
11801244
if constexpr (F::destructibility != constraint_level::trivial) {
11811245
if (meta_.has_value()) {
1182-
proxy_invoke<details::destroy_dispatch,
1183-
void() noexcept(F::destructibility ==
1184-
constraint_level::nothrow)>(*this);
1246+
invoke<details::destroy_dispatch,
1247+
void() noexcept(F::destructibility ==
1248+
constraint_level::nothrow)>(*this);
11851249
}
11861250
}
11871251
}
@@ -1200,35 +1264,40 @@ class proxy : public details::facade_traits<F>::direct_accessor,
12001264
};
12011265

12021266
template <class D, class O, facade F, class... Args>
1203-
auto proxy_invoke(proxy_indirect_accessor<F>& p, Args&&... args) ->
1267+
[[deprecated("Use unqualified invoke instead")]] auto
1268+
proxy_invoke(proxy_indirect_accessor<F>& p, Args&&... args) ->
12041269
typename details::overload_traits<O>::return_type {
12051270
return details::invoke_impl<F, false, D, O>(
12061271
details::as_proxy<F, details::qualifier_type::lv>(p),
12071272
std::forward<Args>(args)...);
12081273
}
12091274
template <class D, class O, facade F, class... Args>
1210-
auto proxy_invoke(const proxy_indirect_accessor<F>& p, Args&&... args) ->
1275+
[[deprecated("Use unqualified invoke instead")]] auto
1276+
proxy_invoke(const proxy_indirect_accessor<F>& p, Args&&... args) ->
12111277
typename details::overload_traits<O>::return_type {
12121278
return details::invoke_impl<F, false, D, O>(
12131279
details::as_proxy<F, details::qualifier_type::const_lv>(p),
12141280
std::forward<Args>(args)...);
12151281
}
12161282
template <class D, class O, facade F, class... Args>
1217-
auto proxy_invoke(proxy_indirect_accessor<F>&& p, Args&&... args) ->
1283+
[[deprecated("Use unqualified invoke instead")]] auto
1284+
proxy_invoke(proxy_indirect_accessor<F>&& p, Args&&... args) ->
12181285
typename details::overload_traits<O>::return_type {
12191286
return details::invoke_impl<F, false, D, O>(
12201287
details::as_proxy<F, details::qualifier_type::rv>(std::move(p)),
12211288
std::forward<Args>(args)...);
12221289
}
12231290
template <class D, class O, facade F, class... Args>
1224-
auto proxy_invoke(const proxy_indirect_accessor<F>&& p, Args&&... args) ->
1291+
[[deprecated("Use unqualified invoke instead")]] auto
1292+
proxy_invoke(const proxy_indirect_accessor<F>&& p, Args&&... args) ->
12251293
typename details::overload_traits<O>::return_type {
12261294
return details::invoke_impl<F, false, D, O>(
12271295
details::as_proxy<F, details::qualifier_type::const_rv>(std::move(p)),
12281296
std::forward<Args>(args)...);
12291297
}
12301298
template <class D, class O, facade F, class... Args>
1231-
auto proxy_invoke(proxy<F>& p, Args&&... args) ->
1299+
[[deprecated("Use unqualified invoke instead")]] auto
1300+
proxy_invoke(proxy<F>& p, Args&&... args) ->
12321301
typename details::overload_traits<O>::return_type {
12331302
return details::invoke_impl<F, true, D, O>(p, std::forward<Args>(args)...);
12341303
}
@@ -1238,27 +1307,31 @@ auto proxy_invoke(const proxy<F>& p, Args&&... args) ->
12381307
return details::invoke_impl<F, true, D, O>(p, std::forward<Args>(args)...);
12391308
}
12401309
template <class D, class O, facade F, class... Args>
1241-
auto proxy_invoke(proxy<F>&& p, Args&&... args) ->
1310+
[[deprecated("Use unqualified invoke instead")]] auto
1311+
proxy_invoke(proxy<F>&& p, Args&&... args) ->
12421312
typename details::overload_traits<O>::return_type {
12431313
return details::invoke_impl<F, true, D, O>(std::move(p),
12441314
std::forward<Args>(args)...);
12451315
}
12461316
template <class D, class O, facade F, class... Args>
1247-
auto proxy_invoke(const proxy<F>&& p, Args&&... args) ->
1317+
[[deprecated("Use unqualified invoke instead")]] auto
1318+
proxy_invoke(const proxy<F>&& p, Args&&... args) ->
12481319
typename details::overload_traits<O>::return_type {
12491320
return details::invoke_impl<F, true, D, O>(std::move(p),
12501321
std::forward<Args>(args)...);
12511322
}
12521323

12531324
template <class R, facade F>
1254-
const R& proxy_reflect(const proxy_indirect_accessor<F>& p) noexcept {
1325+
[[deprecated("Use unqualified reflect instead")]] const R&
1326+
proxy_reflect(const proxy_indirect_accessor<F>& p) noexcept {
12551327
return static_cast<const details::refl_meta<false, R>&>(
12561328
details::proxy_helper::get_meta(
12571329
details::as_proxy<F, details::qualifier_type::const_lv>(p)))
12581330
.reflector;
12591331
}
12601332
template <class R, facade F>
1261-
const R& proxy_reflect(const proxy<F>& p) noexcept {
1333+
[[deprecated("Use unqualified reflect instead")]] const R&
1334+
proxy_reflect(const proxy<F>& p) noexcept {
12621335
return static_cast<const details::refl_meta<true, R>&>(
12631336
details::proxy_helper::get_meta(p))
12641337
.reflector;
@@ -1324,7 +1397,7 @@ struct converter {
13241397
return nullptr; \
13251398
} \
13261399
} \
1327-
return proxy_invoke<D, T() oq ne>(static_cast<P pq>(*this)); \
1400+
return invoke<D, T() oq ne>(static_cast<P pq>(*this)); \
13281401
} \
13291402
}
13301403
template <bool Expl, bool Nullable>
@@ -2209,7 +2282,7 @@ struct proxy_cast_accessor_impl {
22092282
.is_ref = true,
22102283
.is_const = std::is_const_v<U>,
22112284
.result_ptr = &result};
2212-
proxy_invoke<D, O>(static_cast<Self>(self), ctx);
2285+
invoke<D, O>(static_cast<Self>(self), ctx);
22132286
if (result == nullptr) [[unlikely]] {
22142287
PRO4D_THROW(bad_proxy_cast{});
22152288
}
@@ -2220,7 +2293,7 @@ struct proxy_cast_accessor_impl {
22202293
.is_ref = false,
22212294
.is_const = false,
22222295
.result_ptr = &result};
2223-
proxy_invoke<D, O>(static_cast<Self>(self), ctx);
2296+
invoke<D, O>(static_cast<Self>(self), ctx);
22242297
if (!result.has_value()) [[unlikely]] {
22252298
PRO4D_THROW(bad_proxy_cast{});
22262299
}
@@ -2236,7 +2309,7 @@ struct proxy_cast_accessor_impl {
22362309
.is_ref = true,
22372310
.is_const = std::is_const_v<T>,
22382311
.result_ptr = &result};
2239-
proxy_invoke<D, O>(*self, ctx);
2312+
invoke<D, O>(*self, ctx);
22402313
return static_cast<T*>(result);
22412314
}
22422315
};
@@ -2276,7 +2349,7 @@ struct proxy_typeid_reflector {
22762349
template <class Self, class R>
22772350
struct accessor {
22782351
friend const std::type_info& proxy_typeid(const Self& self) noexcept {
2279-
const proxy_typeid_reflector& refl = proxy_reflect<R>(self);
2352+
const proxy_typeid_reflector& refl = reflect<R>(self);
22802353
return *refl.info;
22812354
}
22822355
PRO4D_DEBUG(
@@ -2397,23 +2470,23 @@ struct operator_dispatch;
23972470
struct accessor<P, D, R() oq ne> { \
23982471
PRO4D_GEN_DEBUG_SYMBOL_FOR_MEM_ACCESSOR(__VA_ARGS__) \
23992472
R __VA_ARGS__() oq ne { \
2400-
return proxy_invoke<D, R() oq ne>(static_cast<P pq>(*this)); \
2473+
return invoke<D, R() oq ne>(static_cast<P pq>(*this)); \
24012474
} \
24022475
}
24032476
#define PROD_DEF_LHS_UNARY_OP_ACCESSOR(oq, pq, ne, ...) \
24042477
template <class P, class D, class R> \
24052478
struct accessor<P, D, R() oq ne> { \
24062479
PRO4D_GEN_DEBUG_SYMBOL_FOR_MEM_ACCESSOR(__VA_ARGS__) \
24072480
decltype(auto) __VA_ARGS__() oq ne { \
2408-
proxy_invoke<D, R() oq ne>(static_cast<P pq>(*this)); \
2481+
invoke<D, R() oq ne>(static_cast<P pq>(*this)); \
24092482
return static_cast<P pq>(*this); \
24102483
} \
24112484
}; \
24122485
template <class P, class D, class R> \
24132486
struct accessor<P, D, R(int) oq ne> { \
24142487
PRO4D_GEN_DEBUG_SYMBOL_FOR_MEM_ACCESSOR(__VA_ARGS__) \
24152488
R __VA_ARGS__(int) oq ne { \
2416-
return proxy_invoke<D, R(int) oq ne>(static_cast<P pq>(*this), 0); \
2489+
return invoke<D, R(int) oq ne>(static_cast<P pq>(*this), 0); \
24172490
} \
24182491
}
24192492
#define PROD_DEF_LHS_BINARY_OP_ACCESSOR PRO4D_DEF_MEM_ACCESSOR
@@ -2448,8 +2521,8 @@ struct operator_dispatch;
24482521
template <class P, class D, class R, class Arg> \
24492522
struct accessor<P, D, R(Arg) oq ne> { \
24502523
friend R operator __VA_ARGS__(Arg arg, P pq self) ne { \
2451-
return proxy_invoke<D, R(Arg) oq ne>(static_cast<P pq>(self), \
2452-
std::forward<Arg>(arg)); \
2524+
return invoke<D, R(Arg) oq ne>(static_cast<P pq>(self), \
2525+
std::forward<Arg>(arg)); \
24532526
} \
24542527
PRO4D_DEBUG( \
24552528
accessor() noexcept { std::ignore = &pro_symbol_guard; } \
@@ -2484,16 +2557,16 @@ struct operator_dispatch;
24842557
struct accessor<P, D, R(Arg) oq ne> { \
24852558
PRO4D_GEN_DEBUG_SYMBOL_FOR_MEM_ACCESSOR(__VA_ARGS__) \
24862559
decltype(auto) __VA_ARGS__(Arg arg) oq ne { \
2487-
proxy_invoke<D, R(Arg) oq ne>(static_cast<P pq>(*this), \
2488-
std::forward<Arg>(arg)); \
2560+
invoke<D, R(Arg) oq ne>(static_cast<P pq>(*this), \
2561+
std::forward<Arg>(arg)); \
24892562
return static_cast<P pq>(*this); \
24902563
} \
24912564
}
24922565
#define PROD_DEF_RHS_ASSIGNMENT_OP_ACCESSOR(oq, pq, ne, ...) \
24932566
template <class P, class D, class R, class Arg> \
24942567
struct accessor<P, D, R(Arg&) oq ne> { \
24952568
friend Arg& operator __VA_ARGS__(Arg& arg, P pq self) ne { \
2496-
proxy_invoke<D, R(Arg&) oq ne>(static_cast<P pq>(self), arg); \
2569+
invoke<D, R(Arg&) oq ne>(static_cast<P pq>(self), arg); \
24972570
return arg; \
24982571
} \
24992572
PRO4D_DEBUG( \
@@ -2661,9 +2734,8 @@ struct formatter<pro::v4::proxy_indirect_accessor<F>, CharT> {
26612734
template <class OutIt>
26622735
OutIt format(const pro::v4::proxy_indirect_accessor<F>& p,
26632736
basic_format_context<OutIt, CharT>& fc) const {
2664-
return pro::v4::proxy_invoke<pro::v4::details::format_dispatch,
2665-
pro::v4::details::format_overload_t<CharT>>(
2666-
p, spec_, fc);
2737+
return invoke<pro::v4::details::format_dispatch,
2738+
pro::v4::details::format_overload_t<CharT>>(p, spec_, fc);
26672739
}
26682740

26692741
private:

include/proxy/v4/proxy_fmt.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,8 @@ struct formatter<pro::v4::proxy_indirect_accessor<F>, CharT> {
8484
template <class FormatContext>
8585
auto format(const pro::v4::proxy_indirect_accessor<F>& p,
8686
FormatContext& fc) const -> typename FormatContext::iterator {
87-
return pro::v4::proxy_invoke<
88-
pro::v4::details::fmt_format_dispatch,
89-
pro::v4::details::fmt_format_overload_t<CharT>>(p, spec_, fc);
87+
return invoke<pro::v4::details::fmt_format_dispatch,
88+
pro::v4::details::fmt_format_overload_t<CharT>>(p, spec_, fc);
9089
}
9190

9291
private:

include/proxy/v4/proxy_macros.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
struct accessor<ProP, ProD, ProR(ProArgs...) oq ne> { \
8484
PRO4D_GEN_DEBUG_SYMBOL_FOR_MEM_ACCESSOR(__VA_ARGS__) \
8585
ProR __VA_ARGS__(ProArgs... pro_args) oq ne { \
86-
return ::pro::v4::proxy_invoke<ProD, ProR(ProArgs...) oq ne>( \
86+
return invoke<ProD, ProR(ProArgs...) oq ne>( \
8787
static_cast<ProP pq>(*this), ::std::forward<ProArgs>(pro_args)...); \
8888
} \
8989
}
@@ -106,7 +106,7 @@
106106
template <class ProP, class ProD, class ProR, class... ProArgs> \
107107
struct accessor<ProP, ProD, ProR(ProArgs...) oq ne> { \
108108
friend ProR __VA_ARGS__(ProP pq pro_self, ProArgs... pro_args) ne { \
109-
return ::pro::v4::proxy_invoke<ProD, ProR(ProArgs...) oq ne>( \
109+
return invoke<ProD, ProR(ProArgs...) oq ne>( \
110110
static_cast<ProP pq>(pro_self), \
111111
::std::forward<ProArgs>(pro_args)...); \
112112
} \

tests/proxy_creation_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ struct LifetimeModelReflector {
5555
struct accessor {
5656
LifetimeModelType GetLifetimeType() const noexcept {
5757
const LifetimeModelReflector& refl =
58-
pro::proxy_reflect<R>(static_cast<const Self&>(*this));
58+
reflect<R>(static_cast<const Self&>(*this));
5959
return refl.Type;
6060
}
6161
};

tests/proxy_reflection_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ struct TraitsReflector {
2424
template <class Self, class R>
2525
struct accessor {
2626
const TraitsReflector& ReflectTraits() const noexcept {
27-
return pro::proxy_reflect<R>(static_cast<const Self&>(*this));
27+
return reflect<R>(static_cast<const Self&>(*this));
2828
}
2929
};
3030

tests/utils.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,7 @@ class RttiReflector {
112112
template <class P, class R>
113113
struct accessor {
114114
const char* GetTypeName() const noexcept {
115-
const RttiReflector& self =
116-
pro::proxy_reflect<R>(static_cast<const P&>(*this));
115+
const RttiReflector& self = reflect<R>(static_cast<const P&>(*this));
117116
return self.type_.name();
118117
}
119118
};

0 commit comments

Comments
 (0)