Skip to content

Commit 624efd6

Browse files
committed
various improvements to __variant
1 parent d062f2e commit 624efd6

21 files changed

+222
-177
lines changed

include/exec/finally.hpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ namespace exec {
2828
using namespace STDEXEC;
2929

3030
template <class _Sigs>
31-
using __result_variant_t =
32-
__for_each_completion_signature_t<_Sigs, __decayed_tuple, __variant_for>;
31+
using __result_variant_t = __for_each_completion_signature_t<_Sigs, __decayed_tuple, __variant>;
3332

3433
template <class _ResultType, class _Receiver>
3534
struct __opstate_base {
@@ -111,18 +110,18 @@ namespace exec {
111110

112111
template <class... _Args>
113112
void __store_result_and_start_next_op(_Args&&... __args) {
114-
this->__result_.__construct()
113+
this->__result_.__construct(STDEXEC::__no_init)
115114
.template emplace<__decayed_tuple<_Args...>>(static_cast<_Args&&>(__args)...);
116115
STDEXEC_ASSERT(__current_opstate_.index() == 0);
117-
auto __final = static_cast<_FinalSender&&>(__current_opstate_.template get<0>().__sndr_);
116+
auto __final = static_cast<_FinalSender&&>(__var::__get<0>(__current_opstate_).__sndr_);
118117
__final_opstate_t& __final_op = __current_opstate_.template __emplace_from<1>(
119118
STDEXEC::connect, static_cast<_FinalSender&&>(__final), __final_receiver_t{this});
120119
STDEXEC::start(__final_op);
121120
}
122121

123122
explicit __opstate(_InitialSender&& __initial, _FinalSender __final, _Receiver __receiver)
124123
: __base_t{{static_cast<_Receiver&&>(__receiver)}}
125-
, __current_opstate_() {
124+
, __current_opstate_(STDEXEC::__no_init) {
126125
__current_opstate_.template emplace<0>(
127126
static_cast<_InitialSender&&>(__initial),
128127
static_cast<_FinalSender&&>(__final),
@@ -131,7 +130,7 @@ namespace exec {
131130

132131
void start() & noexcept {
133132
STDEXEC_ASSERT(__current_opstate_.index() == 0);
134-
STDEXEC::start(__current_opstate_.template get<0>().__initial_opstate_);
133+
STDEXEC::start(__var::__get<0>(__current_opstate_).__initial_opstate_);
135134
}
136135

137136
private:
@@ -152,7 +151,7 @@ namespace exec {
152151
connect_result_t<_InitialSender, __initial_receiver_t> __initial_opstate_;
153152
};
154153

155-
__variant_for<__initial_op_t, __final_opstate_t> __current_opstate_;
154+
__variant<__initial_op_t, __final_opstate_t> __current_opstate_;
156155
};
157156

158157
template <class _InitialSender, class _FinalSender, class _Receiver>

include/exec/fork_join.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ namespace exec {
6363
STDEXEC::__mset
6464
>,
6565
_maybe_eptr_completion_t<Completions>
66-
>::template rebind<STDEXEC::__variant_for>;
66+
>::template rebind<STDEXEC::__variant>;
6767

6868
template <class Domain>
6969
struct _env_t {
@@ -207,7 +207,7 @@ namespace exec {
207207
}
208208

209209
Rcvr _rcvr_;
210-
_variant_t<_child_completions_t> _cache_{};
210+
_variant_t<_child_completions_t> _cache_{STDEXEC::__no_init};
211211
STDEXEC::__manual_lifetime<_child_opstate_t> _child_opstate_{};
212212
_fork_opstate_t _fork_opstate_;
213213
};

include/exec/sequence.hpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,8 @@ namespace exec {
124124
template <class Sender, class IsLast>
125125
using _child_opstate_t = STDEXEC::connect_result_t<Sender, _rcvr_t<IsLast::value>>;
126126

127-
using _mk_child_ops_variant_fn = STDEXEC::__mzip_with2<
128-
STDEXEC::__q2<_child_opstate_t>,
129-
STDEXEC::__qq<STDEXEC::__variant_for>
130-
>;
127+
using _mk_child_ops_variant_fn =
128+
STDEXEC::__mzip_with2<STDEXEC::__q2<_child_opstate_t>, STDEXEC::__qq<STDEXEC::__variant>>;
131129

132130
using _ops_variant_t = STDEXEC::__minvoke<
133131
_mk_child_ops_variant_fn,
@@ -174,11 +172,11 @@ namespace exec {
174172
if (sizeof...(Senders) != 0) {
175173
this->_start_next_ = &_start_next<sizeof...(Senders)>;
176174
}
177-
STDEXEC::start(_ops.template get<0>());
175+
STDEXEC::start(STDEXEC::__var::__get<0>(_ops));
178176
}
179177

180178
_senders_tuple_t _sndrs;
181-
_ops_variant_t _ops{};
179+
_ops_variant_t _ops{STDEXEC::__no_init};
182180
};
183181

184182
// The completions of the sequence sender are the error and stopped completions of all the

include/exec/sequence/ignore_all_values.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ namespace exec {
7878
}
7979
}
8080

81-
_ResultVariant __result_{};
81+
_ResultVariant __result_{STDEXEC::__no_init};
8282
__std::atomic<int> __emplaced_{0};
8383
};
8484

@@ -231,7 +231,7 @@ namespace exec {
231231
__mconst<__mlist<>>::__f,
232232
__mcompose_q<__mlist, __mbind_front_q<__decayed_tuple, set_error_t>::__f>::__f,
233233
__mlist<__tuple<set_stopped_t>>,
234-
__mconcat<__qq<__variant_for>>::__f
234+
__mconcat<__qq<__variant>>::__f
235235
>;
236236

237237
template <class _Sender, class _Env>

include/exec/sequence/merge_each.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ namespace exec {
456456
}
457457

458458
_Receiver __rcvr_;
459-
_ErrorStorage __error_storage_{};
459+
_ErrorStorage __error_storage_{__no_init};
460460
std::exception_ptr __ex_ = nullptr;
461461
std::atomic_int32_t __active_ = 0;
462462
std::atomic<__completion_t> __completion_{__completion_t::__started};
@@ -656,7 +656,7 @@ namespace exec {
656656

657657
_NextReceiver __rcvr_;
658658
_OperationBase* __op_;
659-
_NestedSeqOp __nested_seq_op_{};
659+
_NestedSeqOp __nested_seq_op_{__no_init};
660660
};
661661

662662
//
@@ -868,7 +868,7 @@ namespace exec {
868868

869869
template <class _Sequence, class... _Env>
870870
using __error_variant_t =
871-
__mapply_q<STDEXEC::__uniqued_variant_for, __errors_t<_Sequence, _Env...>>;
871+
__mapply_q<STDEXEC::__uniqued_variant, __errors_t<_Sequence, _Env...>>;
872872

873873
//
874874
// __nested_values extracts the types of all the nested value senders and
@@ -917,7 +917,7 @@ namespace exec {
917917
using __nested_sequence_ops_variant = __mapply<
918918
STDEXEC::__mtransform<
919919
__nested_sequence_op_fn<__operation_base_t<_Sequence, _Receiver>>,
920-
STDEXEC::__qq<STDEXEC::__uniqued_variant_for>
920+
STDEXEC::__qq<STDEXEC::__uniqued_variant>
921921
>,
922922
__nested_sequences_t<
923923
_Sequence,

include/exec/task.hpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ namespace exec {
264264
__data_.template emplace<0>(std::move(value));
265265
}
266266

267-
__variant_for<_Ty, std::exception_ptr> __data_{};
267+
__variant<_Ty, std::exception_ptr> __data_{__no_init};
268268
};
269269

270270
template <>
@@ -275,7 +275,7 @@ namespace exec {
275275
__data_.template emplace<0>(__void{});
276276
}
277277

278-
__variant_for<__void, std::exception_ptr> __data_{};
278+
__variant<__void, std::exception_ptr> __data_{__no_init};
279279
};
280280

281281
template <class _Sch>
@@ -467,10 +467,12 @@ namespace exec {
467467
constexpr auto await_resume() -> _Ty {
468468
__context_.reset();
469469
scope_guard __on_exit{[this]() noexcept { std::exchange(__coro_, {}).destroy(); }};
470+
470471
if (__coro_.promise().__data_.index() == 1)
471-
std::rethrow_exception(std::move(__coro_.promise().__data_.template get<1>()));
472+
std::rethrow_exception(std::move(__var::__get<1>(__coro_.promise().__data_)));
473+
472474
if constexpr (!std::is_void_v<_Ty>)
473-
return std::move(__coro_.promise().__data_.template get<0>());
475+
return std::move(__var::__get<0>(__coro_.promise().__data_));
474476
}
475477
};
476478

include/exec/variant_sender.hpp

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@
2020
#include "../stdexec/execution.hpp"
2121

2222
namespace exec {
23-
namespace __variant {
23+
namespace __var {
2424
using namespace STDEXEC;
2525

2626
template <class _Receiver, class... _CvSenders>
2727
struct __operation_state {
28-
__variant_for<connect_result_t<_CvSenders, _Receiver>...> __variant_{};
28+
STDEXEC::__variant<connect_result_t<_CvSenders, _Receiver>...> __variant_{STDEXEC::__no_init};
2929

3030
public:
3131
template <class _CvSender>
@@ -40,18 +40,15 @@ namespace exec {
4040
}
4141
};
4242

43-
template <class _OpState, class _Receiver>
43+
template <class _OpState>
4444
struct __visitor {
45-
template <class _Sender>
46-
constexpr auto operator()(_Sender&& __sndr) -> _OpState {
45+
template <class _Receiver, class _Sender>
46+
constexpr auto operator()(_Receiver&& __rcvr, _Sender&& __sndr) -> _OpState {
4747
return _OpState{static_cast<_Sender&&>(__sndr), static_cast<_Receiver&&>(__rcvr)};
4848
}
49-
50-
_Receiver __rcvr;
5149
};
52-
} // namespace __variant
50+
} // namespace __var
5351

54-
// TODO: make STDEXEC::__variant_for work here
5552
template <class... _Senders>
5653
struct variant_sender {
5754
template <class _Self, class _Env>
@@ -60,36 +57,42 @@ namespace exec {
6057
>;
6158

6259
template <std::size_t _Index>
63-
using __nth_sender_t = STDEXEC::__m_at_c<_Index, _Senders...>;
60+
using __nth_t = STDEXEC::__m_at_c<_Index, _Senders...>;
6461

6562
template <class _Self, class _Receiver>
6663
using __opstate_t =
67-
__variant::__operation_state<_Receiver, STDEXEC::__copy_cvref_t<_Self, _Senders>...>;
64+
__var::__operation_state<_Receiver, STDEXEC::__copy_cvref_t<_Self, _Senders>...>;
6865

69-
std::variant<_Senders...> __sndrs_;
66+
STDEXEC::__variant<_Senders...> __sndrs_{STDEXEC::__no_init};
7067

7168
public:
7269
using sender_concept = STDEXEC::sender_t;
7370

74-
constexpr variant_sender() = default;
71+
constexpr variant_sender()
72+
requires std::default_initializable<__nth_t<0>>
73+
{
74+
__sndrs_.template emplace<0>();
75+
}
7576

76-
template <class _Sender>
77-
requires STDEXEC::__one_of<STDEXEC::__decay_t<_Sender>, _Senders...>
77+
template <STDEXEC::__not_decays_to<variant_sender> _Sender>
78+
requires STDEXEC::__decay_copyable<_Sender>
79+
&& STDEXEC::__one_of<STDEXEC::__decay_t<_Sender>, _Senders...>
7880
/*implicit*/ variant_sender(_Sender&& __sndr)
79-
noexcept(STDEXEC::__nothrow_constructible_from<std::variant<_Senders...>, _Sender>)
80-
: __sndrs_{static_cast<_Sender&&>(__sndr)} {
81+
noexcept(STDEXEC::__nothrow_decay_copyable<_Sender>) {
82+
__sndrs_.template emplace<STDEXEC::__decay_t<_Sender>>(static_cast<_Sender&&>(__sndr));
8183
}
8284

8385
[[nodiscard]]
8486
auto index() const noexcept -> std::size_t {
8587
return __sndrs_.index();
8688
}
8789

88-
template <STDEXEC::__decay_copyable _Sender>
89-
requires STDEXEC::__one_of<STDEXEC::__decay_t<_Sender>, _Senders...>
90-
auto operator=(_Sender __sndr) noexcept(STDEXEC::__nothrow_move_constructible<_Sender>)
90+
template <STDEXEC::__not_decays_to<variant_sender> _Sender>
91+
requires STDEXEC::__decay_copyable<_Sender>
92+
&& STDEXEC::__one_of<STDEXEC::__decay_t<_Sender>, _Senders...>
93+
auto operator=(_Sender&& __sndr) noexcept(STDEXEC::__nothrow_decay_copyable<_Sender>)
9194
-> variant_sender& {
92-
__sndrs_ = static_cast<_Sender&&>(__sndr);
95+
__sndrs_.template emplace<STDEXEC::__decay_t<_Sender>>(static_cast<_Sender&&>(__sndr));
9396
return *this;
9497
}
9598

@@ -101,8 +104,8 @@ namespace exec {
101104

102105
template <std::size_t _Index, class... _Args>
103106
auto emplace(_Args&&... __args)
104-
noexcept(STDEXEC::__nothrow_constructible_from<__nth_sender_t<_Index>, _Args...>)
105-
-> __nth_sender_t<_Index>& {
107+
noexcept(STDEXEC::__nothrow_constructible_from<__nth_t<_Index>, _Args...>)
108+
-> __nth_t<_Index>& {
106109
return __sndrs_.template emplace<_Index>(static_cast<_Args&&>(__args)...);
107110
}
108111

@@ -116,9 +119,9 @@ namespace exec {
116119
STDEXEC_EXPLICIT_THIS_BEGIN(auto connect)(this _Self&& __self, _Receiver __rcvr) noexcept(
117120
(STDEXEC::__nothrow_connectable<STDEXEC::__copy_cvref_t<_Self, _Senders>, _Receiver> && ...))
118121
-> __opstate_t<_Self, _Receiver> {
119-
using __visitor_t = __variant::__visitor<__opstate_t<_Self, _Receiver>, _Receiver>;
120-
return std::visit(
121-
__visitor_t{static_cast<_Receiver&&>(__rcvr)}, static_cast<_Self&&>(__self).__sndrs_);
122+
using __visitor_t = __var::__visitor<__opstate_t<_Self, _Receiver>>;
123+
return STDEXEC::__visit(
124+
__visitor_t{}, static_cast<_Self&&>(__self).__sndrs_, static_cast<_Receiver&&>(__rcvr));
122125
}
123126
STDEXEC_EXPLICIT_THIS_END(connect)
124127

include/exec/when_any.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ namespace exec {
7474
using __result_type_t = __for_each_completion_signature_t<
7575
__minvoke<__completions_fn<_Env>, _CvSenders...>,
7676
__decayed_tuple,
77-
__uniqued_variant_for
77+
__uniqued_variant
7878
>;
7979

8080
template <class _Receiver>
@@ -107,7 +107,7 @@ namespace exec {
107107
__std::atomic<std::size_t> __count_{};
108108

109109
_Receiver __rcvr_;
110-
_ResultVariant __result_{};
110+
_ResultVariant __result_{__no_init};
111111

112112
template <class _Tag, class... _Args>
113113
void notify(_Tag, _Args&&... __args) noexcept {

include/nvexec/detail/variant.cuh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ namespace nvexec {
5555
V&& v,
5656
std::size_t index) {
5757
if (0 == index) {
58-
static_cast<VisitorT&&>(visitor)((static_cast<V&&>(v)).template get<0>());
58+
static_cast<VisitorT&&>(visitor)(static_cast<V&&>(v).template get<0>());
5959
}
6060
}
6161

@@ -67,7 +67,7 @@ namespace nvexec {
6767
V&& v,
6868
std::size_t index) {
6969
if (I == index) {
70-
static_cast<VisitorT&&>(visitor)((static_cast<V&&>(v)).template get<I>());
70+
static_cast<VisitorT&&>(visitor)(static_cast<V&&>(v).template get<I>());
7171
return;
7272
}
7373

include/nvexec/stream/common.cuh

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ namespace nvexec {
325325
};
326326

327327
template <class... Ts>
328-
// using _nullable_variant_t = STDEXEC::__variant_for<::cuda::std::tuple<set_noop>, Ts...>;
328+
// using _nullable_variant_t = STDEXEC::__variant<::cuda::std::tuple<set_noop>, Ts...>;
329329
using _nullable_variant_t = variant_t<::cuda::std::tuple<set_noop>, Ts...>;
330330

331331
template <class... Ts>
@@ -407,11 +407,13 @@ namespace nvexec {
407407
concept stream_sender = sender_in<Sender, E>
408408
&& STDEXEC_IS_BASE_OF(
409409
stream_sender_base,
410-
STDEXEC_REMOVE_REFERENCE(STDEXEC::transform_sender_result_t<Sender, E>));
410+
STDEXEC_REMOVE_REFERENCE(
411+
STDEXEC::transform_sender_result_t<Sender, E>));
411412

412413
template <class Receiver>
413-
concept stream_receiver = receiver<Receiver>
414-
&& STDEXEC_IS_BASE_OF(stream_receiver_base, STDEXEC_REMOVE_REFERENCE(Receiver));
414+
concept stream_receiver =
415+
receiver<Receiver>
416+
&& STDEXEC_IS_BASE_OF(stream_receiver_base, STDEXEC_REMOVE_REFERENCE(Receiver));
415417

416418
struct stream_opstate_base { };
417419

@@ -632,8 +634,7 @@ namespace nvexec {
632634

633635
template <class... Args>
634636
void set_value(Args&&... args) noexcept {
635-
opstate_
636-
.propagate_completion_signal(set_value_t(), static_cast<Args&&>(args)...);
637+
opstate_.propagate_completion_signal(set_value_t(), static_cast<Args&&>(args)...);
637638
}
638639

639640
template <class Error>
@@ -775,11 +776,13 @@ namespace nvexec {
775776
template <class Sender, class E>
776777
concept stream_completing_sender =
777778
sender<Sender>
778-
&& gpu_stream_scheduler<__result_of<get_completion_scheduler<set_value_t>, env_of_t<Sender>, E>, E>;
779+
&& gpu_stream_scheduler<
780+
__result_of<get_completion_scheduler<set_value_t>, env_of_t<Sender>, E>,
781+
E
782+
>;
779783

780784
template <class InnerReceiverProvider, class OuterReceiver>
781-
using inner_receiver_t =
782-
__call_result_t<InnerReceiverProvider, opstate_base<OuterReceiver>&>;
785+
using inner_receiver_t = __call_result_t<InnerReceiverProvider, opstate_base<OuterReceiver>&>;
783786

784787
template <class CvSender, class InnerReceiver, class OuterReceiver>
785788
using stream_opstate_t = _strm::opstate<CvSender, InnerReceiver, OuterReceiver>;

0 commit comments

Comments
 (0)