@@ -41,31 +41,11 @@ template <category Cat, bool StopToken, typename Context, typename R, typename F
4141struct [[nodiscard("You should immediately co_await this!")]] pkg {
4242 [[no_unique_address]] std::conditional_t <StopToken, stop_source::stop_token, no_stop_t > stop_token;
4343 [[no_unique_address]] std::conditional_t <std::is_void_v<R>, no_ret_t , R *> return_addr;
44- [[no_unique_address]] Fn fn;
45- [[no_unique_address]] tuple<Args...> args;
44+ [[no_unique_address]] tuple<Fn, Args...> args;
4645};
4746
4847// clang-format on
4948
50- /* *
51- * @brief Forward the function member of a pkg correctly.
52- *
53- * Handles three cases:
54- * - rvalue reference Fn: move it.
55- * - lvalue reference Fn: return by reference.
56- * - value type Fn (small trivially-copyable stored directly): return by value.
57- */
58- template <typename Fn>
59- constexpr auto fwd_fn (auto &&fn) noexcept -> Fn {
60- if constexpr (std::is_rvalue_reference_v<Fn>) {
61- return std::move (fn);
62- } else if constexpr (std::is_lvalue_reference_v<Fn> || small_trivially_copyable<Fn>) {
63- return fn;
64- } else {
65- static_assert (false , " Invalid Fn type in fwd_fn" );
66- }
67- }
68-
6949// =============== Join =============== //
7050
7151struct join_type {};
@@ -107,30 +87,30 @@ struct scope_ops : scope_base {
10787
10888 template <typename R, typename ... Args, async_invocable_to<R, Context, Args...> Fn>
10989 static constexpr auto fork (R *ret, Fn &&fn, Args &&...args) noexcept -> fork_pkg<R, Fn, Args...> {
110- return {.return_addr = ret, .fn = LF_FWD (fn), . args = { LF_FWD (args)...}};
90+ return {.return_addr = ret, .args = { LF_FWD (fn), LF_FWD (args)...}};
11191 }
11292 template <typename ... Args, async_invocable<Context, Args...> Fn>
11393 static constexpr auto fork_drop (Fn &&fn, Args &&...args) noexcept -> fork_pkg<void, Fn, Args...> {
114- return {.return_addr = {}, .fn = LF_FWD (fn), . args = { LF_FWD (args)...}};
94+ return {.return_addr = {}, .args = { LF_FWD (fn), LF_FWD (args)...}};
11595 }
11696 template <typename ... Args, async_invocable_to<void , Context, Args...> Fn>
11797 static constexpr auto fork (Fn &&fn, Args &&...args) noexcept -> fork_pkg<void, Fn, Args...> {
118- return {.return_addr = {}, .fn = LF_FWD (fn), . args = { LF_FWD (args)...}};
98+ return {.return_addr = {}, .args = { LF_FWD (fn), LF_FWD (args)...}};
11999 }
120100
121101 // === Call === //
122102
123103 template <typename R, typename ... Args, async_invocable_to<R, Context, Args...> Fn>
124104 static constexpr auto call (R *ret, Fn &&fn, Args &&...args) noexcept -> call_pkg<R, Fn, Args...> {
125- return {.return_addr = ret, .fn = LF_FWD (fn), . args = { LF_FWD (args)...}};
105+ return {.return_addr = ret, .args = { LF_FWD (fn), LF_FWD (args)...}};
126106 }
127107 template <typename ... Args, async_invocable<Context, Args...> Fn>
128108 static constexpr auto call_drop (Fn &&fn, Args &&...args) noexcept -> call_pkg<void, Fn, Args...> {
129- return {.return_addr = {}, .fn = LF_FWD (fn), . args = { LF_FWD (args)...}};
109+ return {.return_addr = {}, .args = { LF_FWD (fn), LF_FWD (args)...}};
130110 }
131111 template <typename ... Args, async_invocable_to<void , Context, Args...> Fn>
132112 static constexpr auto call (Fn &&fn, Args &&...args) noexcept -> call_pkg<void, Fn, Args...> {
133- return {.return_addr = {}, .fn = LF_FWD (fn), . args = { LF_FWD (args)...}};
113+ return {.return_addr = {}, .args = { LF_FWD (fn), LF_FWD (args)...}};
134114 }
135115};
136116
@@ -179,30 +159,30 @@ struct child_scope_ops : scope_base, stop_source {
179159
180160 template <typename R, typename ... Args, async_invocable_to<R, Context, Args...> Fn>
181161 constexpr auto fork (R *ret, Fn &&fn, Args &&...args) noexcept -> fork_pkg<R, Fn, Args...> {
182- return {.stop_token = token (), .return_addr = ret, .fn = LF_FWD (fn), . args = { LF_FWD (args)...}};
162+ return {.stop_token = token (), .return_addr = ret, .args = { LF_FWD (fn), LF_FWD (args)...}};
183163 }
184164 template <typename ... Args, async_invocable<Context, Args...> Fn>
185165 constexpr auto fork_drop (Fn &&fn, Args &&...args) noexcept -> fork_pkg<void, Fn, Args...> {
186- return {.stop_token = token (), .return_addr = {}, .fn = LF_FWD (fn), . args = { LF_FWD (args)...}};
166+ return {.stop_token = token (), .return_addr = {}, .args = { LF_FWD (fn), LF_FWD (args)...}};
187167 }
188168 template <typename ... Args, async_invocable_to<void , Context, Args...> Fn>
189169 constexpr auto fork (Fn &&fn, Args &&...args) noexcept -> fork_pkg<void, Fn, Args...> {
190- return {.stop_token = token (), .return_addr = {}, .fn = LF_FWD (fn), . args = { LF_FWD (args)...}};
170+ return {.stop_token = token (), .return_addr = {}, .args = { LF_FWD (fn), LF_FWD (args)...}};
191171 }
192172
193173 // === Call (binds this scope's stop source as child stop source) === //
194174
195175 template <typename R, typename ... Args, async_invocable_to<R, Context, Args...> Fn>
196176 constexpr auto call (R *ret, Fn &&fn, Args &&...args) noexcept -> call_pkg<R, Fn, Args...> {
197- return {.stop_token = token (), .return_addr = ret, .fn = LF_FWD (fn), . args = { LF_FWD (args)...}};
177+ return {.stop_token = token (), .return_addr = ret, .args = { LF_FWD (fn), LF_FWD (args)...}};
198178 }
199179 template <typename ... Args, async_invocable<Context, Args...> Fn>
200180 constexpr auto call_drop (Fn &&fn, Args &&...args) noexcept -> call_pkg<void, Fn, Args...> {
201- return {.stop_token = token (), .return_addr = {}, .fn = LF_FWD (fn), . args = { LF_FWD (args)...}};
181+ return {.stop_token = token (), .return_addr = {}, .args = { LF_FWD (fn), LF_FWD (args)...}};
202182 }
203183 template <typename ... Args, async_invocable_to<void , Context, Args...> Fn>
204184 constexpr auto call (Fn &&fn, Args &&...args) noexcept -> call_pkg<void, Fn, Args...> {
205- return {.stop_token = token (), .return_addr = {}, .fn = LF_FWD (fn), . args = { LF_FWD (args)...}};
185+ return {.stop_token = token (), .return_addr = {}, .args = { LF_FWD (fn), LF_FWD (args)...}};
206186 }
207187};
208188
0 commit comments