9#include <userver/engine/deadline.hpp>
10#include <userver/engine/future_status.hpp>
11#include <userver/utils/meta.hpp>
13USERVER_NAMESPACE_BEGIN
42template <
typename... Tasks>
48template <
typename... Tasks,
typename Rep,
typename Period>
49[[nodiscard]]
FutureStatus WaitAllCheckedFor(
const std::chrono::duration<Rep, Period>& duration, Tasks&... tasks);
54template <
typename... Tasks,
typename Clock,
typename Duration>
55[[nodiscard]]
FutureStatus WaitAllCheckedUntil(
const std::chrono::time_point<Clock, Duration>& until, Tasks&... tasks);
60template <
typename... Tasks>
61[[nodiscard]]
FutureStatus WaitAllCheckedUntil(Deadline deadline, Tasks&... tasks);
67FutureStatus DoWaitAllChecked(std::vector<ContextAccessor*>&& targets, Deadline deadline);
69template <
typename Container>
70FutureStatus WaitAllCheckedFromContainer(Deadline deadline, Container& tasks) {
71 std::vector<ContextAccessor*> targets;
72 targets.reserve(std::size(tasks));
74 for (
auto& task : tasks) {
75 targets.push_back(task.TryGetContextAccessor());
78 return impl::DoWaitAllChecked(std::move(targets), deadline);
81template <
typename... Tasks>
82FutureStatus WaitAllCheckedFromTasks(Deadline deadline, Tasks&... tasks) {
83 return impl::DoWaitAllChecked({tasks.TryGetContextAccessor()...}, deadline);
92template <
typename... Tasks>
94 impl::HandleWaitAllStatus(engine::WaitAllCheckedUntil(Deadline
{}, tasks...));
97template <
typename... Tasks,
typename Rep,
typename Period>
98[[nodiscard]]
FutureStatus WaitAllCheckedFor(
const std::chrono::duration<Rep, Period>& duration, Tasks&... tasks) {
99 return WaitAllCheckedUntil(Deadline::FromDuration(duration), tasks...);
102template <
typename... Tasks,
typename Clock,
typename Duration>
103[[nodiscard]]
FutureStatus WaitAllCheckedUntil(
const std::chrono::time_point<Clock, Duration>& until, Tasks&... tasks) {
104 return WaitAllCheckedUntil(Deadline::FromTimePoint(until), tasks...);
107template <
typename... Tasks>
108[[nodiscard]]
FutureStatus WaitAllCheckedUntil(Deadline deadline, Tasks&... tasks) {
109 if constexpr (meta::impl::IsSingleRange<Tasks...>()) {
110 return impl::WaitAllCheckedFromContainer(deadline, tasks...);
112 return impl::WaitAllCheckedFromTasks(deadline, tasks...);