1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker //
5*6777b538SAndroid Build Coastguard Worker // NOTE: Header files that do not require the full definition of
6*6777b538SAndroid Build Coastguard Worker // base::{Once,Repeating}Callback or base::{Once,Repeating}Closure should
7*6777b538SAndroid Build Coastguard Worker // #include "base/functional/callback_forward.h" instead of this file.
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #ifndef BASE_FUNCTIONAL_CALLBACK_H_
10*6777b538SAndroid Build Coastguard Worker #define BASE_FUNCTIONAL_CALLBACK_H_
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker #include <type_traits>
15*6777b538SAndroid Build Coastguard Worker #include <utility>
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_forward.h" // IWYU pragma: export
21*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_internal.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_tags.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/functional/function_ref.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h"
25*6777b538SAndroid Build Coastguard Worker #include "base/types/always_false.h"
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
28*6777b538SAndroid Build Coastguard Worker // Usage documentation
29*6777b538SAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
30*6777b538SAndroid Build Coastguard Worker //
31*6777b538SAndroid Build Coastguard Worker // Overview:
32*6777b538SAndroid Build Coastguard Worker // A callback is similar in concept to a function pointer: it wraps a runnable
33*6777b538SAndroid Build Coastguard Worker // object such as a function, method, lambda, or even another callback, allowing
34*6777b538SAndroid Build Coastguard Worker // the runnable object to be invoked later via the callback object.
35*6777b538SAndroid Build Coastguard Worker //
36*6777b538SAndroid Build Coastguard Worker // Unlike function pointers, callbacks are created with base::BindOnce() or
37*6777b538SAndroid Build Coastguard Worker // base::BindRepeating() and support partial function application.
38*6777b538SAndroid Build Coastguard Worker //
39*6777b538SAndroid Build Coastguard Worker // A base::OnceCallback may be Run() at most once; a base::RepeatingCallback may
40*6777b538SAndroid Build Coastguard Worker // be Run() any number of times. |is_null()| is guaranteed to return true for a
41*6777b538SAndroid Build Coastguard Worker // moved-from callback.
42*6777b538SAndroid Build Coastguard Worker //
43*6777b538SAndroid Build Coastguard Worker // // The lambda takes two arguments, but the first argument |x| is bound at
44*6777b538SAndroid Build Coastguard Worker // // callback creation.
45*6777b538SAndroid Build Coastguard Worker // base::OnceCallback<int(int)> cb = base::BindOnce([] (int x, int y) {
46*6777b538SAndroid Build Coastguard Worker // return x + y;
47*6777b538SAndroid Build Coastguard Worker // }, 1);
48*6777b538SAndroid Build Coastguard Worker // // Run() only needs the remaining unbound argument |y|.
49*6777b538SAndroid Build Coastguard Worker // printf("1 + 2 = %d\n", std::move(cb).Run(2)); // Prints 3
50*6777b538SAndroid Build Coastguard Worker // printf("cb is null? %s\n",
51*6777b538SAndroid Build Coastguard Worker // cb.is_null() ? "true" : "false"); // Prints true
52*6777b538SAndroid Build Coastguard Worker // std::move(cb).Run(2); // Crashes since |cb| has already run.
53*6777b538SAndroid Build Coastguard Worker //
54*6777b538SAndroid Build Coastguard Worker // Callbacks also support cancellation. A common use is binding the receiver
55*6777b538SAndroid Build Coastguard Worker // object as a WeakPtr<T>. If that weak pointer is invalidated, calling Run()
56*6777b538SAndroid Build Coastguard Worker // will be a no-op. Note that |IsCancelled()| and |is_null()| are distinct:
57*6777b538SAndroid Build Coastguard Worker // simply cancelling a callback will not also make it null.
58*6777b538SAndroid Build Coastguard Worker //
59*6777b538SAndroid Build Coastguard Worker // See //docs/callback.md for the full documentation.
60*6777b538SAndroid Build Coastguard Worker
61*6777b538SAndroid Build Coastguard Worker namespace base {
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker namespace internal {
64*6777b538SAndroid Build Coastguard Worker
65*6777b538SAndroid Build Coastguard Worker template <bool is_once,
66*6777b538SAndroid Build Coastguard Worker typename R,
67*6777b538SAndroid Build Coastguard Worker typename... UnboundArgs,
68*6777b538SAndroid Build Coastguard Worker typename... BoundArgs>
69*6777b538SAndroid Build Coastguard Worker auto ToDoNothingCallback(
70*6777b538SAndroid Build Coastguard Worker DoNothingCallbackTag::WithBoundArguments<BoundArgs...> t);
71*6777b538SAndroid Build Coastguard Worker
72*6777b538SAndroid Build Coastguard Worker } // namespace internal
73*6777b538SAndroid Build Coastguard Worker
74*6777b538SAndroid Build Coastguard Worker template <typename R, typename... Args>
75*6777b538SAndroid Build Coastguard Worker class TRIVIAL_ABI OnceCallback<R(Args...)> {
76*6777b538SAndroid Build Coastguard Worker public:
77*6777b538SAndroid Build Coastguard Worker using ResultType = R;
78*6777b538SAndroid Build Coastguard Worker using RunType = R(Args...);
79*6777b538SAndroid Build Coastguard Worker using PolymorphicInvoke = R (*)(internal::BindStateBase*,
80*6777b538SAndroid Build Coastguard Worker internal::PassingType<Args>...);
81*6777b538SAndroid Build Coastguard Worker
82*6777b538SAndroid Build Coastguard Worker // Constructs a null `OnceCallback`. A null callback has no associated functor
83*6777b538SAndroid Build Coastguard Worker // and cannot be run.
84*6777b538SAndroid Build Coastguard Worker constexpr OnceCallback() = default;
85*6777b538SAndroid Build Coastguard Worker // Disallowed to prevent ambiguity.
86*6777b538SAndroid Build Coastguard Worker OnceCallback(std::nullptr_t) = delete;
87*6777b538SAndroid Build Coastguard Worker
88*6777b538SAndroid Build Coastguard Worker // `OnceCallback` is not copyable since its bound functor may only run at most
89*6777b538SAndroid Build Coastguard Worker // once.
90*6777b538SAndroid Build Coastguard Worker OnceCallback(const OnceCallback&) = delete;
91*6777b538SAndroid Build Coastguard Worker OnceCallback& operator=(const OnceCallback&) = delete;
92*6777b538SAndroid Build Coastguard Worker
93*6777b538SAndroid Build Coastguard Worker // Subtle: since `this` is marked as TRIVIAL_ABI, the move operations
94*6777b538SAndroid Build Coastguard Worker // must leave the moved-from callback in a trivially destructible state.
95*6777b538SAndroid Build Coastguard Worker OnceCallback(OnceCallback&&) noexcept = default;
96*6777b538SAndroid Build Coastguard Worker OnceCallback& operator=(OnceCallback&&) noexcept = default;
97*6777b538SAndroid Build Coastguard Worker
98*6777b538SAndroid Build Coastguard Worker ~OnceCallback() = default;
99*6777b538SAndroid Build Coastguard Worker
100*6777b538SAndroid Build Coastguard Worker // A `OnceCallback` is a strict subset of `RepeatingCallback`'s functionality,
101*6777b538SAndroid Build Coastguard Worker // so allow seamless conversion.
102*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor)
OnceCallback(RepeatingCallback<RunType> other)103*6777b538SAndroid Build Coastguard Worker OnceCallback(RepeatingCallback<RunType> other)
104*6777b538SAndroid Build Coastguard Worker : holder_(std::move(other.holder_)) {}
105*6777b538SAndroid Build Coastguard Worker OnceCallback& operator=(RepeatingCallback<RunType> other) {
106*6777b538SAndroid Build Coastguard Worker holder_ = std::move(other.holder_);
107*6777b538SAndroid Build Coastguard Worker return *this;
108*6777b538SAndroid Build Coastguard Worker }
109*6777b538SAndroid Build Coastguard Worker
110*6777b538SAndroid Build Coastguard Worker // Returns true if `this` is non-null and can be `Run()`.
111*6777b538SAndroid Build Coastguard Worker explicit operator bool() const { return !!holder_; }
112*6777b538SAndroid Build Coastguard Worker // Returns true if `this` is null and cannot be `Run()`.
is_null()113*6777b538SAndroid Build Coastguard Worker bool is_null() const { return holder_.is_null(); }
114*6777b538SAndroid Build Coastguard Worker
115*6777b538SAndroid Build Coastguard Worker // Returns true if calling `Run()` is a no-op because of cancellation.
116*6777b538SAndroid Build Coastguard Worker //
117*6777b538SAndroid Build Coastguard Worker // - Not thread-safe, i.e. must be called on the same sequence that will
118*6777b538SAndroid Build Coastguard Worker // ultimately `Run()` the callback
119*6777b538SAndroid Build Coastguard Worker // - May not be called on a null callback.
IsCancelled()120*6777b538SAndroid Build Coastguard Worker bool IsCancelled() const { return holder_.IsCancelled(); }
121*6777b538SAndroid Build Coastguard Worker
122*6777b538SAndroid Build Coastguard Worker // Subtle version of `IsCancelled()` that allows cancellation state to be
123*6777b538SAndroid Build Coastguard Worker // queried from any sequence. May return true even if the callback has
124*6777b538SAndroid Build Coastguard Worker // actually been cancelled.
125*6777b538SAndroid Build Coastguard Worker //
126*6777b538SAndroid Build Coastguard Worker // Do not use. This is intended for internal //base usage.
127*6777b538SAndroid Build Coastguard Worker // TODO(dcheng): Restrict this since it, in fact, being used outside of its
128*6777b538SAndroid Build Coastguard Worker // originally intended use.
MaybeValid()129*6777b538SAndroid Build Coastguard Worker bool MaybeValid() const { return holder_.MaybeValid(); }
130*6777b538SAndroid Build Coastguard Worker
131*6777b538SAndroid Build Coastguard Worker // Resets this to a null state.
Reset()132*6777b538SAndroid Build Coastguard Worker REINITIALIZES_AFTER_MOVE void Reset() { holder_.Reset(); }
133*6777b538SAndroid Build Coastguard Worker
134*6777b538SAndroid Build Coastguard Worker // Non-consuming `Run()` is disallowed for `OnceCallback`.
Run(Args...args)135*6777b538SAndroid Build Coastguard Worker R Run(Args... args) const& {
136*6777b538SAndroid Build Coastguard Worker static_assert(!sizeof(*this),
137*6777b538SAndroid Build Coastguard Worker "OnceCallback::Run() may only be invoked on a non-const "
138*6777b538SAndroid Build Coastguard Worker "rvalue, i.e. std::move(callback).Run().");
139*6777b538SAndroid Build Coastguard Worker NOTREACHED();
140*6777b538SAndroid Build Coastguard Worker }
141*6777b538SAndroid Build Coastguard Worker
142*6777b538SAndroid Build Coastguard Worker // Calls the bound functor with any already-bound arguments + `args`. Consumes
143*6777b538SAndroid Build Coastguard Worker // `this`, i.e. `this` becomes null.
144*6777b538SAndroid Build Coastguard Worker //
145*6777b538SAndroid Build Coastguard Worker // May not be called on a null callback.
Run(Args...args)146*6777b538SAndroid Build Coastguard Worker R Run(Args... args) && {
147*6777b538SAndroid Build Coastguard Worker CHECK(!holder_.is_null());
148*6777b538SAndroid Build Coastguard Worker
149*6777b538SAndroid Build Coastguard Worker // Move the callback instance into a local variable before the invocation,
150*6777b538SAndroid Build Coastguard Worker // that ensures the internal state is cleared after the invocation.
151*6777b538SAndroid Build Coastguard Worker // It's not safe to touch |this| after the invocation, since running the
152*6777b538SAndroid Build Coastguard Worker // bound function may destroy |this|.
153*6777b538SAndroid Build Coastguard Worker internal::BindStateHolder holder = std::move(holder_);
154*6777b538SAndroid Build Coastguard Worker PolymorphicInvoke f =
155*6777b538SAndroid Build Coastguard Worker reinterpret_cast<PolymorphicInvoke>(holder.polymorphic_invoke());
156*6777b538SAndroid Build Coastguard Worker return f(holder.bind_state().get(), std::forward<Args>(args)...);
157*6777b538SAndroid Build Coastguard Worker }
158*6777b538SAndroid Build Coastguard Worker
159*6777b538SAndroid Build Coastguard Worker // Then() returns a new OnceCallback that receives the same arguments as
160*6777b538SAndroid Build Coastguard Worker // |this|, and with the return type of |then|. The returned callback will:
161*6777b538SAndroid Build Coastguard Worker // 1) Run the functor currently bound to |this| callback.
162*6777b538SAndroid Build Coastguard Worker // 2) Run the |then| callback with the result from step 1 as its single
163*6777b538SAndroid Build Coastguard Worker // argument.
164*6777b538SAndroid Build Coastguard Worker // 3) Return the value from running the |then| callback.
165*6777b538SAndroid Build Coastguard Worker //
166*6777b538SAndroid Build Coastguard Worker // Since this method generates a callback that is a replacement for `this`,
167*6777b538SAndroid Build Coastguard Worker // `this` will be consumed and reset to a null callback to ensure the
168*6777b538SAndroid Build Coastguard Worker // originally-bound functor can be run at most once.
169*6777b538SAndroid Build Coastguard Worker template <typename ThenR, typename... ThenArgs>
Then(OnceCallback<ThenR (ThenArgs...)> then)170*6777b538SAndroid Build Coastguard Worker OnceCallback<ThenR(Args...)> Then(OnceCallback<ThenR(ThenArgs...)> then) && {
171*6777b538SAndroid Build Coastguard Worker CHECK(then);
172*6777b538SAndroid Build Coastguard Worker return base::BindOnce(
173*6777b538SAndroid Build Coastguard Worker internal::ThenHelper<
174*6777b538SAndroid Build Coastguard Worker OnceCallback, OnceCallback<ThenR(ThenArgs...)>>::CreateTrampoline(),
175*6777b538SAndroid Build Coastguard Worker std::move(*this), std::move(then));
176*6777b538SAndroid Build Coastguard Worker }
177*6777b538SAndroid Build Coastguard Worker
178*6777b538SAndroid Build Coastguard Worker // This overload is required; even though RepeatingCallback is implicitly
179*6777b538SAndroid Build Coastguard Worker // convertible to OnceCallback, that conversion will not used when matching
180*6777b538SAndroid Build Coastguard Worker // for template argument deduction.
181*6777b538SAndroid Build Coastguard Worker template <typename ThenR, typename... ThenArgs>
Then(RepeatingCallback<ThenR (ThenArgs...)> then)182*6777b538SAndroid Build Coastguard Worker OnceCallback<ThenR(Args...)> Then(
183*6777b538SAndroid Build Coastguard Worker RepeatingCallback<ThenR(ThenArgs...)> then) && {
184*6777b538SAndroid Build Coastguard Worker CHECK(then);
185*6777b538SAndroid Build Coastguard Worker return base::BindOnce(
186*6777b538SAndroid Build Coastguard Worker internal::ThenHelper<
187*6777b538SAndroid Build Coastguard Worker OnceCallback,
188*6777b538SAndroid Build Coastguard Worker RepeatingCallback<ThenR(ThenArgs...)>>::CreateTrampoline(),
189*6777b538SAndroid Build Coastguard Worker std::move(*this), std::move(then));
190*6777b538SAndroid Build Coastguard Worker }
191*6777b538SAndroid Build Coastguard Worker
192*6777b538SAndroid Build Coastguard Worker // Internal constructors for various callback helper tag types, e.g.
193*6777b538SAndroid Build Coastguard Worker // `base::DoNothing()`.
194*6777b538SAndroid Build Coastguard Worker
195*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor)
OnceCallback(internal::NullCallbackTag)196*6777b538SAndroid Build Coastguard Worker constexpr OnceCallback(internal::NullCallbackTag) : OnceCallback() {}
197*6777b538SAndroid Build Coastguard Worker constexpr OnceCallback& operator=(internal::NullCallbackTag) {
198*6777b538SAndroid Build Coastguard Worker *this = OnceCallback();
199*6777b538SAndroid Build Coastguard Worker return *this;
200*6777b538SAndroid Build Coastguard Worker }
201*6777b538SAndroid Build Coastguard Worker
202*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor)
OnceCallback(internal::NullCallbackTag::WithSignature<RunType>)203*6777b538SAndroid Build Coastguard Worker constexpr OnceCallback(internal::NullCallbackTag::WithSignature<RunType>)
204*6777b538SAndroid Build Coastguard Worker : OnceCallback(internal::NullCallbackTag()) {}
205*6777b538SAndroid Build Coastguard Worker constexpr OnceCallback& operator=(
206*6777b538SAndroid Build Coastguard Worker internal::NullCallbackTag::WithSignature<RunType>) {
207*6777b538SAndroid Build Coastguard Worker *this = internal::NullCallbackTag();
208*6777b538SAndroid Build Coastguard Worker return *this;
209*6777b538SAndroid Build Coastguard Worker }
210*6777b538SAndroid Build Coastguard Worker
211*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor)
OnceCallback(internal::DoNothingCallbackTag)212*6777b538SAndroid Build Coastguard Worker constexpr OnceCallback(internal::DoNothingCallbackTag)
213*6777b538SAndroid Build Coastguard Worker requires(std::is_void_v<R>)
214*6777b538SAndroid Build Coastguard Worker : OnceCallback(BindOnce([](Args... args) {})) {}
215*6777b538SAndroid Build Coastguard Worker constexpr OnceCallback& operator=(internal::DoNothingCallbackTag)
requires(std::is_void_v<R>)216*6777b538SAndroid Build Coastguard Worker requires(std::is_void_v<R>)
217*6777b538SAndroid Build Coastguard Worker {
218*6777b538SAndroid Build Coastguard Worker *this = BindOnce([](Args... args) {});
219*6777b538SAndroid Build Coastguard Worker return *this;
220*6777b538SAndroid Build Coastguard Worker }
221*6777b538SAndroid Build Coastguard Worker
222*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor)
OnceCallback(internal::DoNothingCallbackTag::WithSignature<RunType>)223*6777b538SAndroid Build Coastguard Worker constexpr OnceCallback(internal::DoNothingCallbackTag::WithSignature<RunType>)
224*6777b538SAndroid Build Coastguard Worker requires(std::is_void_v<R>)
225*6777b538SAndroid Build Coastguard Worker : OnceCallback(internal::DoNothingCallbackTag()) {}
226*6777b538SAndroid Build Coastguard Worker constexpr OnceCallback& operator=(
227*6777b538SAndroid Build Coastguard Worker internal::DoNothingCallbackTag::WithSignature<RunType>)
requires(std::is_void_v<R>)228*6777b538SAndroid Build Coastguard Worker requires(std::is_void_v<R>)
229*6777b538SAndroid Build Coastguard Worker {
230*6777b538SAndroid Build Coastguard Worker *this = internal::DoNothingCallbackTag();
231*6777b538SAndroid Build Coastguard Worker return *this;
232*6777b538SAndroid Build Coastguard Worker }
233*6777b538SAndroid Build Coastguard Worker
234*6777b538SAndroid Build Coastguard Worker template <typename... BoundArgs>
235*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor)
OnceCallback(internal::DoNothingCallbackTag::WithBoundArguments<BoundArgs...> tag)236*6777b538SAndroid Build Coastguard Worker constexpr OnceCallback(
237*6777b538SAndroid Build Coastguard Worker internal::DoNothingCallbackTag::WithBoundArguments<BoundArgs...> tag)
238*6777b538SAndroid Build Coastguard Worker requires(std::is_void_v<R>)
239*6777b538SAndroid Build Coastguard Worker : OnceCallback(
240*6777b538SAndroid Build Coastguard Worker internal::ToDoNothingCallback<true, R, Args...>(std::move(tag))) {}
241*6777b538SAndroid Build Coastguard Worker template <typename... BoundArgs>
242*6777b538SAndroid Build Coastguard Worker constexpr OnceCallback& operator=(
243*6777b538SAndroid Build Coastguard Worker internal::DoNothingCallbackTag::WithBoundArguments<BoundArgs...> tag)
requires(std::is_void_v<R>)244*6777b538SAndroid Build Coastguard Worker requires(std::is_void_v<R>)
245*6777b538SAndroid Build Coastguard Worker {
246*6777b538SAndroid Build Coastguard Worker *this = internal::ToDoNothingCallback<true, R, Args...>(std::move(tag));
247*6777b538SAndroid Build Coastguard Worker return *this;
248*6777b538SAndroid Build Coastguard Worker }
249*6777b538SAndroid Build Coastguard Worker
250*6777b538SAndroid Build Coastguard Worker // Internal constructor for `base::BindOnce()`.
OnceCallback(internal::BindStateBase * bind_state)251*6777b538SAndroid Build Coastguard Worker explicit OnceCallback(internal::BindStateBase* bind_state)
252*6777b538SAndroid Build Coastguard Worker : holder_(bind_state) {}
253*6777b538SAndroid Build Coastguard Worker
254*6777b538SAndroid Build Coastguard Worker template <typename Signature>
255*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor)
256*6777b538SAndroid Build Coastguard Worker operator FunctionRef<Signature>() & {
257*6777b538SAndroid Build Coastguard Worker static_assert(
258*6777b538SAndroid Build Coastguard Worker AlwaysFalse<Signature>,
259*6777b538SAndroid Build Coastguard Worker "need to convert a base::OnceCallback to base::FunctionRef? "
260*6777b538SAndroid Build Coastguard Worker "Please bring up this use case on #cxx (Slack) or [email protected].");
261*6777b538SAndroid Build Coastguard Worker }
262*6777b538SAndroid Build Coastguard Worker
263*6777b538SAndroid Build Coastguard Worker template <typename Signature>
264*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor)
265*6777b538SAndroid Build Coastguard Worker operator FunctionRef<Signature>() && {
266*6777b538SAndroid Build Coastguard Worker static_assert(
267*6777b538SAndroid Build Coastguard Worker AlwaysFalse<Signature>,
268*6777b538SAndroid Build Coastguard Worker "using base::BindOnce() is not necessary with base::FunctionRef; is it "
269*6777b538SAndroid Build Coastguard Worker "possible to use a capturing lambda directly? If not, please bring up "
270*6777b538SAndroid Build Coastguard Worker "this use case on #cxx (Slack) or [email protected].");
271*6777b538SAndroid Build Coastguard Worker }
272*6777b538SAndroid Build Coastguard Worker
273*6777b538SAndroid Build Coastguard Worker private:
274*6777b538SAndroid Build Coastguard Worker internal::BindStateHolder holder_;
275*6777b538SAndroid Build Coastguard Worker };
276*6777b538SAndroid Build Coastguard Worker
277*6777b538SAndroid Build Coastguard Worker template <typename R, typename... Args>
278*6777b538SAndroid Build Coastguard Worker class TRIVIAL_ABI RepeatingCallback<R(Args...)> {
279*6777b538SAndroid Build Coastguard Worker public:
280*6777b538SAndroid Build Coastguard Worker using ResultType = R;
281*6777b538SAndroid Build Coastguard Worker using RunType = R(Args...);
282*6777b538SAndroid Build Coastguard Worker using PolymorphicInvoke = R (*)(internal::BindStateBase*,
283*6777b538SAndroid Build Coastguard Worker internal::PassingType<Args>...);
284*6777b538SAndroid Build Coastguard Worker
285*6777b538SAndroid Build Coastguard Worker // Constructs a null `RepeatingCallback`. A null callback has no associated
286*6777b538SAndroid Build Coastguard Worker // functor and cannot be run.
287*6777b538SAndroid Build Coastguard Worker constexpr RepeatingCallback() = default;
288*6777b538SAndroid Build Coastguard Worker // Disallowed to prevent ambiguity.
289*6777b538SAndroid Build Coastguard Worker RepeatingCallback(std::nullptr_t) = delete;
290*6777b538SAndroid Build Coastguard Worker
291*6777b538SAndroid Build Coastguard Worker // Unlike a `OnceCallback`, a `RepeatingCallback` may be copied since its
292*6777b538SAndroid Build Coastguard Worker // bound functor may be run more than once.
293*6777b538SAndroid Build Coastguard Worker RepeatingCallback(const RepeatingCallback&) = default;
294*6777b538SAndroid Build Coastguard Worker RepeatingCallback& operator=(const RepeatingCallback&) = default;
295*6777b538SAndroid Build Coastguard Worker
296*6777b538SAndroid Build Coastguard Worker // Subtle: since `this` is marked as TRIVIAL_ABI, the move operations
297*6777b538SAndroid Build Coastguard Worker // must leave the moved-from callback in a trivially destructible state.
298*6777b538SAndroid Build Coastguard Worker RepeatingCallback(RepeatingCallback&&) noexcept = default;
299*6777b538SAndroid Build Coastguard Worker RepeatingCallback& operator=(RepeatingCallback&&) noexcept = default;
300*6777b538SAndroid Build Coastguard Worker
301*6777b538SAndroid Build Coastguard Worker ~RepeatingCallback() = default;
302*6777b538SAndroid Build Coastguard Worker
303*6777b538SAndroid Build Coastguard Worker // Returns true if `this` is non-null and can be `Run()`.
304*6777b538SAndroid Build Coastguard Worker explicit operator bool() const { return !!holder_; }
305*6777b538SAndroid Build Coastguard Worker // Returns true if `this` is null and cannot be `Run()`.
is_null()306*6777b538SAndroid Build Coastguard Worker bool is_null() const { return holder_.is_null(); }
307*6777b538SAndroid Build Coastguard Worker
308*6777b538SAndroid Build Coastguard Worker // Returns true if calling `Run()` is a no-op because of cancellation.
309*6777b538SAndroid Build Coastguard Worker //
310*6777b538SAndroid Build Coastguard Worker // - Not thread-safe, i.e. must be called on the same sequence that will
311*6777b538SAndroid Build Coastguard Worker // ultimately `Run()` the callback
312*6777b538SAndroid Build Coastguard Worker // - May not be called on a null callback.
IsCancelled()313*6777b538SAndroid Build Coastguard Worker bool IsCancelled() const { return holder_.IsCancelled(); }
314*6777b538SAndroid Build Coastguard Worker
315*6777b538SAndroid Build Coastguard Worker // Subtle version of `IsCancelled()` that allows cancellation state to be
316*6777b538SAndroid Build Coastguard Worker // queried from any sequence. May return true even if the callback has
317*6777b538SAndroid Build Coastguard Worker // actually been cancelled.
318*6777b538SAndroid Build Coastguard Worker //
319*6777b538SAndroid Build Coastguard Worker // Do not use. This is intended for internal //base usage.
320*6777b538SAndroid Build Coastguard Worker // TODO(dcheng): Restrict this since it, in fact, being used outside of its
321*6777b538SAndroid Build Coastguard Worker // originally intended use.
MaybeValid()322*6777b538SAndroid Build Coastguard Worker bool MaybeValid() const { return holder_.MaybeValid(); }
323*6777b538SAndroid Build Coastguard Worker
324*6777b538SAndroid Build Coastguard Worker // Equality operators: two `RepeatingCallback`'s are equal
325*6777b538SAndroid Build Coastguard Worker friend bool operator==(const RepeatingCallback&,
326*6777b538SAndroid Build Coastguard Worker const RepeatingCallback&) = default;
327*6777b538SAndroid Build Coastguard Worker
328*6777b538SAndroid Build Coastguard Worker // Resets this to null.
Reset()329*6777b538SAndroid Build Coastguard Worker REINITIALIZES_AFTER_MOVE void Reset() { holder_.Reset(); }
330*6777b538SAndroid Build Coastguard Worker
331*6777b538SAndroid Build Coastguard Worker // Calls the bound functor with any already-bound arguments + `args`. Does not
332*6777b538SAndroid Build Coastguard Worker // consume `this`, i.e. this remains non-null.
333*6777b538SAndroid Build Coastguard Worker //
334*6777b538SAndroid Build Coastguard Worker // May not be called on a null callback.
Run(Args...args)335*6777b538SAndroid Build Coastguard Worker R Run(Args... args) const& {
336*6777b538SAndroid Build Coastguard Worker CHECK(!holder_.is_null());
337*6777b538SAndroid Build Coastguard Worker
338*6777b538SAndroid Build Coastguard Worker // Keep `bind_state` alive at least until after the invocation to ensure all
339*6777b538SAndroid Build Coastguard Worker // bound `Unretained` arguments remain protected by MiraclePtr.
340*6777b538SAndroid Build Coastguard Worker scoped_refptr<internal::BindStateBase> bind_state = holder_.bind_state();
341*6777b538SAndroid Build Coastguard Worker
342*6777b538SAndroid Build Coastguard Worker PolymorphicInvoke f =
343*6777b538SAndroid Build Coastguard Worker reinterpret_cast<PolymorphicInvoke>(holder_.polymorphic_invoke());
344*6777b538SAndroid Build Coastguard Worker return f(bind_state.get(), std::forward<Args>(args)...);
345*6777b538SAndroid Build Coastguard Worker }
346*6777b538SAndroid Build Coastguard Worker
347*6777b538SAndroid Build Coastguard Worker // Calls the bound functor with any already-bound arguments + `args`. Consumes
348*6777b538SAndroid Build Coastguard Worker // `this`, i.e. `this` becomes null.
349*6777b538SAndroid Build Coastguard Worker //
350*6777b538SAndroid Build Coastguard Worker // May not be called on a null callback.
Run(Args...args)351*6777b538SAndroid Build Coastguard Worker R Run(Args... args) && {
352*6777b538SAndroid Build Coastguard Worker CHECK(!holder_.is_null());
353*6777b538SAndroid Build Coastguard Worker
354*6777b538SAndroid Build Coastguard Worker // Move the callback instance into a local variable before the invocation,
355*6777b538SAndroid Build Coastguard Worker // that ensures the internal state is cleared after the invocation.
356*6777b538SAndroid Build Coastguard Worker // It's not safe to touch |this| after the invocation, since running the
357*6777b538SAndroid Build Coastguard Worker // bound function may destroy |this|.
358*6777b538SAndroid Build Coastguard Worker internal::BindStateHolder holder = std::move(holder_);
359*6777b538SAndroid Build Coastguard Worker PolymorphicInvoke f =
360*6777b538SAndroid Build Coastguard Worker reinterpret_cast<PolymorphicInvoke>(holder.polymorphic_invoke());
361*6777b538SAndroid Build Coastguard Worker return f(holder.bind_state().get(), std::forward<Args>(args)...);
362*6777b538SAndroid Build Coastguard Worker }
363*6777b538SAndroid Build Coastguard Worker
364*6777b538SAndroid Build Coastguard Worker // Then() returns a new RepeatingCallback that receives the same arguments as
365*6777b538SAndroid Build Coastguard Worker // |this|, and with the return type of |then|. The
366*6777b538SAndroid Build Coastguard Worker // returned callback will:
367*6777b538SAndroid Build Coastguard Worker // 1) Run the functor currently bound to |this| callback.
368*6777b538SAndroid Build Coastguard Worker // 2) Run the |then| callback with the result from step 1 as its single
369*6777b538SAndroid Build Coastguard Worker // argument.
370*6777b538SAndroid Build Coastguard Worker // 3) Return the value from running the |then| callback.
371*6777b538SAndroid Build Coastguard Worker //
372*6777b538SAndroid Build Coastguard Worker // If called on an rvalue (e.g. std::move(cb).Then(...)), this method
373*6777b538SAndroid Build Coastguard Worker // generates a callback that is a replacement for `this`. Therefore, `this`
374*6777b538SAndroid Build Coastguard Worker // will be consumed and reset to a null callback to ensure the
375*6777b538SAndroid Build Coastguard Worker // originally-bound functor will be run at most once.
376*6777b538SAndroid Build Coastguard Worker template <typename ThenR, typename... ThenArgs>
Then(RepeatingCallback<ThenR (ThenArgs...)> then)377*6777b538SAndroid Build Coastguard Worker RepeatingCallback<ThenR(Args...)> Then(
378*6777b538SAndroid Build Coastguard Worker RepeatingCallback<ThenR(ThenArgs...)> then) const& {
379*6777b538SAndroid Build Coastguard Worker CHECK(then);
380*6777b538SAndroid Build Coastguard Worker return BindRepeating(
381*6777b538SAndroid Build Coastguard Worker internal::ThenHelper<
382*6777b538SAndroid Build Coastguard Worker RepeatingCallback,
383*6777b538SAndroid Build Coastguard Worker RepeatingCallback<ThenR(ThenArgs...)>>::CreateTrampoline(),
384*6777b538SAndroid Build Coastguard Worker *this, std::move(then));
385*6777b538SAndroid Build Coastguard Worker }
386*6777b538SAndroid Build Coastguard Worker
387*6777b538SAndroid Build Coastguard Worker template <typename ThenR, typename... ThenArgs>
Then(RepeatingCallback<ThenR (ThenArgs...)> then)388*6777b538SAndroid Build Coastguard Worker RepeatingCallback<ThenR(Args...)> Then(
389*6777b538SAndroid Build Coastguard Worker RepeatingCallback<ThenR(ThenArgs...)> then) && {
390*6777b538SAndroid Build Coastguard Worker CHECK(then);
391*6777b538SAndroid Build Coastguard Worker return BindRepeating(
392*6777b538SAndroid Build Coastguard Worker internal::ThenHelper<
393*6777b538SAndroid Build Coastguard Worker RepeatingCallback,
394*6777b538SAndroid Build Coastguard Worker RepeatingCallback<ThenR(ThenArgs...)>>::CreateTrampoline(),
395*6777b538SAndroid Build Coastguard Worker std::move(*this), std::move(then));
396*6777b538SAndroid Build Coastguard Worker }
397*6777b538SAndroid Build Coastguard Worker
398*6777b538SAndroid Build Coastguard Worker // Internal constructors for various callback helper tag types, e.g.
399*6777b538SAndroid Build Coastguard Worker // `base::DoNothing()`.
400*6777b538SAndroid Build Coastguard Worker
401*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor)
RepeatingCallback(internal::NullCallbackTag)402*6777b538SAndroid Build Coastguard Worker constexpr RepeatingCallback(internal::NullCallbackTag)
403*6777b538SAndroid Build Coastguard Worker : RepeatingCallback() {}
404*6777b538SAndroid Build Coastguard Worker constexpr RepeatingCallback& operator=(internal::NullCallbackTag) {
405*6777b538SAndroid Build Coastguard Worker *this = RepeatingCallback();
406*6777b538SAndroid Build Coastguard Worker return *this;
407*6777b538SAndroid Build Coastguard Worker }
408*6777b538SAndroid Build Coastguard Worker
409*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor)
RepeatingCallback(internal::NullCallbackTag::WithSignature<RunType>)410*6777b538SAndroid Build Coastguard Worker constexpr RepeatingCallback(internal::NullCallbackTag::WithSignature<RunType>)
411*6777b538SAndroid Build Coastguard Worker : RepeatingCallback(internal::NullCallbackTag()) {}
412*6777b538SAndroid Build Coastguard Worker constexpr RepeatingCallback& operator=(
413*6777b538SAndroid Build Coastguard Worker internal::NullCallbackTag::WithSignature<RunType>) {
414*6777b538SAndroid Build Coastguard Worker *this = internal::NullCallbackTag();
415*6777b538SAndroid Build Coastguard Worker return *this;
416*6777b538SAndroid Build Coastguard Worker }
417*6777b538SAndroid Build Coastguard Worker
418*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor)
RepeatingCallback(internal::DoNothingCallbackTag)419*6777b538SAndroid Build Coastguard Worker constexpr RepeatingCallback(internal::DoNothingCallbackTag)
420*6777b538SAndroid Build Coastguard Worker requires(std::is_void_v<R>)
421*6777b538SAndroid Build Coastguard Worker : RepeatingCallback(BindRepeating([](Args... args) {})) {}
422*6777b538SAndroid Build Coastguard Worker constexpr RepeatingCallback& operator=(internal::DoNothingCallbackTag)
requires(std::is_void_v<R>)423*6777b538SAndroid Build Coastguard Worker requires(std::is_void_v<R>)
424*6777b538SAndroid Build Coastguard Worker {
425*6777b538SAndroid Build Coastguard Worker *this = BindRepeating([](Args... args) {});
426*6777b538SAndroid Build Coastguard Worker return *this;
427*6777b538SAndroid Build Coastguard Worker }
428*6777b538SAndroid Build Coastguard Worker
429*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor)
RepeatingCallback(internal::DoNothingCallbackTag::WithSignature<RunType>)430*6777b538SAndroid Build Coastguard Worker constexpr RepeatingCallback(
431*6777b538SAndroid Build Coastguard Worker internal::DoNothingCallbackTag::WithSignature<RunType>)
432*6777b538SAndroid Build Coastguard Worker requires(std::is_void_v<R>)
433*6777b538SAndroid Build Coastguard Worker : RepeatingCallback(internal::DoNothingCallbackTag()) {}
434*6777b538SAndroid Build Coastguard Worker constexpr RepeatingCallback& operator=(
435*6777b538SAndroid Build Coastguard Worker internal::DoNothingCallbackTag::WithSignature<RunType>)
requires(std::is_void_v<R>)436*6777b538SAndroid Build Coastguard Worker requires(std::is_void_v<R>)
437*6777b538SAndroid Build Coastguard Worker {
438*6777b538SAndroid Build Coastguard Worker *this = internal::DoNothingCallbackTag();
439*6777b538SAndroid Build Coastguard Worker return *this;
440*6777b538SAndroid Build Coastguard Worker }
441*6777b538SAndroid Build Coastguard Worker
442*6777b538SAndroid Build Coastguard Worker template <typename... BoundArgs>
443*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor)
RepeatingCallback(internal::DoNothingCallbackTag::WithBoundArguments<BoundArgs...> tag)444*6777b538SAndroid Build Coastguard Worker constexpr RepeatingCallback(
445*6777b538SAndroid Build Coastguard Worker internal::DoNothingCallbackTag::WithBoundArguments<BoundArgs...> tag)
446*6777b538SAndroid Build Coastguard Worker requires(std::is_void_v<R>)
447*6777b538SAndroid Build Coastguard Worker : RepeatingCallback(
448*6777b538SAndroid Build Coastguard Worker internal::ToDoNothingCallback<false, R, Args...>(std::move(tag))) {}
449*6777b538SAndroid Build Coastguard Worker template <typename... BoundArgs>
450*6777b538SAndroid Build Coastguard Worker constexpr RepeatingCallback& operator=(
451*6777b538SAndroid Build Coastguard Worker internal::DoNothingCallbackTag::WithBoundArguments<BoundArgs...> tag)
requires(std::is_void_v<R>)452*6777b538SAndroid Build Coastguard Worker requires(std::is_void_v<R>)
453*6777b538SAndroid Build Coastguard Worker {
454*6777b538SAndroid Build Coastguard Worker *this = internal::ToDoNothingCallback<false, R, Args...>(std::move(tag));
455*6777b538SAndroid Build Coastguard Worker return this;
456*6777b538SAndroid Build Coastguard Worker }
457*6777b538SAndroid Build Coastguard Worker
458*6777b538SAndroid Build Coastguard Worker // Internal constructor for `base::BindRepeating()`.
RepeatingCallback(internal::BindStateBase * bind_state)459*6777b538SAndroid Build Coastguard Worker explicit RepeatingCallback(internal::BindStateBase* bind_state)
460*6777b538SAndroid Build Coastguard Worker : holder_(bind_state) {}
461*6777b538SAndroid Build Coastguard Worker
462*6777b538SAndroid Build Coastguard Worker template <typename Signature>
463*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor)
464*6777b538SAndroid Build Coastguard Worker operator FunctionRef<Signature>() & {
465*6777b538SAndroid Build Coastguard Worker static_assert(
466*6777b538SAndroid Build Coastguard Worker AlwaysFalse<Signature>,
467*6777b538SAndroid Build Coastguard Worker "need to convert a base::RepeatingCallback to base::FunctionRef? "
468*6777b538SAndroid Build Coastguard Worker "Please bring up this use case on #cxx (Slack) or [email protected].");
469*6777b538SAndroid Build Coastguard Worker }
470*6777b538SAndroid Build Coastguard Worker
471*6777b538SAndroid Build Coastguard Worker template <typename Signature>
472*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor)
473*6777b538SAndroid Build Coastguard Worker operator FunctionRef<Signature>() && {
474*6777b538SAndroid Build Coastguard Worker static_assert(
475*6777b538SAndroid Build Coastguard Worker AlwaysFalse<Signature>,
476*6777b538SAndroid Build Coastguard Worker "using base::BindRepeating() is not necessary with base::FunctionRef; "
477*6777b538SAndroid Build Coastguard Worker "is it possible to use a capturing lambda directly? If not, please "
478*6777b538SAndroid Build Coastguard Worker "bring up this use case on #cxx (Slack) or [email protected].");
479*6777b538SAndroid Build Coastguard Worker }
480*6777b538SAndroid Build Coastguard Worker
481*6777b538SAndroid Build Coastguard Worker private:
482*6777b538SAndroid Build Coastguard Worker friend class OnceCallback<R(Args...)>;
483*6777b538SAndroid Build Coastguard Worker
484*6777b538SAndroid Build Coastguard Worker internal::BindStateHolder holder_;
485*6777b538SAndroid Build Coastguard Worker };
486*6777b538SAndroid Build Coastguard Worker
487*6777b538SAndroid Build Coastguard Worker namespace internal {
488*6777b538SAndroid Build Coastguard Worker
489*6777b538SAndroid Build Coastguard Worker // Helper for the `DoNothingWithBoundArgs()` implementation.
490*6777b538SAndroid Build Coastguard Worker // Unlike the other helpers, this cannot be easily moved to callback_internal.h,
491*6777b538SAndroid Build Coastguard Worker // since it depends on `BindOnce()` and `BindRepeating()`.
492*6777b538SAndroid Build Coastguard Worker template <bool is_once,
493*6777b538SAndroid Build Coastguard Worker typename R,
494*6777b538SAndroid Build Coastguard Worker typename... UnboundArgs,
495*6777b538SAndroid Build Coastguard Worker typename... BoundArgs>
ToDoNothingCallback(DoNothingCallbackTag::WithBoundArguments<BoundArgs...> t)496*6777b538SAndroid Build Coastguard Worker auto ToDoNothingCallback(
497*6777b538SAndroid Build Coastguard Worker DoNothingCallbackTag::WithBoundArguments<BoundArgs...> t) {
498*6777b538SAndroid Build Coastguard Worker return std::apply(
499*6777b538SAndroid Build Coastguard Worker [](auto&&... args) {
500*6777b538SAndroid Build Coastguard Worker if constexpr (is_once) {
501*6777b538SAndroid Build Coastguard Worker return BindOnce([](TransformToUnwrappedType<is_once, BoundArgs>...,
502*6777b538SAndroid Build Coastguard Worker UnboundArgs...) {},
503*6777b538SAndroid Build Coastguard Worker std::move(args)...);
504*6777b538SAndroid Build Coastguard Worker } else {
505*6777b538SAndroid Build Coastguard Worker return BindRepeating(
506*6777b538SAndroid Build Coastguard Worker [](TransformToUnwrappedType<is_once, BoundArgs>...,
507*6777b538SAndroid Build Coastguard Worker UnboundArgs...) {},
508*6777b538SAndroid Build Coastguard Worker std::move(args)...);
509*6777b538SAndroid Build Coastguard Worker }
510*6777b538SAndroid Build Coastguard Worker },
511*6777b538SAndroid Build Coastguard Worker std::move(t.bound_args));
512*6777b538SAndroid Build Coastguard Worker }
513*6777b538SAndroid Build Coastguard Worker
514*6777b538SAndroid Build Coastguard Worker } // namespace internal
515*6777b538SAndroid Build Coastguard Worker
516*6777b538SAndroid Build Coastguard Worker } // namespace base
517*6777b538SAndroid Build Coastguard Worker
518*6777b538SAndroid Build Coastguard Worker #endif // BASE_FUNCTIONAL_CALLBACK_H_
519