Skip to content

Commit 8d59830

Browse files
authored
rework the STDEXEC_EXPLICIT_THIS_[BEGIN|END] portability macros for better reusability (#1895)
* rework the `STDEXEC_EXPLICIT_THIS_[BEGIN|END]` portability macros for better reusability
1 parent ba86938 commit 8d59830

File tree

8 files changed

+75
-68
lines changed

8 files changed

+75
-68
lines changed

include/nvexec/stream/let_xxx.cuh

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,11 @@ namespace nv::execution::_strm
4747
using __decay_ref_t = STDEXEC::__decay_t<Tp>&;
4848

4949
template <class Fun>
50-
using _mk_result_sender_t =
51-
__mtransform<__q<__decay_ref_t>, __mbind_front_q<__call_result_t, Fun>>;
50+
struct _mk_result_sender
51+
{
52+
template <class... Args>
53+
using __f = __remove_rvalue_reference_t<__call_result_t<Fun, __decay_ref_t<Args>...>>;
54+
};
5255

5356
template <class Sender, class PropagateReceiver, class Fun, class SetTag>
5457
requires sender_in<Sender, env_of_t<PropagateReceiver>>
@@ -57,7 +60,7 @@ namespace nv::execution::_strm
5760
struct _result_sender_size
5861
{
5962
template <class... Args>
60-
using __f = __msize_t<sizeof(__minvoke<_mk_result_sender_t<Fun>, Args...>)>;
63+
using __f = __msize_t<sizeof(__minvoke<_mk_result_sender<Fun>, Args...>)>;
6164
};
6265

6366
static constexpr std::size_t value = __gather_completions_of_t<SetTag,
@@ -69,7 +72,7 @@ namespace nv::execution::_strm
6972

7073
template <class Receiver, class Fun>
7174
using opstate_for_t = __mcompose<__mbind_back_q<connect_result_t, propagate_receiver<Receiver>>,
72-
_mk_result_sender_t<Fun>>;
75+
_mk_result_sender<Fun>>;
7376

7477
template <class Set, class Sig>
7578
struct __tfx_signal_fn
@@ -83,7 +86,7 @@ namespace nv::execution::_strm
8386
{
8487
template <class Fun, class... StreamEnv>
8588
using __f = transform_completion_signatures<
86-
__completion_signatures_of_t<__minvoke<_mk_result_sender_t<Fun>, Args...>, StreamEnv...>,
89+
__completion_signatures_of_t<__minvoke<_mk_result_sender<Fun>, Args...>, StreamEnv...>,
8790
completion_signatures<set_error_t(cudaError_t)>>;
8891
};
8992

@@ -105,7 +108,7 @@ namespace nv::execution::_strm
105108
template <__same_as<Set> Tag, class... Args>
106109
void _complete(Tag, Args&&... args) noexcept
107110
{
108-
using result_sender_t = __minvoke<_mk_result_sender_t<Fun>, Args...>;
111+
using result_sender_t = __minvoke<_mk_result_sender<Fun>, Args...>;
109112
using opstate_t = __minvoke<opstate_for_t<Receiver, Fun>, Args...>;
110113

111114
cudaStream_t stream = opstate_->get_stream();

include/stdexec/__detail/__basic_sender.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ namespace STDEXEC
368368
// Non-standard extension:
369369
template <class _Self, receiver _Receiver>
370370
STDEXEC_ATTRIBUTE(nodiscard, always_inline)
371-
static constexpr auto static_connect(_Self&& __self, _Receiver __rcvr) noexcept(
371+
static constexpr auto __static_connect(_Self&& __self, _Receiver __rcvr) noexcept(
372372
__noexcept_of<__sexpr_impl<__tag_t>::__connect, __copy_cvref_t<_Self, __sexpr>, _Receiver>)
373373
-> __result_of<__sexpr_impl<__tag_t>::__connect, __copy_cvref_t<_Self, __sexpr>, _Receiver>
374374
{

include/stdexec/__detail/__config.hpp

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -776,51 +776,51 @@ namespace STDEXEC
776776

777777
#else
778778

779-
# define STDEXEC_EXPLICIT_THIS_BEGIN(...) \
780-
static STDEXEC_PP_EXPAND(STDEXEC_PP_CAT(STDEXEC_EXPLICIT_THIS_MANGLE_, __VA_ARGS__) \
781-
STDEXEC_PP_RPAREN) STDEXEC_PP_LPAREN STDEXEC_EXPLICIT_THIS_ARGS
779+
# define STDEXEC_EXPLICIT_THIS_CALL_OPERATOR_PROBE_operator() STDEXEC_PP_PROBE(~, 1)
780+
781+
# define STDEXEC_EXPLICIT_THIS_CALL_OPERATOR_PROBE(_NAME) \
782+
STDEXEC_PP_CHECK(STDEXEC_PP_CAT(STDEXEC_EXPLICIT_THIS_CALL_OPERATOR_PROBE_, _NAME))
783+
784+
# define STDEXEC_EXPLICIT_THIS_MANGLE(_NAME) \
785+
STDEXEC_PP_CAT(__static_, \
786+
STDEXEC_PP_IIF(STDEXEC_EXPLICIT_THIS_CALL_OPERATOR_PROBE(_NAME), \
787+
_call, \
788+
_NAME))
789+
790+
# define STDEXEC_EXPLICIT_THIS_EAT_this
791+
# define STDEXEC_EXPLICIT_THIS_MANGLE_auto auto STDEXEC_EXPLICIT_THIS_MANGLE STDEXEC_PP_LPAREN
792+
# define STDEXEC_EXPLICIT_THIS_MANGLE_void void STDEXEC_EXPLICIT_THIS_MANGLE STDEXEC_PP_LPAREN
793+
# define STDEXEC_EXPLICIT_THIS_MANGLE_bool bool STDEXEC_EXPLICIT_THIS_MANGLE STDEXEC_PP_LPAREN
782794

783795
# define STDEXEC_EXPLICIT_THIS_ARGS(...) \
784796
STDEXEC_PP_CAT(STDEXEC_EXPLICIT_THIS_EAT_, __VA_ARGS__) STDEXEC_PP_RPAREN
785797

786-
# define STDEXEC_EXPLICIT_THIS_END(_FN) \
798+
# define STDEXEC_EXPLICIT_THIS_BEGIN(...) \
799+
static STDEXEC_PP_EXPAND(STDEXEC_PP_CAT(STDEXEC_EXPLICIT_THIS_MANGLE_, __VA_ARGS__) \
800+
STDEXEC_PP_RPAREN) STDEXEC_PP_LPAREN STDEXEC_EXPLICIT_THIS_ARGS
801+
802+
# define STDEXEC_EXPLICIT_THIS_END(_NAME) \
787803
template <class... _Ts> \
788-
STDEXEC_ATTRIBUTE(always_inline) \
789-
auto _FN(_Ts&&... __args) && STDEXEC_AUTO_RETURN \
804+
STDEXEC_ATTRIBUTE(always_inline, host, device) \
805+
auto _NAME(_Ts&&... __args) && STDEXEC_AUTO_RETURN \
790806
( \
791-
decltype(STDEXEC::__get_self<_Ts...>(*this)) \
792-
::STDEXEC_PP_CAT(static_, _FN)(std::move(*this), static_cast<_Ts&&>(__args)...) \
807+
STDEXEC_EXPLICIT_THIS_MANGLE(_NAME)(std::move(*this), static_cast<_Ts&&>(__args)...) \
793808
) \
794809
\
795810
template <class... _Ts> \
796-
STDEXEC_ATTRIBUTE(always_inline) \
797-
auto _FN(_Ts&&... __args) & STDEXEC_AUTO_RETURN \
811+
STDEXEC_ATTRIBUTE(always_inline, host, device) \
812+
auto _NAME(_Ts&&... __args) & STDEXEC_AUTO_RETURN \
798813
( \
799-
decltype(STDEXEC::__get_self<_Ts...>(*this)) \
800-
::STDEXEC_PP_CAT(static_, _FN)(*this, static_cast<_Ts&&>(__args)...) \
814+
STDEXEC_EXPLICIT_THIS_MANGLE(_NAME)(*this, static_cast<_Ts&&>(__args)...) \
801815
) \
802816
\
803817
template <class... _Ts> \
804-
STDEXEC_ATTRIBUTE(always_inline) \
805-
auto _FN(_Ts&&... __args) const & STDEXEC_AUTO_RETURN \
818+
STDEXEC_ATTRIBUTE(always_inline, host, device) \
819+
auto _NAME(_Ts&&... __args) const & STDEXEC_AUTO_RETURN \
806820
( \
807-
decltype(STDEXEC::__get_self<_Ts...>(*this)) \
808-
::STDEXEC_PP_CAT(static_, _FN)(*this, static_cast<_Ts&&>(__args)...) \
821+
STDEXEC_EXPLICIT_THIS_MANGLE(_NAME)(*this, static_cast<_Ts&&>(__args)...) \
809822
)
810823

811-
# define STDEXEC_EXPLICIT_THIS_EAT_this
812-
# define STDEXEC_EXPLICIT_THIS_EAT_auto
813-
# define STDEXEC_EXPLICIT_THIS_EAT_void
814-
# define STDEXEC_EXPLICIT_THIS_MANGLE_auto auto STDEXEC_EXPLICIT_THIS_MANGLE STDEXEC_PP_LPAREN
815-
# define STDEXEC_EXPLICIT_THIS_MANGLE_void void STDEXEC_EXPLICIT_THIS_MANGLE STDEXEC_PP_LPAREN
816-
# define STDEXEC_EXPLICIT_THIS_MANGLE(_NAME) STDEXEC_PP_CAT(static_, _NAME)
817-
818-
namespace STDEXEC
819-
{
820-
template <class... _Ts, class _Self>
821-
constexpr auto __get_self(_Self const &) -> _Self;
822-
} // namespace STDEXEC
823-
824824
#endif // STDEXEC_NO_STDCPP_EXPLICIT_THIS_PARAMETER()
825825

826826
////////////////////////////////////////////////////////////////////////////////////////////////////

include/stdexec/__detail/__connect.hpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ namespace STDEXEC
3333
template <class _Sender, class _Receiver>
3434
concept __with_static_member = requires(__declfn_t<_Sender&&> __sndr,
3535
__declfn_t<_Receiver&&> __rcvr) {
36-
STDEXEC_REMOVE_REFERENCE(_Sender)::static_connect(__sndr(), __rcvr());
36+
STDEXEC_REMOVE_REFERENCE(_Sender)::__static_connect(__sndr(), __rcvr());
3737
};
3838

3939
template <class _Sender, class _Receiver>
@@ -67,8 +67,8 @@ namespace STDEXEC
6767
template <class _Sender, class _Receiver>
6868
requires __with_static_member<_Sender, _Receiver>
6969
extern STDEXEC_CONNECT_DECLFN_FOR(STDEXEC_REMOVE_REFERENCE(_Sender) //
70-
::static_connect(__declval<_Sender>(),
71-
__declval<_Receiver>()))
70+
::__static_connect(__declval<_Sender>(),
71+
__declval<_Receiver>()))
7272
__connect_declfn_v<_Sender, _Receiver, true>;
7373

7474
template <class _Sender, class _Receiver>
@@ -97,7 +97,7 @@ namespace STDEXEC
9797
template <class _Sender, class _Receiver>
9898
requires __with_static_member<_Sender, _Receiver>
9999
extern __declfn_t<decltype(STDEXEC_REMOVE_REFERENCE(_Sender) //
100-
::static_connect(__declval<_Sender>(), __declval<_Receiver>())),
100+
::__static_connect(__declval<_Sender>(), __declval<_Receiver>())),
101101
false>
102102
__connect_declfn_v<_Sender, _Receiver, false>;
103103

@@ -149,7 +149,7 @@ namespace STDEXEC
149149
{
150150
return STDEXEC_CONNECT_DECLFN_FOR(
151151
STDEXEC_REMOVE_REFERENCE(_Sender) //
152-
::static_connect(__declval<_Sender>(), __declval<_Receiver>()));
152+
::__static_connect(__declval<_Sender>(), __declval<_Receiver>()));
153153
}
154154
else if constexpr (__with_member<_Sender, _Receiver>)
155155
{
@@ -180,7 +180,8 @@ namespace STDEXEC
180180
if constexpr (__with_static_member<_Sender, _Receiver>)
181181
{
182182
return __declfn<decltype(STDEXEC_REMOVE_REFERENCE(_Sender) //
183-
::static_connect(__declval<_Sender>(), __declval<_Receiver>())),
183+
::__static_connect(__declval<_Sender>(),
184+
__declval<_Receiver>())),
184185
false>();
185186
}
186187
else if constexpr (__with_member<_Sender, _Receiver>)
@@ -237,8 +238,8 @@ namespace STDEXEC
237238
if constexpr (__connect::__with_static_member<__new_sndr_t, _Receiver>)
238239
{
239240
return STDEXEC_REMOVE_REFERENCE(
240-
__new_sndr_t)::static_connect(static_cast<__new_sndr_t&&>(__new_sndr),
241-
static_cast<_Receiver&&>(__rcvr));
241+
__new_sndr_t)::__static_connect(static_cast<__new_sndr_t&&>(__new_sndr),
242+
static_cast<_Receiver&&>(__rcvr));
242243
}
243244
else if constexpr (__connect::__with_member<__new_sndr_t, _Receiver>)
244245
{

include/stdexec/__detail/__get_completion_signatures.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ namespace STDEXEC
110110
template <class _Sender, class... _Env>
111111
using __legacy_static_member_result_t = //
112112
decltype(STDEXEC_REMOVE_REFERENCE(_Sender) //
113-
::static_get_completion_signatures(__declval<_Sender>(), __declval<_Env>()...));
113+
::__static_get_completion_signatures(__declval<_Sender>(), __declval<_Env>()...));
114114

115115
template <class _Sender>
116116
using __legacy_member_alias_t = STDEXEC_REMOVE_REFERENCE(_Sender)::completion_signatures;
@@ -125,7 +125,7 @@ namespace STDEXEC
125125
concept __with_legacy_static_member = requires(__declfn_t<_Sender &&> __sndr,
126126
__declfn_t<_Env &&>... __env) {
127127
STDEXEC_REMOVE_REFERENCE(_Sender)
128-
::static_get_completion_signatures(__sndr(), __env()...);
128+
::__static_get_completion_signatures(__sndr(), __env()...);
129129
};
130130

131131
// [WAR]: see nvbugs#5813160

include/stdexec/__detail/__preprocessor.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@
3636
#define STDEXEC_PP_IIF_0(_YP, ...) __VA_ARGS__
3737
#define STDEXEC_PP_IIF_1(_YP, ...) _YP
3838
#define STDEXEC_PP_IIF_EVAL(_MACRO, ...) _MACRO(__VA_ARGS__)
39+
#define STDEXEC_PP_IIF_CAT(_XP, ...) _XP##__VA_ARGS__
3940
#define STDEXEC_PP_IIF(_XP, _YP, ...) \
40-
STDEXEC_PP_IIF_EVAL(STDEXEC_PP_CAT(STDEXEC_PP_IIF_, _XP), _YP, __VA_ARGS__)
41+
STDEXEC_PP_IIF_EVAL(STDEXEC_PP_IIF_CAT(STDEXEC_PP_IIF_, _XP), _YP, __VA_ARGS__)
4142

4243
#define STDEXEC_PP_COMPL_0 1 // NOLINT(modernize-macro-to-enum)
4344
#define STDEXEC_PP_COMPL_1 0 // NOLINT(modernize-macro-to-enum)
@@ -49,8 +50,9 @@
4950
#define STDEXEC_PP_COUNT_I(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _NP, ...) _NP
5051

5152
// Used to check various properties of arguments
53+
#define STDEXEC_PP_CHECK_EXPAND(...) __VA_ARGS__
5254
#define STDEXEC_PP_CHECK_I(_XP, _NP, ...) _NP
53-
#define STDEXEC_PP_CHECK(...) STDEXEC_PP_EXPAND(STDEXEC_PP_CHECK_I(__VA_ARGS__, 0, ))
55+
#define STDEXEC_PP_CHECK(...) STDEXEC_PP_CHECK_EXPAND(STDEXEC_PP_CHECK_I(__VA_ARGS__, 0, ))
5456
#define STDEXEC_PP_PROBE_I(_XP, _NP, ...) _XP, _NP,
5557
#define STDEXEC_PP_PROBE(...) STDEXEC_PP_PROBE_I(__VA_ARGS__, 1)
5658

include/stdexec/__detail/__starts_on.hpp

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "__execution_fwd.hpp"
1919

2020
// include these after __execution_fwd.hpp
21+
#include "../functional.hpp"
2122
#include "__completion_signatures_of.hpp"
2223
#include "__concepts.hpp"
2324
#include "__diagnostics.hpp"
@@ -30,25 +31,6 @@
3031

3132
namespace STDEXEC
3233
{
33-
namespace __detail
34-
{
35-
//! Constant function object always returning `__val_`.
36-
template <class _Ty, class = __demangle_t<__decay_t<_Ty>>>
37-
struct __always
38-
{
39-
_Ty __val_;
40-
41-
STDEXEC_ATTRIBUTE(always_inline)
42-
constexpr auto operator()() noexcept(__nothrow_move_constructible<_Ty>) -> _Ty
43-
{
44-
return static_cast<_Ty&&>(__val_);
45-
}
46-
};
47-
48-
template <class _Ty>
49-
__always(_Ty) -> __always<_Ty>;
50-
} // namespace __detail
51-
5234
/////////////////////////////////////////////////////////////////////////////
5335
// [execution.senders.adaptors.starts_on]
5436
struct starts_on_t
@@ -66,7 +48,7 @@ namespace STDEXEC
6648
{
6749
auto& [__tag, __sched, __child] = __sndr;
6850
return let_value(continues_on(just(), __sched),
69-
__detail::__always{STDEXEC::__forward_like<_Sender>(__child)});
51+
__always{STDEXEC::__forward_like<_Sender>(__child)});
7052
}
7153

7254
template <class _Sender>

include/stdexec/functional.hpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,25 @@ namespace STDEXEC
255255
template <class _Fn>
256256
STDEXEC_HOST_DEVICE_DEDUCTION_GUIDE __for_each(_Fn) -> __for_each<_Fn>;
257257

258+
//! Constant function object always returning `__value_`.
259+
template <class _Ty>
260+
struct __always
261+
{
262+
template <class _Self, class... _Ts>
263+
STDEXEC_ATTRIBUTE(host, device, always_inline)
264+
constexpr STDEXEC_EXPLICIT_THIS_BEGIN(auto operator())(this _Self&& __self, _Ts&&...) noexcept
265+
-> auto&&
266+
{
267+
return (static_cast<_Self&&>(__self).__value_);
268+
}
269+
STDEXEC_EXPLICIT_THIS_END(operator())
270+
271+
_Ty __value_;
272+
};
273+
274+
template <class _Ty>
275+
STDEXEC_HOST_DEVICE_DEDUCTION_GUIDE __always(_Ty) -> __always<std::unwrap_reference_t<_Ty>>;
276+
258277
template <class _Ty>
259278
struct __construct
260279
{

0 commit comments

Comments
 (0)