| 40 | } // namespace __ensure_started |
| 41 | |
| 42 | struct ensure_started_t |
| 43 | { |
| 44 | template <class _Env = STDEXEC::env<>, STDEXEC::sender_in<_Env> _CvSender> |
| 45 | [[nodiscard]] |
| 46 | auto |
| 47 | operator()(_CvSender&& __sndr, _Env&& __env = {}) const -> STDEXEC::__well_formed_sender auto |
| 48 | { |
| 49 | if constexpr (__ensure_started::__is_ensure_started_sender<_CvSender>) |
| 50 | { |
| 51 | return static_cast<_CvSender&&>(__sndr); |
| 52 | } |
| 53 | else |
| 54 | { |
| 55 | return STDEXEC::transform_sender( |
| 56 | STDEXEC::__make_sexpr<ensure_started_t>(static_cast<_Env&&>(__env), |
| 57 | static_cast<_CvSender&&>(__sndr)), |
| 58 | __env); |
| 59 | } |
| 60 | } |
| 61 | |
| 62 | [[nodiscard]] |
| 63 | constexpr auto operator()() const noexcept |
| 64 | { |
| 65 | return STDEXEC::__closure(*this); |
| 66 | } |
| 67 | |
| 68 | template <class _CvSender> |
| 69 | static constexpr auto |
| 70 | transform_sender(STDEXEC::set_value_t, _CvSender&& __sndr, STDEXEC::__ignore) |
| 71 | { |
| 72 | static_assert(sender_for<_CvSender, ensure_started_t>); |
| 73 | auto __result = __shared::__sndr{ensure_started_t(), |
| 74 | STDEXEC::__get<2>(static_cast<_CvSender&&>(__sndr)), |
| 75 | STDEXEC::__get<1>(static_cast<_CvSender&&>(__sndr))}; |
| 76 | // eagerly start the operation: |
| 77 | __result.__sh_state_->__try_start(); |
| 78 | return __result; |
| 79 | } |
| 80 | }; |
| 81 | |
| 82 | inline constexpr ensure_started_t ensure_started{}; |
| 83 | } // namespace experimental::execution |