uvco 0.1
Loading...
Searching...
No Matches
combinators.h
Go to the documentation of this file.
1// uvco (c) 2025 Lewin Bormann. See LICENSE for specific terms.
2
3#pragma once
4
8#include <coroutine>
9#include <cstddef>
10#include <deque>
11#include <exception>
12#include <functional>
13#include <memory>
14#include <tuple>
15#include <variant>
16#include <vector>
17
18namespace uvco {
19
24
30
32MultiPromise<unsigned> yield(unsigned count);
33
41template <typename... PromiseTypes>
42Promise<std::vector<std::variant<PromiseTypes...>>>
44 using S = SelectSet<PromiseTypes...>;
45 using V = std::variant<PromiseTypes...>;
46 S selectSet{promises...};
47 auto readyPromises = co_await selectSet;
48 std::vector<V> results;
49 for (auto &promise : readyPromises) {
50 results.emplace_back(std::visit([](auto *p) -> V { return p->unwrap(); },
51 std::move(promise)));
52 }
53 co_return results;
54}
55
59template <typename... PromiseTypes>
60Promise<std::vector<std::variant<PromiseTypes...>>>
62 co_return (co_await waitAny(promises...));
63}
64
69template <typename... PromiseTypes>
71 using S = SelectSet<PromiseTypes...>;
72 S selectSet{promises...};
73 co_await selectSet;
74}
75
76namespace detail {
77
78template <typename T> struct ReplaceVoid {
79 using type = T;
80};
81
82struct Void {};
83
84template <> struct ReplaceVoid<void> {
85 using type = Void;
86};
87
88template <typename PromiseType>
91 co_return (co_await promise);
92}
93
94template <> inline Promise<Void> awaitAndReplaceVoid(Promise<void> &promise) {
95 co_await promise;
96 co_return {};
97}
98
99} // namespace detail
100
104template <typename... PromiseTypes>
105Promise<std::tuple<typename detail::ReplaceVoid<PromiseTypes>::type...>>
107 co_return std::make_tuple(co_await detail::awaitAndReplaceVoid(promises)...);
108}
109
113 struct WaitPointAwaiter_;
114
115public:
116 WaitPoint() = default;
117 WaitPoint(const WaitPoint &) = delete;
118 WaitPoint(WaitPoint &&) noexcept = default;
119 WaitPoint &operator=(const WaitPoint &) = delete;
120 WaitPoint &operator=(WaitPoint &&) noexcept = default;
121 ~WaitPoint() = default;
122
123 [[nodiscard]] size_t waiting() const { return waiters_.size(); }
125 void releaseOne();
126 void releaseAll();
127
128private:
129 void enqueue(std::coroutine_handle<> handle);
130 std::deque<std::coroutine_handle<>> waiters_;
131};
132
136class TaskSet {
137public:
138 TaskSet() = default;
139 TaskSet(const TaskSet &) = delete;
140 TaskSet(TaskSet &&) noexcept = default;
141 TaskSet &operator=(const TaskSet &) = delete;
142 TaskSet &operator=(TaskSet &&) noexcept = default;
143 virtual ~TaskSet() = default;
144
145 using Id = size_t;
146 using ErrorCallback = std::function<void(Id, std::exception_ptr)>;
147
153 static std::unique_ptr<TaskSet> create();
154
158 virtual Id add(Promise<void> task) = 0;
159
161 virtual bool empty() = 0;
162
168 virtual Promise<void> onEmpty() = 0;
169
173 virtual void setOnError(ErrorCallback callback) = 0;
174};
175
177
178} // namespace uvco
Definition multipromise.h:127
Definition promise.h:49
Definition select.h:56
virtual Promise< void > onEmpty()=0
TaskSet(const TaskSet &)=delete
std::function< void(Id, std::exception_ptr)> ErrorCallback
Definition combinators.h:146
TaskSet(TaskSet &&) noexcept=default
static std::unique_ptr< TaskSet > create()
Definition combinators.cc:163
size_t Id
Definition combinators.h:145
virtual void setOnError(ErrorCallback callback)=0
TaskSet()=default
virtual Id add(Promise< void > task)=0
virtual bool empty()=0
Check if there are any active tasks on the TaskSet.
std::deque< std::coroutine_handle<> > waiters_
Definition combinators.h:130
WaitPoint()=default
WaitPoint(WaitPoint &&) noexcept=default
void releaseAll()
Definition combinators.cc:68
void enqueue(std::coroutine_handle<> handle)
Definition combinators.cc:74
Promise< void > wait()
Definition combinators.cc:58
size_t waiting() const
Definition combinators.h:123
WaitPoint(const WaitPoint &)=delete
void releaseOne()
Definition combinators.cc:60
Promise< std::tuple< typename detail::ReplaceVoid< PromiseTypes >::type... > > waitAll(Promise< PromiseTypes >... promises)
Definition combinators.h:106
Promise< void > raceIgnore(Promise< PromiseTypes >... promises)
Definition combinators.h:70
Promise< void > yield()
Definition combinators.cc:34
Promise< std::vector< std::variant< PromiseTypes... > > > waitAny(Promise< PromiseTypes > &...promises)
Definition combinators.h:43
Promise< std::vector< std::variant< PromiseTypes... > > > race(Promise< PromiseTypes >... promises)
Definition combinators.h:61
Definition combinators.h:76
Promise< typename ReplaceVoid< PromiseType >::type > awaitAndReplaceVoid(Promise< PromiseType > &promise)
Definition combinators.h:90
Definition async_work.cc:18
Definition combinators.cc:42
Void type
Definition combinators.h:85
Definition combinators.h:78
T type
Definition combinators.h:79
Definition combinators.h:82