Skip to content

Commit 79be4c7

Browse files
authored
Merge pull request #1087 from NVIDIA/into-variant-transform-sender
port `into_variant()` to use `transform_sender`
2 parents a9c95c2 + 3aad1bf commit 79be4c7

File tree

1 file changed

+45
-71
lines changed

1 file changed

+45
-71
lines changed

include/stdexec/execution.hpp

Lines changed: 45 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -5923,93 +5923,67 @@ namespace stdexec {
59235923
};
59245924
};
59255925

5926-
template <class _SenderId>
5927-
struct __sender {
5928-
using _Sender = stdexec::__t<_SenderId>;
5929-
5930-
template <class _Env>
5931-
using __variant_t = __try_value_types_of_t<_Sender, _Env>;
5932-
5933-
template <class _Receiver>
5934-
using __receiver_t = //
5935-
stdexec::__t< __receiver<__id<_Receiver>, __variant_t<env_of_t<_Receiver>>>>;
5936-
5937-
struct __t {
5938-
using __id = __sender;
5939-
using is_sender = void;
5940-
5941-
template <__decays_to<_Sender> _CvrefSender>
5942-
explicit __t(_CvrefSender&& __sndr)
5943-
: __sndr_((_CvrefSender&&) __sndr) {
5944-
}
5945-
5946-
private:
5947-
template <class...>
5948-
using __set_value_t = completion_signatures<>;
5949-
5950-
template <class _Variant>
5951-
using __variant_completions =
5952-
completion_signatures< set_value_t(_Variant), set_error_t(std::exception_ptr)>;
5953-
5954-
template <class _Env>
5955-
using __compl_sigs = //
5956-
__try_make_completion_signatures<
5957-
_Sender,
5958-
_Env,
5959-
__meval<__variant_completions, __variant_t<_Env>>,
5960-
__q<__set_value_t>>;
5961-
5962-
_Sender __sndr_;
5926+
template <class _Sender, class _Env>
5927+
using __variant_t = __try_value_types_of_t<_Sender, _Env>;
59635928

5964-
template <receiver _Receiver>
5965-
requires sender_to<_Sender, __receiver_t<_Receiver>>
5966-
friend auto tag_invoke(connect_t, __t&& __self, _Receiver __rcvr) //
5967-
noexcept(__nothrow_connectable<_Sender, __receiver_t<_Receiver>>)
5968-
-> connect_result_t<_Sender, __receiver_t<_Receiver>> {
5969-
return stdexec::connect(
5970-
(_Sender&&) __self.__sndr_, __receiver_t<_Receiver>{(_Receiver&&) __rcvr});
5971-
}
5929+
template <class _Sender, class _Receiver>
5930+
using __receiver_t = //
5931+
stdexec::__t< __receiver<__id<_Receiver>, __variant_t<_Sender, env_of_t<_Receiver>>>>;
59725932

5973-
friend auto tag_invoke(get_env_t, const __t& __self) noexcept -> env_of_t<const _Sender&> {
5974-
return get_env(__self.__sndr_);
5975-
}
5933+
template <class _Variant>
5934+
using __variant_completions =
5935+
completion_signatures< set_value_t(_Variant), set_error_t(std::exception_ptr)>;
59765936

5977-
template <class _Env>
5978-
friend auto tag_invoke(get_completion_signatures_t, __t&&, _Env&&) //
5979-
-> __compl_sigs<_Env> {
5980-
return {};
5981-
}
5982-
};
5983-
};
5937+
template <class _Sender, class _Env>
5938+
using __compl_sigs = //
5939+
__try_make_completion_signatures<
5940+
_Sender,
5941+
_Env,
5942+
__meval<__variant_completions, __variant_t<_Sender, _Env>>,
5943+
__mconst<completion_signatures<>>>;
59845944

5985-
struct into_variant_t {
5945+
struct into_variant_t : __default_get_env<into_variant_t> {
59865946
template <sender _Sender>
5987-
auto operator()(_Sender&& __sndr) const -> __t<__sender<stdexec::__id<__decay_t<_Sender>>>> {
5988-
return __t<__sender<stdexec::__id<__decay_t<_Sender>>>>{(_Sender&&) __sndr};
5947+
auto operator()(_Sender&& __sndr) const {
5948+
auto __domain = __get_sender_domain(__sndr);
5949+
return transform_sender(
5950+
__domain, make_sender_expr<into_variant_t>(__(), std::move(__sndr)));
59895951
}
59905952

59915953
auto operator()() const noexcept {
59925954
return __binder_back<into_variant_t>{};
59935955
}
5956+
5957+
#if STDEXEC_FRIENDSHIP_IS_LEXICAL()
5958+
private:
5959+
template <class...>
5960+
friend struct stdexec::__sexpr;
5961+
#endif
5962+
5963+
template <sender_expr_for<into_variant_t> _Self, receiver _Receiver>
5964+
requires sender_to<__child_of<_Self>, __receiver_t<__child_of<_Self>, _Receiver>>
5965+
static auto connect(_Self&& __self, _Receiver __rcvr) //
5966+
noexcept(
5967+
__nothrow_connectable<__child_of<_Self>, __receiver_t<__child_of<_Self>, _Receiver>>)
5968+
-> connect_result_t<__child_of<_Self>, __receiver_t<__child_of<_Self>, _Receiver>> {
5969+
return apply_sender(
5970+
(_Self&&) __self, [&]<class _Child>(__ignore, __ignore, _Child&& __child) {
5971+
return stdexec::connect(
5972+
(_Child&&) __child, __receiver_t<_Child, _Receiver>{(_Receiver&&) __rcvr});
5973+
});
5974+
}
5975+
5976+
template <sender_expr_for<into_variant_t> _Self, class _Env>
5977+
static auto get_completion_signatures(_Self&&, _Env&&) //
5978+
-> __compl_sigs<__child_of<_Self>, _Env> {
5979+
return {};
5980+
}
59945981
};
59955982
} // namespace __into_variant
59965983

59975984
using __into_variant::into_variant_t;
59985985
inline constexpr into_variant_t into_variant{};
59995986

6000-
// Temporary until we migrate into_variant() to use __sexpr:
6001-
namespace __detail {
6002-
struct __into_variant_sender_name {
6003-
template <class _Sender>
6004-
using __f = __mapply<
6005-
__transform< __mcompose<__q<__name_of>, __q<__t>>, __q<__into_variant::__sender>>,
6006-
_Sender>;
6007-
};
6008-
6009-
template <class _SenderId>
6010-
extern __into_variant_sender_name __name_of_v<__into_variant::__sender<_SenderId>>;
6011-
}
6012-
60135987
/////////////////////////////////////////////////////////////////////////////
60145988
// [execution.senders.adaptors.when_all]
60155989
// [execution.senders.adaptors.when_all_with_variant]

0 commit comments

Comments
 (0)