9#include <userver/engine/awaitable.hpp>
10#include <userver/engine/deadline.hpp>
11#include <userver/engine/future_status.hpp>
12#include <userver/utils/meta.hpp>
14USERVER_NAMESPACE_BEGIN
43template <
typename... Tasks>
49template <
typename... Tasks,
typename Rep,
typename Period>
50[[nodiscard]]
FutureStatus WaitAllCheckedFor(
const std::chrono::duration<Rep, Period>& duration, Tasks&... tasks);
55template <
typename... Tasks,
typename Clock,
typename Duration>
56[[nodiscard]]
FutureStatus WaitAllCheckedUntil(
const std::chrono::time_point<Clock, Duration>& until, Tasks&... tasks);
61template <
typename... Tasks>
62[[nodiscard]]
FutureStatus WaitAllCheckedUntil(Deadline deadline, Tasks&... tasks);
66FutureStatus DoWaitAllChecked(std::vector<AwaitableToken>&& targets, Deadline deadline);
68template <
typename Container>
69FutureStatus WaitAllCheckedFromContainer(Deadline deadline, Container& tasks) {
70 std::vector<AwaitableToken> targets;
71 targets.reserve(std::size(tasks));
73 for (
auto& task : tasks) {
74 static_assert(engine::Awaitable<
decltype(task)>,
"Tasks must be awaitable");
75 targets.push_back(task.GetAwaitableToken());
78 return impl::DoWaitAllChecked(std::move(targets), deadline);
81template <
typename... Tasks>
82FutureStatus WaitAllCheckedFromTasks(Deadline deadline, Tasks&... tasks) {
83 static_assert((
true && ... && engine::Awaitable<Tasks>),
"Tasks must be awaitable");
84 return impl::DoWaitAllChecked({tasks.GetAwaitableToken()...}, deadline);
93template <
typename... Tasks>
95 impl::HandleWaitAllStatus(engine::WaitAllCheckedUntil(Deadline
{}, tasks...));
98template <
typename... Tasks,
typename Rep,
typename Period>
99[[nodiscard]]
FutureStatus WaitAllCheckedFor(
const std::chrono::duration<Rep, Period>& duration, Tasks&... tasks) {
100 return WaitAllCheckedUntil(Deadline::FromDuration(duration), tasks...);
103template <
typename... Tasks,
typename Clock,
typename Duration>
104[[nodiscard]]
FutureStatus WaitAllCheckedUntil(
const std::chrono::time_point<Clock, Duration>& until, Tasks&... tasks) {
105 return WaitAllCheckedUntil(Deadline::FromTimePoint(until), tasks...);
108template <
typename... Tasks>
109[[nodiscard]]
FutureStatus WaitAllCheckedUntil(Deadline deadline, Tasks&... tasks) {
110 if constexpr (meta::impl::IsSingleRange<Tasks...>) {
111 return impl::WaitAllCheckedFromContainer(deadline, tasks...);
113 return impl::WaitAllCheckedFromTasks(deadline, tasks...);