2020#include " ../stdexec/execution.hpp"
2121
2222namespace 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
0 commit comments