14 for (
auto &f: futures) {
15 trace::awaiting_ref(f, &futures);
38 template<
typename T, coro_allocator Alloc = std_allocator>
43 std::vector<deferred_future<T> > futures;
46 std::size_t cnt = gens.
size();
49 auto activate = [&](std::size_t idx) {
50 futures[idx] = gens[idx]();
51 futures[idx] >> [&q, idx]{
52 return q.push(idx).symmetric_transfer();
55 trace::awaiting_ref(gens[idx],&q);
62 for (std::size_t i = 0; i < cnt; ++i) activate(i);
69 for (
auto &f: futures) {
73 auto r = f.set_callback([]{});
74 pending = pending || r;
79 _details::aggregator_cleanup(std::move(gens), std::move(futures));
83 std::exception_ptr e = {};
88 std::size_t idx = co_await q.
pop();
92 if (futures[idx].has_value()) {
94 co_yield std::move(futures[idx]).get();
103 e = std::current_exception();
105 co_yield std::move(e);
118 template<
typename T,
typename Alloc, std::convertible_to<generator<T> > ... Args>
119 void aggregator_create_list(std::vector<generator<T> > &out, generator<T, Alloc> &&gen1, Args &&... gens) {
120 out.push_back(generator<T>(std::move(gen1)));
121 aggregator_create_list(out, std::forward<Args>(gens)...);
125 void aggregator_create_list(std::vector<generator<T> > &) {}
130 template<
typename T,
typename Alloc, std::convertible_to<generator<T> > ... Args>
132 std::vector<generator<T> > out;
133 out.reserve(1+
sizeof...(gens));
134 aggregator_create_list(out, std::move(gen1), std::forward<Args>(gens)...);
140 template<
typename T,
typename Alloc, coro_allocator GenAlloc, std::convertible_to<generator<T> > ... Args>
142 std::vector<generator<T> > out;
143 out.reserve(1+
sizeof...(gens));
144 aggregator_create_list(out, std::move(gen1), std::forward<Args>(gens)...);
COROUTINE: Basic coroutine.
Contains future value of T, where evaluation is deferred until the value is needed.
Defines function, which is called when function is exited.
std::size_t size() const
retrieve current size of the queue
future< T > pop()
Pop the items.
Implements asychronous queue with support for coroutines.
constexpr std_allocator standard_allocator
Global instance for std_allocator which can be used anywhere the allocator is requested.