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;
63 using FuncType =
decltype(Func);
65 using Class =
typename Traits::Class;
66 using Output =
typename Traits::Output;
67 using Arguments =
typename Traits::Arguments;
73 : object_(other.object_), args_(std::move(other.args_)) {
74 other.object_ =
nullptr;
78 object_ = other.object_;
79 args_ = std::move(other.args_);
80 other.object_ =
nullptr;
87 PW_ASSERT(object_ !=
nullptr);
90 Func, object_, cx, std::forward<
decltype(args)>(args)...);
99 constexpr bool completed()
const {
return object_ ==
nullptr; }
102 template <
auto MemberFuncParam,
103 typename TraitsParam,
104 typename EnableIfParam,
105 typename... ArgsParam>
107 typename TraitsParam::Class& obj, ArgsParam&&... args);
111 typename = std::enable_if_t<std::is_member_function_pointer_v<FuncType> &&
112 std::is_constructible_v<Arguments, Args...>>>
114 : object_(&obj), args_(std::forward<Args>(args)...) {
115 static_assert(std::conjunction_v<std::is_copy_constructible<Args>...>,
116 "Arguments stored in a PendableWrapper must be copyable");
127 using FuncType =
decltype(Func);
129 using Output =
typename Traits::Output;
130 using Arguments =
typename Traits::Arguments;
142 return std::invoke(Func, cx, std::forward<
decltype(args)>(args)...);
149 constexpr bool completed()
const {
return completed_; }
152 template <
auto FreeFuncParam,
153 typename TraitsParam,
154 typename EnableIfParam,
155 typename... ArgsParam>
157 ArgsParam&&... args);
159 template <
typename... Args,
161 std::enable_if_t<!std::is_member_function_pointer_v<FuncType> &&
162 std::is_constructible_v<Arguments, Args...>>>
164 : args_(std::forward<Args>(args)...), completed_(
false) {
165 static_assert(std::conjunction_v<std::is_copy_constructible<Args>...>,
166 "Arguments stored in a PendableWrapper must be copyable");
181template <
auto MemberFunc,
183 typename = std::enable_if_t<
184 Traits::kIsPendable &&
185 std::is_member_function_pointer_v<
decltype(MemberFunc)>>,
188 typename Traits::Class& obj, Args&&... args) {
200template <
auto FreeFunc,
201 typename Traits = internal::PendableTraits<
decltype(FreeFunc)>,
202 typename = std::enable_if_t<
203 Traits::kIsPendable &&
204 !std::is_member_function_pointer_v<
decltype(FreeFunc)>>,
Definition: pendable.h:125
Definition: pendable.h:61
constexpr MemberPendableWrapper< MemberFunc > PendableFor(typename Traits::Class &obj, Args &&... args)
Definition: pendable.h:187
constexpr bool IsReady() const noexcept
Returns whether or not this value is Ready.
Definition: poll.h:133
Definition: pendable.h:31