Skip to content

Commit 69b0e50

Browse files
authored
Merge pull request #37 from avdgrinten/get-env
execution: Add get_env() CPO
2 parents c614396 + f310d93 commit 69b0e50

5 files changed

Lines changed: 53 additions & 0 deletions

File tree

include/async/algorithm.hpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ struct value_transform_receiver {
9494
}
9595
}
9696

97+
auto get_env() {
98+
return execution::get_env(dr_);
99+
}
100+
97101
private:
98102
Receiver dr_; // Downstream receiver.
99103
[[no_unique_address]] F f_;
@@ -113,6 +117,10 @@ struct void_transform_receiver {
113117
}
114118
}
115119

120+
auto get_env() {
121+
return execution::get_env(dr_);
122+
}
123+
116124
private:
117125
Receiver dr_; // Downstream receiver.
118126
[[no_unique_address]] F f_;
@@ -281,6 +289,10 @@ struct [[nodiscard]] repeat_while_operation {
281289
execution::set_value(s->dr_);
282290
}
283291

292+
auto get_env() {
293+
return execution::get_env(self_->dr_);
294+
}
295+
284296
private:
285297
repeat_while_operation *self_;
286298
};
@@ -359,6 +371,10 @@ struct race_and_cancel_operation<Receiver, frg::tuple<Functors...>, std::index_s
359371
execution::set_value(self_->r_);
360372
}
361373

374+
auto get_env() {
375+
return execution::get_env(self_->r_);
376+
}
377+
362378
private:
363379
race_and_cancel_operation *self_;
364380
};
@@ -595,6 +611,10 @@ struct [[nodiscard]] sequence_operation {
595611
execution::set_value(s->dr_, std::move(value));
596612
}
597613

614+
auto get_env() {
615+
return execution::get_env(self_->dr_);
616+
}
617+
598618
private:
599619
sequence_operation *self_;
600620
};
@@ -657,6 +677,10 @@ struct when_all_operation {
657677
execution::set_value(self_->dr_);
658678
}
659679

680+
auto get_env() {
681+
return execution::get_env(self_->dr_);
682+
}
683+
660684
private:
661685
when_all_operation *self_;
662686
};

include/async/cancellation.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,10 @@ struct with_cancel_cb_operation {
387387
self->complete_();
388388
}
389389

390+
auto get_env() {
391+
return execution::get_env(self->dr_);
392+
}
393+
390394
with_cancel_cb_operation *self;
391395
};
392396
static_assert(Receives<intermediate_receiver, value_type>);

include/async/execution.hpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,24 @@ struct set_value_cpo {
111111
}
112112
};
113113

114+
template<typename T>
115+
concept get_env_member = requires(T &&obj) {
116+
obj.get_env();
117+
};
118+
119+
struct empty_env { };
120+
121+
struct get_env_cpo {
122+
template<typename T>
123+
auto operator() (T &&obj) {
124+
if constexpr (get_env_member<T>) {
125+
return obj.get_env();
126+
} else {
127+
return empty_env{};
128+
}
129+
}
130+
};
131+
114132
} // namespace cpo_types
115133

116134
namespace execution {
@@ -121,6 +139,7 @@ namespace execution {
121139
inline cpo_types::start_cpo start;
122140
inline cpo_types::start_inline_cpo start_inline;
123141
inline cpo_types::set_value_cpo set_value;
142+
inline cpo_types::get_env_cpo get_env;
124143
}
125144

126145
} // namespace async

include/async/post-ack.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ struct post_ack_mechanism {
115115
};
116116

117117
struct [[nodiscard]] post_sender {
118+
using value_type = void;
119+
118120
friend sender_awaiter<post_sender> operator co_await (post_sender sender) {
119121
return {std::move(sender)};
120122
}

include/async/wait-group.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,10 @@ struct [[nodiscard]] sender_ {
197197
std::forward<Ts>(ts)...
198198
);
199199
}
200+
201+
auto get_env() {
202+
return execution::get_env(op_.originalr_);
203+
}
200204
};
201205

202206
execution::operation_t<OriginalS, receiver_> originalop_;

0 commit comments

Comments
 (0)