YACLib
C++ library for concurrent tasks execution
Loading...
Searching...
No Matches
await_on.hpp
Go to the documentation of this file.
1#pragma once
2
7
8namespace yaclib {
9
10template <typename Waited, typename = std::enable_if_t<is_waitable_v<Waited>>>
12 YACLIB_ASSERT(waited.Valid());
13 return detail::AwaitOnAwaiter{e, waited.GetHandle()};
14}
15
16template <typename... Waited, typename = std::enable_if_t<(... && is_waitable_v<Waited>)>>
18 using namespace detail;
19 static constexpr auto kSharedCount = kCount<SharedHandle, typename Waited::Handle...>;
20 using CoreEvent = AwaitOnEvent<false>;
21 using Event = std::conditional_t<kSharedCount == 0, CoreEvent, StaticSharedEvent<CoreEvent, kSharedCount>>;
22 YACLIB_ASSERT(... && waited.Valid());
23 return MultiAwaitOnAwaiter<Event>{e, waited.GetHandle()...};
24}
25
26template <typename It, typename = std::enable_if_t<is_input_iterator_v<It> &&
27 is_waitable_v<typename std::iterator_traits<It>::value_type>>>
28YACLIB_INLINE auto AwaitOn(IExecutor& e, It begin, std::size_t count) noexcept {
29 using namespace detail;
30 using Value = typename std::iterator_traits<It>::value_type;
31 static constexpr auto kShared = std::is_same_v<typename Value::Handle, SharedHandle>;
32 using CoreEvent = AwaitOnEvent<false>;
33 using Event = std::conditional_t<kShared, DynamicSharedEvent<CoreEvent>, CoreEvent>;
34 return MultiAwaitOnAwaiter<Event>{e, begin, count};
35}
36
37template <typename It, typename Sentinel,
38 typename = std::enable_if_t<is_input_range_pair_v<It, Sentinel> &&
41 static_assert(
43 "Use AwaitOn(begin, std::distance(begin, end)) instead"); // We don't use std::distance because we want to alert
44 // the user to the fact that it can be expensive.
45
46 return AwaitOn(e, begin, static_cast<std::size_t>(end - begin));
47}
48
49template <typename Range, typename = std::enable_if_t<
53 return AwaitOn(e, std::begin(range), std::end(range));
54}
55
56} // namespace yaclib
#define YACLIB_ASSERT(cond)
Definition log.hpp:85
Contract< V, T > MakeContract()
Creates related future and promise.
Definition contract.hpp:25
constexpr auto kCount
YACLIB_INLINE auto AwaitOn(IExecutor &e, Waited &waited) noexcept
Definition await_on.hpp:11