YACLib
C++ library for concurrent tasks execution
Loading...
Searching...
No Matches
await_sticky.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>>>
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 Awaiter = std::conditional_t<kSharedCount == 0, MultiAwaitAwaiter<AwaitEvent<true>>,
22 YACLIB_ASSERT(... && waited.Valid());
23 return Awaiter{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 AwaitSticky(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 Awaiter = std::conditional_t<kShared, MultiAwaitAwaiter<DynamicSharedEvent<AwaitEvent<true>>>,
34 return Awaiter{begin, count};
35}
36
37template <typename It, typename Sentinel,
38 typename = std::enable_if_t<is_input_range_pair_v<It, Sentinel> &&
42 "Use AwaitSticky(begin, std::distance(begin, end)) instead"); // We don't use std::distance because we
43 // want to alert the user to the fact
44 // that it can be expensive.
45
46 return AwaitSticky(begin, static_cast<std::size_t>(end - begin));
47}
48
49template <typename Range, typename = std::enable_if_t<
53 return AwaitSticky(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 AwaitSticky(Waited &waited) noexcept