Iros
 
Loading...
Searching...
No Matches
is_awaitable.h
Go to the documentation of this file.
1#pragma once
2
4#include "di/util/forward.h"
5#include "di/util/voidify.h"
6
7namespace di::concepts {
8namespace detail {
9 // This functions returns the value of applying co_await (awaitable), when called in a
10 // coroutine a specified promise type. C++ first tries to call a member operator co_await,
11 // then a global operator co_await, and finally returns the awaitable unmodified.
12 template<typename Awaitable>
13 auto get_awaiter(Awaitable&& awaitable, void*) -> decltype(auto) {
14 if constexpr (requires { util::forward<Awaitable>(awaitable).operator co_await(); }) {
15 return util::forward<Awaitable>(awaitable).operator co_await();
16 } else if constexpr (requires { operator co_await(util::forward<Awaitable>(awaitable)); }) {
17 return operator co_await(util::forward<Awaitable>(awaitable));
18 } else {
19 return util::forward<Awaitable>(awaitable);
20 }
21 }
22
23 // When a concrete promise type is known, and it has a member await_transform(), C++
24 // calls that function before applying the above rules.
25 template<typename Awaitable, typename Promise>
26 auto get_awaiter(Awaitable&& awaitable, Promise* promise) -> decltype(auto)
27 requires(requires { promise->await_transform(util::forward<Awaitable>(awaitable)); })
28 {
29 return get_awaiter(promise->await_transform(util::forward<Awaitable>(awaitable)), util::voidify(promise));
30 }
31}
32
33// An expression is awaitable given a promise type if it can be co_await'ed. This requires that the
34// above detail::get_awaiter() function returns a valid Awaiter object.
35template<typename T, typename Promise = void>
36concept IsAwaitable = requires(T (&f)() noexcept, Promise* promise) {
37 { detail::get_awaiter(f(), promise) } -> IsAwaiter<Promise>;
38};
39}
Definition is_awaitable.h:36
Definition is_awaiter.h:22
Definition impl.h:7
auto get_awaiter(Awaitable &&awaitable, void *) -> decltype(auto)
Definition is_awaitable.h:13
Definition any_storable.h:9
constexpr auto voidify
Definition voidify.h:13