19#include "pw_async2/context.h"
20#include "pw_async2/poll.h"
27template <
typename T,
typename... Args>
28using PendableFunction = Poll<T>(Context&, Args...);
30template <
typename Func>
32 using Function = Func;
33 static constexpr bool kIsPendable =
false;
36template <
typename T,
typename... Args>
39 using Arguments = std::tuple<Args...>;
40 static constexpr bool kIsPendable =
true;
43template <
typename T,
typename C,
typename... Args>
47 using Arguments = std::tuple<Args...>;
48 static constexpr bool kIsPendable =
true;
52inline constexpr bool IsPendable =
PendableTraits<
decltype(Func)>::kIsPendable;
61 using FuncType =
decltype(Func);
63 using Class =
typename Traits::Class;
64 using Output =
typename Traits::Output;
65 using Arguments =
typename Traits::Arguments;
71 : object_(other.object_), args_(std::move(other.args_)) {
72 other.object_ =
nullptr;
76 object_ = other.object_;
77 args_ = std::move(other.args_);
78 other.object_ =
nullptr;
85 PW_ASSERT(object_ !=
nullptr);
88 Func, object_, cx, std::forward<
decltype(args)>(args)...);
97 constexpr bool completed()
const {
return object_ ==
nullptr; }
100 template <
auto MemberFuncParam,
101 typename TraitsParam,
102 typename EnableIfParam,
103 typename... ArgsParam>
105 typename TraitsParam::Class& obj, ArgsParam&&... args);
109 typename = std::enable_if_t<std::is_member_function_pointer_v<FuncType> &&
110 std::is_constructible_v<Arguments, Args...>>>
112 : object_(&obj), args_(std::forward<Args>(args)...) {
113 static_assert(std::conjunction_v<std::is_copy_constructible<Args>...>,
114 "Arguments stored in a PendableWrapper must be copyable");
125 using FuncType =
decltype(Func);
127 using Output =
typename Traits::Output;
128 using Arguments =
typename Traits::Arguments;
140 return std::invoke(Func, cx, std::forward<
decltype(args)>(args)...);
147 constexpr bool completed()
const {
return completed_; }
150 template <
auto FreeFuncParam,
151 typename TraitsParam,
152 typename EnableIfParam,
153 typename... ArgsParam>
155 ArgsParam&&... args);
157 template <
typename... Args,
159 std::enable_if_t<!std::is_member_function_pointer_v<FuncType> &&
160 std::is_constructible_v<Arguments, Args...>>>
162 : args_(std::forward<Args>(args)...), completed_(
false) {
163 static_assert(std::conjunction_v<std::is_copy_constructible<Args>...>,
164 "Arguments stored in a PendableWrapper must be copyable");
182template <
auto MemberFunc,
184 typename = std::enable_if_t<
185 Traits::kIsPendable &&
186 std::is_member_function_pointer_v<
decltype(MemberFunc)>>,
189 typename Traits::Class& obj, Args&&... args) {
201template <
auto FreeFunc,
202 typename Traits = internal::PendableTraits<
decltype(FreeFunc)>,
203 typename = std::enable_if_t<
204 Traits::kIsPendable &&
205 !std::is_member_function_pointer_v<
decltype(FreeFunc)>>,
Definition: pendable.h:123
Definition: pendable.h:59
constexpr bool IsReady() const noexcept
Returns whether or not this value is Ready.
Definition: poll.h:125
constexpr MemberPendableWrapper< MemberFunc > PendableFor(typename Traits::Class &obj, Args &&... args)
Definition: pendable.h:188
Definition: pendable.h:31