-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathconnect.hpp
53 lines (46 loc) · 2.04 KB
/
connect.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// include/beman/execution26/detail/connect.hpp -*-C++-*-
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#ifndef INCLUDED_BEMAN_EXECUTION26_DETAIL_CONNECT
#define INCLUDED_BEMAN_EXECUTION26_DETAIL_CONNECT
#include <beman/execution26/detail/transform_sender.hpp>
#include <beman/execution26/detail/get_domain_late.hpp>
#include <beman/execution26/detail/get_env.hpp>
#include <beman/execution26/detail/operation_state.hpp>
#include <type_traits>
#include <concepts>
// ----------------------------------------------------------------------------
namespace beman::execution26
{
struct connect_t
{
template <typename Sender, typename Receiver>
auto operator()(Sender&& sender, Receiver&& receiver) const
noexcept(true/*-dk:TODO*/)
{
auto new_sender = [&sender, &receiver]() -> decltype(auto) {
return ::beman::execution26::transform_sender(
decltype(
::beman::execution26::detail::get_domain_late(::std::forward<Sender>(sender),
::beman::execution26::get_env(receiver))
){},
::std::forward<Sender>(sender),
::beman::execution26::get_env(receiver)
);
};
if constexpr (requires{ new_sender().connect(::std::forward<Receiver>(receiver)); })
{
using state_type = decltype(new_sender().connect(::std::forward<Receiver>(receiver)));
static_assert(::beman::execution26::operation_state<state_type>);
return new_sender().connect(::std::forward<Receiver>(receiver));
}
else
{
enum bad_sender {};
static_assert(::std::same_as<bad_sender, decltype(new_sender())>, "result from transform_sender has no suitable connect()");
}
}
};
inline constexpr connect_t connect{};
}
// ----------------------------------------------------------------------------
#endif