| 608 | private: |
| 609 | template <sender _Sender, scope_token _Token, class _Env> |
| 610 | auto __impl(_Sender&& __sndr, _Token&& __tkn, _Env&& __env) const |
| 611 | { |
| 612 | using __alloc_t = decltype(__spawn_common::__choose_alloc(__env, STDEXEC::get_env(__sndr))); |
| 613 | using __senv_t = decltype(__spawn_common::__choose_senv(__env, STDEXEC::get_env(__sndr))); |
| 614 | |
| 615 | using __spawn_future_state_t = |
| 616 | __spawn_future_state<__alloc_t, std::remove_cvref_t<_Token>, _Sender, __senv_t>; |
| 617 | |
| 618 | using __traits = |
| 619 | std::allocator_traits<__alloc_t>::template rebind_traits<__spawn_future_state_t>; |
| 620 | typename __traits::allocator_type __alloc( |
| 621 | __spawn_common::__choose_alloc(__env, STDEXEC::get_env(__sndr))); |
| 622 | |
| 623 | auto* __op = __traits::allocate(__alloc, 1); |
| 624 | |
| 625 | __scope_guard __guard{[&]() noexcept { __traits::deallocate(__alloc, __op, 1); }}; |
| 626 | |
| 627 | __traits::construct(__alloc, |
| 628 | __op, |
| 629 | __alloc, |
| 630 | static_cast<_Sender&&>(__sndr), |
| 631 | static_cast<_Token&&>(__tkn), |
| 632 | __spawn_common::__choose_senv(__env, STDEXEC::get_env(__sndr))); |
| 633 | |
| 634 | __guard.__dismiss(); |
| 635 | |
| 636 | struct __abandoner |
| 637 | { |
| 638 | void operator()(__spawn_future_state_t* __p) const noexcept |
| 639 | { |
| 640 | __p->__abandon(); |
| 641 | } |
| 642 | }; |
| 643 | |
| 644 | return __make_sexpr<spawn_future_t>( |
| 645 | std::unique_ptr<__spawn_future_state_t, __abandoner>(__op)); |
| 646 | } |
| 647 | }; |
| 648 | |
| 649 | template <class _Sender> |