Skip to content

Commit d218a27

Browse files
committed
added write_env (not, yet, working) and fixed various issues
1 parent 264378a commit d218a27

10 files changed

+286
-79
lines changed

include/beman/execution26/detail/basic_operation.hpp

+12-5
Original file line numberDiff line numberDiff line change
@@ -44,23 +44,30 @@ namespace beman::execution26::detail
4444

4545
auto start() & noexcept -> void
4646
{
47-
static constexpr ::beman::execution26::detail::sender_any_t at{};
48-
if constexpr (requires{ inner_ops_t{at, at, at, at}; })
47+
if constexpr (requires(){
48+
[]{ auto&&[op0, op1, op2, op3] = *static_cast<inner_ops_t*>(nullptr); };
49+
})
4950
{
5051
auto&[op0, op1, op2, op3] = this->inner_ops;
5152
::beman::execution26::detail::impls_for<tag_t>::start(this->state, this->receiver, op0, op1, op2, op3);
5253
}
53-
else if constexpr (requires{ inner_ops_t{at, at, at}; })
54+
else if constexpr (requires(){
55+
[]{ auto&&[op0, op1, op2] = *static_cast<inner_ops_t*>(nullptr); };
56+
})
5457
{
5558
auto&[op0, op1, op2] = this->inner_ops;
5659
::beman::execution26::detail::impls_for<tag_t>::start(this->state, this->receiver, op0, op1, op2);
5760
}
58-
else if constexpr (requires{ inner_ops_t{at, at}; })
61+
else if constexpr (requires(){
62+
[]{ auto&&[op0, op1] = *static_cast<inner_ops_t*>(nullptr); };
63+
})
5964
{
6065
auto&[op0, op1] = this->inner_ops;
6166
::beman::execution26::detail::impls_for<tag_t>::start(this->state, this->receiver, op0, op1);
6267
}
63-
else if constexpr (requires{ inner_ops_t{at}; })
68+
else if constexpr (requires(){
69+
[]{ auto&&[op0] = *static_cast<inner_ops_t*>(nullptr); };
70+
})
6471
{
6572
auto&[op0] = this->inner_ops;
6673
::beman::execution26::detail::impls_for<tag_t>::start(this->state, this->receiver, op0);

include/beman/execution26/detail/basic_receiver.hpp

+9
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <beman/execution26/detail/state_type.hpp>
1414
#include <beman/execution26/detail/valid_specialization.hpp>
1515
#include <utility>
16+
#include <iostream> //-dk:TODO remove
1617

1718
// ----------------------------------------------------------------------------
1819

@@ -69,6 +70,14 @@ namespace beman::execution26::detail
6970
::beman::execution26::set_stopped_t());
7071
}
7172

73+
auto get_env() const noexcept
74+
-> ::beman::execution26::detail::env_type<Index, Sender, Receiver>
75+
{
76+
std::cout << "basic_receiver::get_env tag=" << tag_t::name() << "\n";
77+
return ::beman::execution26::detail::impls_for<tag_t>
78+
::get_env(Index(), this->op->state, this->op->receiver);
79+
}
80+
7281
::beman::execution26::detail::basic_state<Sender, Receiver>* op{};
7382
};
7483
}

include/beman/execution26/detail/basic_sender.hpp

+15-22
Original file line numberDiff line numberDiff line change
@@ -26,48 +26,41 @@ namespace beman::execution26::detail
2626

2727
auto get_env() const noexcept -> decltype(auto)
2828
{
29-
static constexpr ::beman::execution26::detail::sender_any_t at{};
30-
31-
if constexpr (
32-
requires{ basic_sender{ at, at, at, at, at, at }; }
33-
|| requires{ basic_sender{ { at, at, at, at, at, at } }; }
34-
)
29+
if constexpr (requires(){
30+
[]{ auto&&[tag, data, c0, c1, c2, c3] = *static_cast<basic_sender*>(nullptr); };
31+
})
3532
{
3633
auto&[_, data, child0, child1, child2, child3] = *this;
3734
return ::beman::execution26::detail::impls_for<Tag>
3835
::get_attrs(data, child0, child1, child2, child3);
3936
}
40-
else if constexpr (
41-
requires{ basic_sender{ at, at, at, at, at }; }
42-
|| requires{ basic_sender{ { at, at, at, at, at } }; }
43-
)
37+
else if constexpr (requires(){
38+
[]{ auto&&[tag, data, c0, c1, c2] = *static_cast<basic_sender*>(nullptr); };
39+
})
4440
{
4541
auto&[_, data, child0, child1, child2] = *this;
4642
return ::beman::execution26::detail::impls_for<Tag>
4743
::get_attrs(data, child0, child1, child2);
4844
}
49-
else if constexpr (
50-
requires{ basic_sender{ at, at, at, at }; }
51-
|| requires{ basic_sender{ { at, at, at, at } }; }
52-
)
45+
else if constexpr (requires(){
46+
[]{ auto&&[tag, data, c0, c1] = *static_cast<basic_sender*>(nullptr); };
47+
})
5348
{
5449
auto&[_, data, child0, child1] = *this;
5550
return ::beman::execution26::detail::impls_for<Tag>
5651
::get_attrs(data, child0, child1);
5752
}
58-
else if constexpr (
59-
requires{ basic_sender{ at, at, at }; }
60-
|| requires{ basic_sender{ { at, at, at } }; }
61-
)
53+
else if constexpr (requires(){
54+
[]{ auto&&[tag, data, c0] = *static_cast<basic_sender*>(nullptr); };
55+
})
6256
{
6357
auto&[_, data, child0] = *this;
6458
return ::beman::execution26::detail::impls_for<Tag>
6559
::get_attrs(data, child0);
6660
}
67-
else if constexpr (
68-
requires{ basic_sender{ at, at }; }
69-
|| requires{ basic_sender{ { at, at } }; }
70-
)
61+
else if constexpr (requires(){
62+
[]{ auto&&[tag, data] = *static_cast<basic_sender*>(nullptr); };
63+
})
7164
{
7265
auto&[_, data] = *this;
7366
return ::beman::execution26::detail::impls_for<Tag>

include/beman/execution26/detail/basic_state.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ namespace beman::execution26::detail
1919
basic_state(Sender&& sender, Receiver&& receiver) noexcept(true)
2020
: receiver(::std::move(receiver))
2121
, state(::beman::execution26::detail::impls_for<
22-
::beman::execution26::tag_of_t<Sender>
23-
>::get_state(::std::forward<Sender>(sender), receiver))
22+
::beman::execution26::tag_of_t<Sender>
23+
>::get_state(::std::forward<Sender>(sender), receiver))
2424
{
2525
}
2626

include/beman/execution26/detail/connect_all.hpp

+15-6
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ namespace beman::execution26::detail
2727
::std::index_sequence<I...>) const noexcept(true/*-dk:TODO*/)
2828
{
2929
using sender_type = ::std::remove_cvref_t<Sender>;
30-
static constexpr ::beman::execution26::detail::sender_any_t at{};
31-
if constexpr (requires(){ sender_type{ at, at, at, at, at, at }; })
30+
if constexpr (requires(){
31+
[]{ auto&&[tag, data, c0, c1, c2, c3] = *static_cast<sender_type*>(nullptr); };
32+
})
3233
{
3334
auto&& [tag, data, c0, c1, c2, c3] = sender;
3435
use(tag);
@@ -52,7 +53,9 @@ namespace beman::execution26::detail
5253
::std::integral_constant<::size_t, 3>>{op})
5354
};
5455
}
55-
else if constexpr (requires(){ sender_type{ at, at, at, at, at }; })
56+
else if constexpr (requires(){
57+
[]{ auto&&[tag, data, c0, c1, c2] = *static_cast<sender_type*>(nullptr); };
58+
})
5659
{
5760
auto&& [tag, data, c0, c1, c2] = sender;
5861
use(tag);
@@ -72,7 +75,9 @@ namespace beman::execution26::detail
7275
::std::integral_constant<::size_t, 2>>{op})
7376
};
7477
}
75-
else if constexpr (requires(){ sender_type{ at, at, at, at }; })
78+
else if constexpr (requires(){
79+
[]{ auto&&[tag, data, c0, c1] = *static_cast<sender_type*>(nullptr); };
80+
})
7681
{
7782
auto&& [tag, data, c0, c1] = sender;
7883
use(tag);
@@ -88,7 +93,9 @@ namespace beman::execution26::detail
8893
::std::integral_constant<::size_t, 1>>{op})
8994
};
9095
}
91-
else if constexpr (requires(){ sender_type{ at, at, at }; })
96+
else if constexpr (requires(){
97+
[]{ auto&&[tag, data, c0] = *static_cast<sender_type*>(nullptr); };
98+
})
9299
{
93100
auto&& [tag, data, c0] = sender;
94101
use(tag);
@@ -100,7 +107,9 @@ namespace beman::execution26::detail
100107
::std::integral_constant<::size_t, 0>>{op})
101108
};
102109
}
103-
else if constexpr (requires(){ sender_type{ at, at }; })
110+
else if constexpr (requires(){
111+
[]{ auto&&[tag, data] = *static_cast<sender_type*>(nullptr); };
112+
})
104113
{
105114
auto&& [tag, data] = sender;
106115
use(tag);

include/beman/execution26/detail/decayed_typeof.hpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44
#ifndef INCLUDED_BEMAN_EXECUTION26_DETAIL_DECAYED_TYPEOF
55
#define INCLUDED_BEMAN_EXECUTION26_DETAIL_DECAYED_TYPEOF
66

7+
#include <type_traits>
8+
79
// ----------------------------------------------------------------------------
810

911
namespace beman::execution26::detail
1012
{
11-
template <auto const& Tag>
12-
// using decayed_typeof = decltype(auto(Tag));
13-
using decayed_typeof = decltype([]{ return Tag; }());
13+
template <auto&& Tag>
14+
using decayed_typeof = ::std::decay_t<decltype(Tag)>;
1415
}
1516

1617
// ----------------------------------------------------------------------------

include/beman/execution26/detail/sender_decompose.hpp

+32-32
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,6 @@
1212

1313
namespace beman::execution26::detail
1414
{
15-
inline constexpr struct sender_any_t
16-
{
17-
template <typename T> constexpr operator T() const;
18-
} sender_any;
19-
2015
template <typename Tag, typename Data, typename Children>
2116
struct sender_meta
2217
{
@@ -42,43 +37,38 @@ namespace beman::execution26::detail
4237
return sender_meta<decltype(tag), decltype(data), ::std::tuple<decltype(children)...>>;
4338
#endif
4439
using sender_type = ::std::remove_cvref_t<Sender>;
45-
static constexpr ::beman::execution26::detail::sender_any_t at{};
46-
if constexpr (
47-
requires(){ sender_type{ at, at, at, at, at, at }; }
48-
|| requires(){ sender_type{ { at, at, at, at, at, at } }; }
49-
)
40+
41+
if constexpr (requires(){
42+
[]{ auto&&[tag, data, c0, c1, c2, c3] = *static_cast<sender_type*>(nullptr); };
43+
})
5044
{
5145
auto&& [tag, data, c0, c1, c2, c3] = sender;
5246
return ::beman::execution26::detail::sender_meta<decltype(tag), decltype(data), ::std::tuple<decltype(c0), decltype(c1), decltype(c2), decltype(c3)>>{};
5347
}
54-
else if constexpr (
55-
requires(){ sender_type{ at, at, at, at, at }; }
56-
|| requires(){ sender_type{ { at, at, at, at, at } }; }
57-
)
48+
else if constexpr (requires(){
49+
[]{ auto&&[tag, data, c0, c1, c2] = *static_cast<sender_type*>(nullptr); };
50+
})
5851
{
5952
auto&& [tag, data, c0, c1, c2] = sender;
6053
return ::beman::execution26::detail::sender_meta<decltype(tag), decltype(data), ::std::tuple<decltype(c0), decltype(c1), decltype(c2)>>{};
6154
}
62-
else if constexpr (
63-
requires(){ sender_type{ at, at, at, at }; }
64-
|| requires(){ sender_type{ { at, at, at, at } }; }
65-
)
55+
else if constexpr (requires(){
56+
[]{ auto&&[tag, data, c0, c1] = *static_cast<sender_type*>(nullptr); };
57+
})
6658
{
6759
auto&& [tag, data, c0, c1] = sender;
6860
return ::beman::execution26::detail::sender_meta<decltype(tag), decltype(data), ::std::tuple<decltype(c0), decltype(c1)>>{};
6961
}
70-
else if constexpr (
71-
requires(){ sender_type{ at, at, at }; }
72-
|| requires(){ sender_type{ { at, at, at } }; }
73-
)
62+
else if constexpr (requires(){
63+
[]{ auto&&[tag, data, c0] = *static_cast<sender_type*>(nullptr); };
64+
})
7465
{
7566
auto&& [tag, data, c0] = sender;
7667
return ::beman::execution26::detail::sender_meta<decltype(tag), decltype(data), ::std::tuple<decltype(c0)>>{};
7768
}
78-
else if constexpr (
79-
requires(){ sender_type{ at, at }; }
80-
|| requires(){ sender_type{ { at, at } }; }
81-
)
69+
else if constexpr (requires(){
70+
[]{ auto&&[tag, data] = *static_cast<sender_type*>(nullptr); };
71+
})
8272
{
8373
auto&& [tag, data] = sender;
8474
return ::beman::execution26::detail::sender_meta<decltype(tag), decltype(data), ::std::tuple<>>{};
@@ -98,36 +88,46 @@ namespace beman::execution26::detail
9888
return sender_meta<decltype(tag), decltype(data), ::std::tuple<decltype(children)...>>;
9989
#endif
10090
using sender_type = ::std::remove_cvref_t<Sender>;
101-
static constexpr ::beman::execution26::detail::sender_any_t at{};
102-
if constexpr (requires(){ sender_type{ at, at, at, at, at, at }; })
91+
92+
if constexpr (requires(){
93+
[]{ auto&&[tag, data, c0, c1, c2, c3] = *static_cast<sender_type*>(nullptr); };
94+
})
10395
{
10496
auto&& [tag, data, c0, c1, c2, c3] = sender;
10597
return ::beman::execution26::detail::sender_data<decltype(tag), decltype(data), decltype(::std::tie(c0, c1, c2, c3))>{
10698
tag, data, ::std::tie(c0, c1, c2, c3)
10799
};
108100
}
109-
else if constexpr (requires(){ sender_type{ at, at, at, at, at }; })
101+
else if constexpr (requires(){
102+
[]{ auto&&[tag, data, c0, c1, c2] = *static_cast<sender_type*>(nullptr); };
103+
})
110104
{
111105
auto&& [tag, data, c0, c1, c2] = sender;
112106
return ::beman::execution26::detail::sender_data<decltype(tag), decltype(data), decltype(::std::tie(c0, c1, c2))>{
113107
tag, data, ::std::tie(c0, c1, c2)
114108
};
115109
}
116-
else if constexpr (requires(){ sender_type{ at, at, at, at }; })
110+
else if constexpr (requires(){
111+
[]{ auto&&[tag, data, c0, c1] = *static_cast<sender_type*>(nullptr); };
112+
})
117113
{
118114
auto&& [tag, data, c0, c1] = sender;
119115
return ::beman::execution26::detail::sender_data<decltype(tag), decltype(data), decltype(::std::tie(c0, c1))>{
120116
tag, data, ::std::tie(c0, c1)
121117
};
122118
}
123-
else if constexpr (requires(){ sender_type{ at, at, at }; })
119+
else if constexpr (requires(){
120+
[]{ auto&&[tag, data, c0] = *static_cast<sender_type*>(nullptr); };
121+
})
124122
{
125123
auto&& [tag, data, c0] = sender;
126124
return ::beman::execution26::detail::sender_data<decltype(tag), decltype(data), decltype(::std::tie(c0))>{
127125
tag, data, ::std::tie(c0)
128126
};
129127
}
130-
else if constexpr (requires(){ sender_type{ at, at }; })
128+
else if constexpr (requires(){
129+
[]{ auto&&[tag, data] = *static_cast<sender_type*>(nullptr); };
130+
})
131131
{
132132
auto&& [tag, data] = sender;
133133
return ::beman::execution26::detail::sender_data<decltype(tag), decltype(data), ::std::tuple<>>{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// include/beman/execution26/detail/write_env.hpp -*-C++-*-
2+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3+
4+
#ifndef INCLUDED_BEMAN_EXECUTION26_DETAIL_WRITE_ENV
5+
#define INCLUDED_BEMAN_EXECUTION26_DETAIL_WRITE_ENV
6+
7+
#include <beman/execution26/detail/default_impls.hpp>
8+
#include <beman/execution26/detail/get_env.hpp>
9+
#include <beman/execution26/detail/impls_for.hpp>
10+
#include <beman/execution26/detail/join_env.hpp>
11+
#include <beman/execution26/detail/make_sender.hpp>
12+
#include <beman/execution26/detail/queryable.hpp>
13+
#include <beman/execution26/detail/sender.hpp>
14+
#include <utility>
15+
16+
// ----------------------------------------------------------------------------
17+
18+
namespace beman::execution26::detail
19+
{
20+
struct write_env_t
21+
{
22+
template <::beman::execution26::sender Sender,
23+
::beman::execution26::detail::queryable Env>
24+
constexpr auto operator()(Sender&& sender, Env&& env) const
25+
{
26+
return ::beman::execution26::detail::make_sender(
27+
*this, ::std::forward<Env>(env), ::std::forward<Sender>(sender)
28+
);
29+
}
30+
static auto name() { return "write_env_t"; }
31+
};
32+
33+
template <>
34+
struct impls_for<write_env_t>
35+
: ::beman::execution26::detail::default_impls
36+
{
37+
static constexpr auto get_env
38+
= [](auto, auto const& state, auto const& receiver) noexcept
39+
{
40+
return ::beman::execution26::detail::join_env(
41+
state,
42+
::beman::execution26::get_env(receiver)
43+
);
44+
};
45+
};
46+
47+
inline constexpr write_env_t write_env{};
48+
}
49+
50+
// ----------------------------------------------------------------------------
51+
52+
#endif

0 commit comments

Comments
 (0)