Skip to content

Commit 278a69b

Browse files
corrected RVO behaviour & removed move-ctors.
Fixes 7a8f383.
1 parent 8cea71f commit 278a69b

File tree

4 files changed

+41
-36
lines changed

4 files changed

+41
-36
lines changed

include/boost/cobalt/detail/gather.hpp

+1-9
Original file line numberDiff line numberDiff line change
@@ -256,15 +256,7 @@ struct gather_ranged_impl
256256
std::vector<result_storage_type> result{cancel.size(), alloc};
257257
#endif
258258

259-
#if !defined(BOOST_COBALT_NO_PMR)
260-
awaitable(awaitable && rhs)
261-
: fork::shared_state((512 + sizeof(co_awaitable_type<type>)) * std::size(rhs.aws))
262-
, aws{std::move(rhs.aws), alloc}
263-
, ready{rhs.ready.size(), alloc}
264-
, cancel{rhs.cancel.size(), alloc}
265-
{
266-
}
267-
#endif
259+
268260

269261
awaitable(Range & aws_, std::false_type /* needs operator co_await */)
270262
: fork::shared_state((512 + sizeof(co_awaitable_type<type>)) * std::size(aws_))

include/boost/cobalt/detail/join.hpp

-12
Original file line numberDiff line numberDiff line change
@@ -336,18 +336,6 @@ struct join_ranged_impl
336336
#endif
337337
std::exception_ptr error;
338338

339-
#if !defined(BOOST_COBALT_NO_PMR)
340-
awaitable(awaitable && rhs)
341-
: fork::shared_state((512 + sizeof(co_awaitable_type<type>) + result_size) * std::size(rhs.aws))
342-
, aws{std::move(rhs.aws), alloc}
343-
, ready{rhs.ready.size(), alloc}
344-
, cancel_{rhs.cancel_.size(), alloc}
345-
, cancel{rhs.cancel.size(), alloc}
346-
{
347-
}
348-
#endif
349-
350-
351339
awaitable(Range & aws_, std::false_type /* needs operator co_await */)
352340
: fork::shared_state((512 + sizeof(co_awaitable_type<type>) + result_size) * std::size(aws_))
353341
, aws{alloc}

include/boost/cobalt/detail/race.hpp

-8
Original file line numberDiff line numberDiff line change
@@ -458,14 +458,6 @@ struct race_ranged_impl
458458

459459
bool has_result() const {return index != std::numeric_limits<std::size_t>::max(); }
460460

461-
#if !defined(BOOST_COBALT_NO_PMR)
462-
awaitable(awaitable && rhs) : fork::shared_state((256 + sizeof(co_awaitable_type<type>) + sizeof(std::size_t)) * std::size(rhs.aws)), aws(rhs.aws)
463-
{
464-
reorder.assign(rhs.reorder.begin(), rhs.reorder.end());
465-
if constexpr (traits::interruptible)
466-
std::fill(working.begin(), working.end(), nullptr);
467-
}
468-
#endif
469461

470462
awaitable(Range & aws, URBG & g)
471463
: fork::shared_state((256 + sizeof(co_awaitable_type<type>) + sizeof(std::size_t)) * std::size(aws))

include/boost/cobalt/result.hpp

+40-7
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,19 @@ auto interpret_as_result(std::tuple<Error, Arg> && args) -> system::result<Arg,
8383
struct as_result_tag {};
8484
struct as_tuple_tag {};
8585

86-
template<awaitable Aw>
86+
template<awaitable_type Aw>
8787
struct as_result_t
8888
{
8989
as_result_t(Aw && aw) : aw_(std::forward<Aw>(aw)) {}
9090

91+
template<typename Aw_>
92+
requires requires (Aw_ && aw) {{std::forward<Aw_>(aw).operator co_await()} -> awaitable_type;}
93+
as_result_t(Aw_ && aw) : aw_(std::forward<Aw_>(aw).operator co_await()) {}
94+
95+
template<typename Aw_>
96+
requires requires (Aw_ && aw) {{operator co_await(std::forward<Aw_>(aw))} -> awaitable_type;}
97+
as_result_t(Aw_ && aw) : aw_(operator co_await(std::forward<Aw_>(aw))) {}
98+
9199
bool await_ready() { return aw_.await_ready();}
92100
template<typename T>
93101
auto await_suspend(std::coroutine_handle<T> h) { return aw_.await_suspend(h);}
@@ -133,9 +141,17 @@ struct as_result_t
133141
};
134142

135143

136-
template<awaitable Aw>
144+
template<awaitable_type Aw>
137145
as_result_t(Aw &&) -> as_result_t<Aw>;
138146

147+
template<typename Aw_>
148+
requires requires (Aw_ && aw) {{std::forward<Aw_>(aw).operator co_await()} -> awaitable_type;}
149+
as_result_t(Aw_ && aw) -> as_result_t<decltype(std::forward<Aw_>(aw).operator co_await())>;
150+
151+
template<typename Aw_>
152+
requires requires (Aw_ && aw) {{operator co_await(std::forward<Aw_>(aw))} -> awaitable_type;}
153+
as_result_t(Aw_ && aw) -> as_result_t<decltype(operator co_await(std::forward<Aw_>(aw)))>;
154+
139155
template<awaitable_type Aw>
140156
auto as_result(Aw && aw) -> as_result_t<Aw>
141157
{
@@ -154,7 +170,7 @@ auto as_result(Aw && aw)
154170
Aw aw;
155171
auto operator co_await ()
156172
{
157-
return as_result(std::forward<Aw>(aw).operator co_await());
173+
return as_result_t(std::forward<Aw>(aw));
158174
}
159175
};
160176
return lazy_tuple{std::forward<Aw>(aw)};
@@ -172,7 +188,7 @@ auto as_result(Aw && aw)
172188
Aw aw;
173189
auto operator co_await ()
174190
{
175-
return as_result(operator co_await(std::forward<Aw>(aw)));
191+
return as_result_t(std::forward<Aw>(aw));
176192
}
177193
};
178194
return lazy_tuple{std::forward<Aw>(aw)};
@@ -185,6 +201,15 @@ struct as_tuple_t
185201
{
186202
as_tuple_t(Aw && aw) : aw_(std::forward<Aw>(aw)) {}
187203

204+
template<typename Aw_>
205+
requires requires (Aw_ && aw) {{std::forward<Aw_>(aw).operator co_await()} -> awaitable_type;}
206+
as_tuple_t(Aw_ && aw) : aw_(std::forward<Aw_>(aw).operator co_await()) {}
207+
208+
template<typename Aw_>
209+
requires requires (Aw_ && aw) {{operator co_await(std::forward<Aw_>(aw))} -> awaitable_type;}
210+
as_tuple_t(Aw_ && aw) : aw_(operator co_await(std::forward<Aw_>(aw))) {}
211+
212+
188213
bool await_ready() { return aw_.await_ready();}
189214
template<typename T>
190215
auto await_suspend(std::coroutine_handle<T> h) { return aw_.await_suspend(h);}
@@ -257,9 +282,17 @@ struct as_tuple_t
257282
};
258283

259284

260-
template<awaitable Aw>
285+
template<awaitable_type Aw>
261286
as_tuple_t(Aw &&) -> as_tuple_t<Aw>;
262287

288+
template<typename Aw_>
289+
requires requires (Aw_ && aw) {{std::forward<Aw_>(aw).operator co_await()} -> awaitable_type;}
290+
as_tuple_t(Aw_ && aw) -> as_tuple_t<decltype(std::forward<Aw_>(aw).operator co_await())>;
291+
292+
template<typename Aw_>
293+
requires requires (Aw_ && aw) {{operator co_await(std::forward<Aw_>(aw))} -> awaitable_type;}
294+
as_tuple_t(Aw_ && aw) -> as_tuple_t<decltype(operator co_await(std::forward<Aw_>(aw)))>;
295+
263296

264297
template<awaitable_type Aw>
265298
auto as_tuple(Aw && aw) -> as_tuple_t<Aw>
@@ -279,7 +312,7 @@ auto as_tuple(Aw && aw)
279312
Aw aw;
280313
auto operator co_await ()
281314
{
282-
return as_tuple(std::forward<Aw>(aw).operator co_await());
315+
return as_tuple_t(std::forward<Aw>(aw));
283316
}
284317
};
285318
return lazy_tuple{std::forward<Aw>(aw)};
@@ -297,7 +330,7 @@ auto as_tuple(Aw && aw)
297330
Aw aw;
298331
auto operator co_await ()
299332
{
300-
return as_tuple(operator co_await(std::forward<Aw>(aw)));
333+
return as_tuple_t(std::forward<Aw>(aw));
301334
}
302335
};
303336
return lazy_tuple{std::forward<Aw>(aw)};

0 commit comments

Comments
 (0)