Skip to content

Commit 562ec1d

Browse files
authored
updated the code to match P3325 (#197)
* updated the code to match P3325 * it seems clang-17, clang-18 have some problem
1 parent 90af8d9 commit 562ec1d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+306
-182
lines changed

.github/workflows/ci_tests.yml

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,6 @@ jobs:
8787
]
8888
}
8989
]
90-
},
91-
{ "versions": ["18", "17"],
92-
"tests": [
93-
{ "cxxversions": ["c++26", "c++23"],
94-
"tests": [{"stdlibs": ["libc++"], "tests": ["Release.Default"]}]
95-
}
96-
]
9790
}
9891
],
9992
"msvc": [

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ ifeq (${hostSystemName},Darwin)
6262
else ifeq (${hostSystemName},Linux)
6363
export LLVM_DIR=/usr/lib/llvm-20
6464
export PATH:=${LLVM_DIR}/bin:${PATH}
65-
export CXX=clang++-20
65+
# export CXX=clang++-20
6666
else
6767
export CXX=$(COMPILER)
6868
endif

bin/update-cmake-headers.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,8 @@ def get_headers(dir):
2323
return result
2424

2525

26-
sections = {
27-
"public": get_headers("include/beman/*"),
28-
"detail": get_headers("include/beman/*/detail"),
29-
}
30-
3126
file_set_re = re.compile(" *FILE_SET.*")
32-
section_re = re.compile(" *\${TARGET_NAME}_(?P<section>.*)_headers$")
27+
section_re = re.compile(" *FILE_SET *\${TARGET_NAME}_(?P<section>.*)_headers$")
3328
header_re = re.compile(" *\${PROJECT_SOURCE_DIR}/include/beman/.*/.*\.hpp")
3429

3530
if len(sys.argv) != 2:
@@ -41,6 +36,10 @@ def get_headers(dir):
4136

4237
section = ""
4338
section_done = False
39+
sections = {
40+
"public": get_headers("include/beman/*"),
41+
"detail": get_headers("include/beman/*/detail"),
42+
}
4443

4544
with open(cmake, "r") as input:
4645
lines = input.readlines()
@@ -58,7 +57,7 @@ def get_headers(dir):
5857
section_done = True
5958
project = "${PROJECT_SOURCE_DIR}"
6059
for header in sections[section]:
61-
output.write(f" {project}/include/{header}.hpp\n")
60+
output.write(f" {project}/include/{header}.hpp\n")
6261
else:
6362
output.write(line)
6463
pass

docs/dependency.txt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ completion_signature set_stopped
5757
completion_signature set_value
5858
completion_signatures_for completion_signatures
5959
completion_signatures_of_t call_result_t
60-
completion_signatures_of_t empty_env
60+
completion_signatures_of_t env
6161
completion_signatures_of_t get_completion_signatures
6262
completion_signatures_of_t sender_in
6363
completion_tag set_error
@@ -98,7 +98,7 @@ default_domain queryable
9898
default_domain sender
9999
default_domain tag_of_t
100100
default_impls callable
101-
default_impls empty_env
101+
default_impls env
102102
default_impls fwd_env
103103
default_impls get_env
104104
default_impls start
@@ -107,7 +107,7 @@ default_set_error set_value
107107
default_set_value completion_signatures
108108
default_set_value set_value
109109
emplace_from call_result_t
110-
enable_sender empty_env
110+
enable_sender env
111111
enable_sender env_promise
112112
enable_sender is_awaitable
113113
enable_sender is_sender
@@ -153,7 +153,7 @@ get_domain_late get_domain
153153
get_domain_late get_scheduler
154154
get_domain_late query_with_default
155155
get_domain_late sender_for
156-
get_env empty_env
156+
get_env env
157157
get_env mandate_nothrow
158158
get_env queryable
159159
get_forward_progress_guarantee forward_progress_guarantee
@@ -201,7 +201,7 @@ let_error connect_result_t
201201
let_error decayed_tuple
202202
let_error decayed_typeof
203203
let_error default_impls
204-
let_error empty_env
204+
let_error env
205205
let_error fwd_env
206206
let_error get_completion_scheduler
207207
let_error get_domain
@@ -226,7 +226,7 @@ let_stopped connect_result_t
226226
let_stopped decayed_tuple
227227
let_stopped decayed_typeof
228228
let_stopped default_impls
229-
let_stopped empty_env
229+
let_stopped env
230230
let_stopped fwd_env
231231
let_stopped get_completion_scheduler
232232
let_stopped get_domain
@@ -251,7 +251,7 @@ let_value connect_result_t
251251
let_value decayed_tuple
252252
let_value decayed_typeof
253253
let_value default_impls
254-
let_value empty_env
254+
let_value env
255255
let_value fwd_env
256256
let_value get_completion_scheduler
257257
let_value get_domain
@@ -371,7 +371,7 @@ sender_in_of sender_in
371371
sender_in_of set_value
372372
sender_in_of value_signature
373373
sender_in_of value_types_of_t
374-
sender_of empty_env
374+
sender_of env
375375
sender_of sender_in_of
376376
sender_of tag_of_t
377377
sender_to completion_signatures_of_t
@@ -493,7 +493,7 @@ value_types_of_t variant_or_empty
493493
variant_or_empty empty_variant
494494
when_all default_domain
495495
when_all emplace_value
496-
when_all empty_env
496+
when_all env
497497
when_all env_of_t
498498
when_all get_domain
499499
when_all get_domain_early

docs/overview.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ When an asynchronous operation completes it _signals_ its completion by calling
1919
</details>
2020
<details>
2121
<summary>environment</summary>
22-
The term _enviroment_ refers to the bag of properties associated with an <code>_object_</code> by the call <code><a href=‘#get-env’>std::execution::get_env</a>(_object_)</code>. By default the environment for objects is empty (<code><a href=‘#empty-env’>std::execution::empty_env</a></code>). In particular, environments associated with <code><a href=‘#receiver’>receiver</a></code>s are used to provide access to properties like the <a href=‘#get-stop-token’>stop token</a>, <a href=‘#get-scheduler’>scheduler</a>, or <a href=‘#get-allocator’>allocator</a> associated with the <code><a href=‘#receiver’>receiver</a></code>. The various properties associated with an object are accessed via <a href=‘#queries’>queries</a>.
22+
The term _enviroment_ refers to the bag of properties associated with an <code>_object_</code> by the call <code><a href=‘#get-env’>std::execution::get_env</a>(_object_)</code>. By default the environment for objects is empty (<code><a href=‘#env’>std::execution::env&lt;&gt;</a></code>). In particular, environments associated with <code><a href=‘#receiver’>receiver</a></code>s are used to provide access to properties like the <a href=‘#get-stop-token’>stop token</a>, <a href=‘#get-scheduler’>scheduler</a>, or <a href=‘#get-allocator’>allocator</a> associated with the <code><a href=‘#receiver’>receiver</a></code>. The various properties associated with an object are accessed via <a href=‘#queries’>queries</a>.
2323
</details>
2424

2525
## Concepts
@@ -70,7 +70,7 @@ Required members for <code>_Receiver_</code>:
7070
- The type `receiver_concept` is an alias for `receiver_t` or a type derived thereof`.
7171
- Rvalues of type <code>_Receiver_</code> are movable.
7272
- Lvalues of type <code>_Receiver_</code> are copyable.
73-
- <code><a href=‘#get-env’>std::execution::get_env</a>(_receiver_)</code> returns an object. By default this operation returns <code><a href=‘empty-env’>std::execution::empty_env</a></code>.
73+
- <code><a href=‘#get-env’>std::execution::get_env</a>(_receiver_)</code> returns an object. By default this operation returns <code><a href=‘env’>std::execution::env&lt;&gt;</a></code>.
7474
7575
Typical members for <code>_Receiver_</code>:
7676
@@ -177,7 +177,7 @@ Senders represent asynchronous work. They may get composed from multiple senders
177177
178178
Requirements for <code>_Sender_</code>:
179179
- The type <code>_Sender_::sender_concept</code> is an alias for `sender_t` or a type derived thereof or <code>_Sender_</code> is a suitable _awaitable_.
180-
- <code><a href='get_env'>std::execution::get_env</a>(_sender_)</code> is valid. By default this operation returns <code><a href=‘empty-env’>std::execution::empty_env</a></code>.
180+
- <code><a href='get_env'>std::execution::get_env</a>(_sender_)</code> is valid. By default this operation returns <code><a href=‘env’>std::execution::env&lt;&gt;</a></code>.
181181
- Rvalues of type <code>_Sender_</code> can be moved.
182182
- Lvalues of type <code>_Sender_</code> can be copied.
183183
@@ -224,7 +224,7 @@ static_assert(std::execution::sender<example_sender>);
224224
</details>
225225
</details>
226226
<details>
227-
<summary><code>sender_in&lt;<i>Sender, Env</i> = std::execution::empty_env&gt;</code></summary>
227+
<summary><code>sender_in&lt;<i>Sender, Env</i> = std::execution::env&lt;&gt;&gt;</code></summary>
228228

229229
The concept <code>sender_in&lt;<i>Sender, Env</i>&gt;</code> tests whether <code>_Sender_</code> is a <code><a href=‘#sender’>sender</a></code>, <code>_Env_</code> is a destructible type, and <code><a href=‘#get_completion_signatures’>std::execution::get_completion_signatures</a>(_sender_, _env_)</code> yields a specialization of <code><a href=‘#completion_signatures’>std::execution::completion_signatures</a></code>.
230230
</details>
@@ -236,7 +236,7 @@ The concept <code>sender_to&lt;<i>Sender, Receiver</i>&gt;</code> tests if <code
236236
To determine if <code>_Receiver_</code> can receive all <a href=‘#completion-signals’>completion signals</a> from <code>_Sender_</code> it checks that for each <code>_Signature_</code> in <code><a href=‘#get_completion_signals’>std::execution::get_completion_signals</a>(_sender_, std::declval&lt;<a href='#env_of_t'>std::execution::env_of_t</a>&lt;_Receiver_&gt;&gt;())</code> the test <code><a href=‘#receiver_of’>std::execution::receiver_of</a>&lt;_Receiver_, _Signature_&gt;</code> yields true. To determine if <code>_Sender_</code> can be <code><a href=‘#connect’>connect</a></code>ed to <code>_Receiver_</code> the concept checks if <code><a href=‘#connect’>connect</a>(std::declval&lt;_Sender_&gt;(), std::declval&lt;_Receiver_&gt;)</code> is a valid expression.
237237
</details>
238238
<details>
239-
<summary><code>sends_stopped&lt;<i>Sender, Env</i> = std::execution::empty_env&gt;</code></summary>
239+
<summary><code>sends_stopped&lt;<i>Sender, Env</i> = std::execution::env&lt;&gt;&gt;</code></summary>
240240

241241
The concept <code>sends_stopped&lt;<i>Sender, Env</i>&gt;</code> determines if <code>_Sender_</code> may send a <code><a href=‘#set_stopped’>stopped</a></code> <a href=‘#completion-signals’>completion signal</a>. To do so, the concepts determines if <code><a href=‘#get_completion_signals’>std::execution::get_completion_signals</a>(_sender_, _env_)</code> contains the signatures <code><a href=‘#set_stopped’>std::execution::set_stopped_t</a>()</code>.
242242
</details>
@@ -407,12 +407,12 @@ struct custom_t: forwarding_query_t {
407407
</details>
408408
<details>
409409
<summary><code>get_env(<i>queryable</i>) -> <i>env</i></code></summary>
410-
**Default**: <a href='#empty_env'>`empty_env`</a>
410+
**Default**: <a href='#env'>`env&lt;&gt;`</a>
411411
<br/>
412-
The expression <code>get_env(<i>queryable</i>)</code> is used to get the environment <code><i>env</i></code> associated with <code><i>queryable</i></code>. To provide a non-default environment for a <code><i>queryable</i></code> a `get_env` member needs to be defined. If <code><i>queryable</i></code> doesn’t provide the <code>get_env</code> query an object of type <code><a href=‘#empty_env’>empty_env</a></code> is returned.
412+
The expression <code>get_env(<i>queryable</i>)</code> is used to get the environment <code><i>env</i></code> associated with <code><i>queryable</i></code>. To provide a non-default environment for a <code><i>queryable</i></code> a `get_env` member needs to be defined. If <code><i>queryable</i></code> doesn’t provide the <code>get_env</code> query an object of type <code><a href=‘#env’>env&lt;&gt;</a></code> is returned.
413413
The value of the expression is <ol>
414414
<li>the result of <code>as_const(<i>queryable</i>).get_env()</code> if this expression is valid and <code>noexcept</code>.</li>
415-
<li><code>empty_env</code> otherwise.
415+
<li><code>env&lt;&gt;</code> otherwise.
416416
</ol>
417417
<div>
418418
<details>
@@ -712,7 +712,7 @@ The expression <code>into_variant(<i>sender</i>)</code> creates a sender which t
712712
- `completion_signatures_t`
713713
- `connect_result_t`
714714
- `default_domain`
715-
- `empty_env`
715+
- `env&lt;T...&gt;`
716716
- `env_of_t`
717717
- `error_types_of_t`
718718
- `fwd_env`

examples/just_stopped.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ struct receiver {
1111
int main() {
1212
// ex::sync_wait(ex::just_stopped() | ex::then([]{}));
1313
auto then = ex::just_stopped() | ex::then([] {});
14-
static_assert(std::same_as<void, decltype(ex::get_completion_signatures(then, ex::empty_env()))>);
14+
static_assert(std::same_as<void, decltype(ex::get_completion_signatures(then, ex::env<>()))>);
1515

1616
ex::connect(ex::just_stopped() | ex::then([] {}), receiver{});
1717
}

include/beman/execution/detail/completion_signatures_of_t.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#define INCLUDED_BEMAN_EXECUTION_DETAIL_COMPLETION_SIGNATURES_OF
66

77
#include <beman/execution/detail/call_result_t.hpp>
8-
#include <beman/execution/detail/empty_env.hpp>
8+
#include <beman/execution/detail/env.hpp>
99
#include <beman/execution/detail/get_completion_signatures.hpp>
1010
#include <beman/execution/detail/sender_in.hpp>
1111

@@ -16,10 +16,10 @@ namespace beman::execution {
1616
* \brief Alias to access the completion signatures of a sender
1717
* \headerfile beman/execution/execution.hpp <beman/execution/execution.hpp>
1818
*/
19-
template <typename Sender, typename Env = ::beman::execution::empty_env>
19+
template <typename Sender, typename Env = ::beman::execution::env<>>
2020
requires ::beman::execution::sender_in<Sender, Env>
2121
using completion_signatures_of_t =
22-
::beman::execution::detail::call_result_t< ::beman::execution::get_completion_signatures_t, Sender, Env>;
22+
::beman::execution::detail::call_result_t<::beman::execution::get_completion_signatures_t, Sender, Env>;
2323
} // namespace beman::execution
2424

2525
// ----------------------------------------------------------------------------

include/beman/execution/detail/default_impls.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
#include <beman/execution/detail/allocator_aware_move.hpp>
88
#include <beman/execution/detail/callable.hpp>
9-
#include <beman/execution/detail/empty_env.hpp>
9+
#include <beman/execution/detail/env.hpp>
1010
#include <beman/execution/detail/forward_like.hpp>
1111
#include <beman/execution/detail/fwd_env.hpp>
1212
#include <beman/execution/detail/get_allocator.hpp>
@@ -30,7 +30,7 @@ struct default_impls {
3030
if constexpr (1 == sizeof...(child))
3131
return (::beman::execution::detail::fwd_env(::beman::execution::get_env(child)), ...);
3232
else
33-
return ::beman::execution::empty_env{};
33+
return ::beman::execution::env<>{};
3434
};
3535
static constexpr auto get_env = [](auto, auto&, const auto& receiver) noexcept -> decltype(auto) {
3636
return ::beman::execution::detail::fwd_env(::beman::execution::get_env(receiver));

include/beman/execution/detail/empty_env.hpp

Lines changed: 0 additions & 21 deletions
This file was deleted.
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// include/beman/execution/detail/env.hpp -*-C++-*-
2+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3+
4+
#ifndef INCLUDED_INCLUDE_BEMAN_EXECUTION_DETAIL_ENV
5+
#define INCLUDED_INCLUDE_BEMAN_EXECUTION_DETAIL_ENV
6+
7+
#include <beman/execution/detail/non_assignable.hpp>
8+
#include <beman/execution/detail/queryable.hpp>
9+
#include <type_traits>
10+
11+
// ----------------------------------------------------------------------------
12+
13+
namespace beman::execution::detail {
14+
template <::beman::execution::detail::queryable>
15+
struct env_base;
16+
17+
template <typename E, typename Q>
18+
concept has_query = requires(const E& e) { e.query(::std::declval<Q>()); };
19+
20+
template <typename Q, typename... E>
21+
struct find_env;
22+
template <typename Q, typename E0, typename... E>
23+
requires has_query<E0, Q>
24+
struct find_env<Q, E0, E...> {
25+
using type = E0;
26+
};
27+
template <typename Q, typename E0, typename... E>
28+
requires(not has_query<E0, Q>)
29+
struct find_env<Q, E0, E...> {
30+
using type = typename find_env<Q, E...>::type;
31+
};
32+
} // namespace beman::execution::detail
33+
34+
namespace beman::execution {
35+
template <::beman::execution::detail::queryable... Envs>
36+
struct env;
37+
38+
template <::beman::execution::detail::queryable... Envs>
39+
env(Envs...) -> env<::std::unwrap_reference_t<Envs>...>;
40+
} // namespace beman::execution
41+
42+
// ----------------------------------------------------------------------------
43+
44+
template <::beman::execution::detail::queryable Env>
45+
struct beman::execution::detail::env_base {
46+
Env env_;
47+
};
48+
49+
template <::beman::execution::detail::queryable... Envs>
50+
struct beman::execution::env : ::beman::execution::detail::env_base<Envs>... {
51+
[[no_unique_address]] ::beman::execution::detail::non_assignable na_{};
52+
53+
template <typename Q>
54+
requires(::beman::execution::detail::has_query<Envs, Q> || ...)
55+
constexpr auto query(Q q) const noexcept -> decltype(auto) {
56+
using E = typename ::beman::execution::detail::find_env<Q, Envs...>::type;
57+
return q(static_cast<const ::beman::execution::detail::env_base<E>&>(*this).env_);
58+
}
59+
};
60+
61+
// ----------------------------------------------------------------------------
62+
63+
#endif

0 commit comments

Comments
 (0)