Skip to content

Commit 75ef403

Browse files
committed
change how completion_signatures_for works, making it customizable
1 parent 5ccd0a3 commit 75ef403

File tree

4 files changed

+47
-6
lines changed

4 files changed

+47
-6
lines changed

include/beman/execution26/detail/basic_sender.hpp

-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ namespace beman::execution26::detail
6565
return { ::std::forward<Self>(self), ::std::move(receiver) };
6666
}
6767
#endif
68-
#if 1
6968
#if __cpp_explicit_this_parameter < 202110L
7069
template <typename Env>
7170
auto get_completion_signatures(Env&&) &&
@@ -99,7 +98,6 @@ namespace beman::execution26::detail
9998
{
10099
return {};
101100
}
102-
#endif
103101
#endif
104102
};
105103
}

include/beman/execution26/detail/completion_signatures_for.hpp

+19-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <beman/execution26/detail/get_completion_signatures.hpp>
99
#include <functional>
1010
#include <type_traits>
11+
#include <concepts>
1112

1213
// ----------------------------------------------------------------------------
1314

@@ -16,15 +17,31 @@ namespace beman::execution26::detail
1617
struct no_completion_signatures_defined_in_sender {};
1718

1819
template <typename Sender, typename Env>
19-
using completion_signatures_for
20-
= decltype(::std::invoke([]{
20+
struct completion_signatures_for_impl
21+
{
22+
using type = decltype(::std::invoke([]{
2123
if constexpr (::beman::execution26::sender_in<Sender, Env>)
2224
return decltype(::beman::execution26::get_completion_signatures(
2325
::std::declval<Sender>(), ::std::declval<Env>())
2426
){};
2527
else
2628
return ::beman::execution26::detail::no_completion_signatures_defined_in_sender{};
2729
}));
30+
};
31+
32+
template <typename Sender, typename Env>
33+
using completion_signatures_for
34+
= ::std::conditional_t<
35+
::std::same_as<
36+
beman::execution26::detail::no_completion_signatures_defined_in_sender,
37+
typename ::beman::execution26::detail::completion_signatures_for_impl<
38+
Sender, Env>::type
39+
>,
40+
typename ::beman::execution26::detail::completion_signatures_for_impl<
41+
::std::remove_cvref_t<Sender>, Env>::type,
42+
typename ::beman::execution26::detail::completion_signatures_for_impl<
43+
Sender, Env>::type
44+
>;
2845
}
2946

3047
// ----------------------------------------------------------------------------

include/beman/execution26/detail/write_env.hpp

+14
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <beman/execution26/detail/make_sender.hpp>
1212
#include <beman/execution26/detail/queryable.hpp>
1313
#include <beman/execution26/detail/sender.hpp>
14+
#include <type_traits>
1415
#include <utility>
1516

1617
// ----------------------------------------------------------------------------
@@ -30,6 +31,19 @@ namespace beman::execution26::detail
3031
static auto name() { return "write_env_t"; }
3132
};
3233

34+
template <typename NewEnv, typename Child, typename Env>
35+
struct completion_signatures_for_impl<
36+
::beman::execution26::detail::basic_sender<
37+
::beman::execution26::detail::write_env_t, NewEnv, Child>
38+
, Env>
39+
{
40+
using type = decltype(::beman::execution26::get_completion_signatures(
41+
::std::declval<Child>(),
42+
::beman::execution26::detail::join_env(
43+
::std::declval<NewEnv>(), ::std::declval<Env>())
44+
));
45+
};
46+
3347
template <>
3448
struct impls_for<write_env_t>
3549
: ::beman::execution26::detail::default_impls

src/beman/execution26/tests/exec-snd-expos.pass.cpp

+14-2
Original file line numberDiff line numberDiff line change
@@ -1404,13 +1404,25 @@ namespace
14041404
test_std::completion_signatures<test_std::set_value_t(bool)>,
14051405
decltype(test_std::get_completion_signatures(write_env_sender{}, write_env_env{}))
14061406
>);
1407-
#if 0
1407+
1408+
static_assert(std::same_as<
1409+
test_detail::completion_signatures_for<decltype(we_sender), write_env_env>,
1410+
test_std::completion_signatures<test_std::set_value_t(bool)>
1411+
>);
1412+
static_assert(std::same_as<
1413+
test_detail::completion_signatures_for<decltype(we_sender), test_std::empty_env>,
1414+
test_std::completion_signatures<test_std::set_value_t(bool)>
1415+
>);
1416+
static_assert(std::same_as<
1417+
test_detail::completion_signatures_for<decltype(we_sender)&, test_std::empty_env>,
1418+
test_std::completion_signatures<test_std::set_value_t(bool)>
1419+
>);
14081420
static_assert(test_std::sender_in<decltype(we_sender)>);
14091421
static_assert(std::same_as<
14101422
test_std::completion_signatures<test_std::set_value_t(bool)>,
14111423
decltype(test_std::get_completion_signatures(we_sender, write_env_env{}))
14121424
>);
1413-
#endif
1425+
14141426
static_assert(test_std::sender<decltype(we_sender)>);
14151427
static_assert(std::same_as<
14161428
test_detail::write_env_t,

0 commit comments

Comments
 (0)