xref: /aosp_15_r20/external/cronet/base/functional/callback_helpers.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 // This defines helpful methods for dealing with Callbacks.  Because Callbacks
6*6777b538SAndroid Build Coastguard Worker // are implemented using templates, with a class per callback signature, adding
7*6777b538SAndroid Build Coastguard Worker // methods to Callback<> itself is unattractive (lots of extra code gets
8*6777b538SAndroid Build Coastguard Worker // generated).  Instead, consider adding methods here.
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #ifndef BASE_FUNCTIONAL_CALLBACK_HELPERS_H_
11*6777b538SAndroid Build Coastguard Worker #define BASE_FUNCTIONAL_CALLBACK_HELPERS_H_
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include <atomic>
14*6777b538SAndroid Build Coastguard Worker #include <memory>
15*6777b538SAndroid Build Coastguard Worker #include <ostream>
16*6777b538SAndroid Build Coastguard Worker #include <type_traits>
17*6777b538SAndroid Build Coastguard Worker #include <utility>
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker #include "base/atomicops.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_tags.h"
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker namespace base {
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker namespace internal {
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker template <typename T>
31*6777b538SAndroid Build Coastguard Worker struct IsBaseCallbackImpl : std::false_type {};
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker template <typename R, typename... Args>
34*6777b538SAndroid Build Coastguard Worker struct IsBaseCallbackImpl<OnceCallback<R(Args...)>> : std::true_type {};
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker template <typename R, typename... Args>
37*6777b538SAndroid Build Coastguard Worker struct IsBaseCallbackImpl<RepeatingCallback<R(Args...)>> : std::true_type {};
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker }  // namespace internal
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker // IsBaseCallback<T> is satisfied if and only if T is an instantiation of
42*6777b538SAndroid Build Coastguard Worker // base::OnceCallback<Signature> or base::RepeatingCallback<Signature>.
43*6777b538SAndroid Build Coastguard Worker template <typename T>
44*6777b538SAndroid Build Coastguard Worker concept IsBaseCallback = internal::IsBaseCallbackImpl<std::decay_t<T>>::value;
45*6777b538SAndroid Build Coastguard Worker 
46*6777b538SAndroid Build Coastguard Worker namespace internal {
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker template <typename... Args>
49*6777b538SAndroid Build Coastguard Worker class OnceCallbackHolder final {
50*6777b538SAndroid Build Coastguard Worker  public:
51*6777b538SAndroid Build Coastguard Worker   OnceCallbackHolder(OnceCallback<void(Args...)> callback,
52*6777b538SAndroid Build Coastguard Worker                      bool ignore_extra_runs)
53*6777b538SAndroid Build Coastguard Worker       : callback_(std::move(callback)), ignore_extra_runs_(ignore_extra_runs) {
54*6777b538SAndroid Build Coastguard Worker     DCHECK(callback_);
55*6777b538SAndroid Build Coastguard Worker   }
56*6777b538SAndroid Build Coastguard Worker   OnceCallbackHolder(const OnceCallbackHolder&) = delete;
57*6777b538SAndroid Build Coastguard Worker   OnceCallbackHolder& operator=(const OnceCallbackHolder&) = delete;
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker   void Run(Args... args) {
60*6777b538SAndroid Build Coastguard Worker     if (has_run_.exchange(true, std::memory_order_relaxed)) {
61*6777b538SAndroid Build Coastguard Worker       CHECK(ignore_extra_runs_) << "Both OnceCallbacks returned by "
62*6777b538SAndroid Build Coastguard Worker                                    "base::SplitOnceCallback() were run. "
63*6777b538SAndroid Build Coastguard Worker                                    "At most one of the pair should be run.";
64*6777b538SAndroid Build Coastguard Worker       return;
65*6777b538SAndroid Build Coastguard Worker     }
66*6777b538SAndroid Build Coastguard Worker     DCHECK(callback_);
67*6777b538SAndroid Build Coastguard Worker     std::move(callback_).Run(std::forward<Args>(args)...);
68*6777b538SAndroid Build Coastguard Worker   }
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker  private:
71*6777b538SAndroid Build Coastguard Worker   std::atomic<bool> has_run_{false};
72*6777b538SAndroid Build Coastguard Worker   base::OnceCallback<void(Args...)> callback_;
73*6777b538SAndroid Build Coastguard Worker   const bool ignore_extra_runs_;
74*6777b538SAndroid Build Coastguard Worker };
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker template <typename... Args>
77*6777b538SAndroid Build Coastguard Worker void ForwardRepeatingCallbacksImpl(
78*6777b538SAndroid Build Coastguard Worker     std::vector<RepeatingCallback<void(Args...)>> cbs,
79*6777b538SAndroid Build Coastguard Worker     Args... args) {
80*6777b538SAndroid Build Coastguard Worker   for (auto& cb : cbs) {
81*6777b538SAndroid Build Coastguard Worker     if (cb) {
82*6777b538SAndroid Build Coastguard Worker       cb.Run(std::forward<Args>(args)...);
83*6777b538SAndroid Build Coastguard Worker     }
84*6777b538SAndroid Build Coastguard Worker   }
85*6777b538SAndroid Build Coastguard Worker }
86*6777b538SAndroid Build Coastguard Worker 
87*6777b538SAndroid Build Coastguard Worker }  // namespace internal
88*6777b538SAndroid Build Coastguard Worker 
89*6777b538SAndroid Build Coastguard Worker // Wraps the given RepeatingCallbacks and return one RepeatingCallbacks with an
90*6777b538SAndroid Build Coastguard Worker // identical signature. On invocation of this callback, all the given
91*6777b538SAndroid Build Coastguard Worker // RepeatingCallbacks will be called with the same arguments. Unbound arguments
92*6777b538SAndroid Build Coastguard Worker // must be copyable.
93*6777b538SAndroid Build Coastguard Worker template <typename... Args>
94*6777b538SAndroid Build Coastguard Worker RepeatingCallback<void(Args...)> ForwardRepeatingCallbacks(
95*6777b538SAndroid Build Coastguard Worker     std::initializer_list<RepeatingCallback<void(Args...)>>&& cbs) {
96*6777b538SAndroid Build Coastguard Worker   std::vector<RepeatingCallback<void(Args...)>> v(
97*6777b538SAndroid Build Coastguard Worker       std::forward<std::initializer_list<RepeatingCallback<void(Args...)>>>(
98*6777b538SAndroid Build Coastguard Worker           cbs));
99*6777b538SAndroid Build Coastguard Worker   return BindRepeating(&internal::ForwardRepeatingCallbacksImpl<Args...>,
100*6777b538SAndroid Build Coastguard Worker                        std::move(v));
101*6777b538SAndroid Build Coastguard Worker }
102*6777b538SAndroid Build Coastguard Worker 
103*6777b538SAndroid Build Coastguard Worker // Wraps the given OnceCallback and returns two OnceCallbacks with an identical
104*6777b538SAndroid Build Coastguard Worker // signature. On first invokation of either returned callbacks, the original
105*6777b538SAndroid Build Coastguard Worker // callback is invoked. Invoking the remaining callback results in a crash.
106*6777b538SAndroid Build Coastguard Worker template <typename... Args>
107*6777b538SAndroid Build Coastguard Worker std::pair<OnceCallback<void(Args...)>, OnceCallback<void(Args...)>>
108*6777b538SAndroid Build Coastguard Worker SplitOnceCallback(OnceCallback<void(Args...)> callback) {
109*6777b538SAndroid Build Coastguard Worker   if (!callback) {
110*6777b538SAndroid Build Coastguard Worker     // Empty input begets two empty outputs.
111*6777b538SAndroid Build Coastguard Worker     return std::make_pair(OnceCallback<void(Args...)>(),
112*6777b538SAndroid Build Coastguard Worker                           OnceCallback<void(Args...)>());
113*6777b538SAndroid Build Coastguard Worker   }
114*6777b538SAndroid Build Coastguard Worker   using Helper = internal::OnceCallbackHolder<Args...>;
115*6777b538SAndroid Build Coastguard Worker   auto wrapped_once = base::BindRepeating(
116*6777b538SAndroid Build Coastguard Worker       &Helper::Run, std::make_unique<Helper>(std::move(callback),
117*6777b538SAndroid Build Coastguard Worker                                              /*ignore_extra_runs=*/false));
118*6777b538SAndroid Build Coastguard Worker   return std::make_pair(wrapped_once, wrapped_once);
119*6777b538SAndroid Build Coastguard Worker }
120*6777b538SAndroid Build Coastguard Worker 
121*6777b538SAndroid Build Coastguard Worker // Adapts `callback` for use in a context which is expecting a callback with
122*6777b538SAndroid Build Coastguard Worker // additional parameters. Returns a null callback if `callback` is null.
123*6777b538SAndroid Build Coastguard Worker //
124*6777b538SAndroid Build Coastguard Worker // Usage:
125*6777b538SAndroid Build Coastguard Worker //   void LogError(char* error_message) {
126*6777b538SAndroid Build Coastguard Worker //     if (error_message) {
127*6777b538SAndroid Build Coastguard Worker //       cout << "Log: " << error_message << endl;
128*6777b538SAndroid Build Coastguard Worker //     }
129*6777b538SAndroid Build Coastguard Worker //   }
130*6777b538SAndroid Build Coastguard Worker //   base::RepeatingCallback<void(int, char*)> cb =
131*6777b538SAndroid Build Coastguard Worker //      base::IgnoreArgs<int>(base::BindRepeating(&LogError));
132*6777b538SAndroid Build Coastguard Worker //   cb.Run(42, nullptr);
133*6777b538SAndroid Build Coastguard Worker //
134*6777b538SAndroid Build Coastguard Worker // Note in the example above that the type(s) passed to `IgnoreArgs`
135*6777b538SAndroid Build Coastguard Worker // represent the additional prepended parameters (those which will be
136*6777b538SAndroid Build Coastguard Worker // "ignored").
137*6777b538SAndroid Build Coastguard Worker template <typename... Preargs, typename... Args>
138*6777b538SAndroid Build Coastguard Worker RepeatingCallback<void(Preargs..., Args...)> IgnoreArgs(
139*6777b538SAndroid Build Coastguard Worker     RepeatingCallback<void(Args...)> callback) {
140*6777b538SAndroid Build Coastguard Worker   return callback ? ::base::BindRepeating(
141*6777b538SAndroid Build Coastguard Worker                         [](RepeatingCallback<void(Args...)> callback,
142*6777b538SAndroid Build Coastguard Worker                            Preargs..., Args... args) {
143*6777b538SAndroid Build Coastguard Worker                           std::move(callback).Run(std::forward<Args>(args)...);
144*6777b538SAndroid Build Coastguard Worker                         },
145*6777b538SAndroid Build Coastguard Worker                         std::move(callback))
146*6777b538SAndroid Build Coastguard Worker                   : RepeatingCallback<void(Preargs..., Args...)>();
147*6777b538SAndroid Build Coastguard Worker }
148*6777b538SAndroid Build Coastguard Worker 
149*6777b538SAndroid Build Coastguard Worker // As above, but for OnceCallback.
150*6777b538SAndroid Build Coastguard Worker template <typename... Preargs, typename... Args>
151*6777b538SAndroid Build Coastguard Worker OnceCallback<void(Preargs..., Args...)> IgnoreArgs(
152*6777b538SAndroid Build Coastguard Worker     OnceCallback<void(Args...)> callback) {
153*6777b538SAndroid Build Coastguard Worker   return callback ? ::base::BindOnce(
154*6777b538SAndroid Build Coastguard Worker                         [](OnceCallback<void(Args...)> callback, Preargs...,
155*6777b538SAndroid Build Coastguard Worker                            Args... args) {
156*6777b538SAndroid Build Coastguard Worker                           std::move(callback).Run(std::forward<Args>(args)...);
157*6777b538SAndroid Build Coastguard Worker                         },
158*6777b538SAndroid Build Coastguard Worker                         std::move(callback))
159*6777b538SAndroid Build Coastguard Worker                   : OnceCallback<void(Preargs..., Args...)>();
160*6777b538SAndroid Build Coastguard Worker }
161*6777b538SAndroid Build Coastguard Worker 
162*6777b538SAndroid Build Coastguard Worker // ScopedClosureRunner is akin to std::unique_ptr<> for Closures. It ensures
163*6777b538SAndroid Build Coastguard Worker // that the Closure is executed no matter how the current scope exits.
164*6777b538SAndroid Build Coastguard Worker // If you are looking for "ScopedCallback", "CallbackRunner", or
165*6777b538SAndroid Build Coastguard Worker // "CallbackScoper" this is the class you want.
166*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT ScopedClosureRunner {
167*6777b538SAndroid Build Coastguard Worker  public:
168*6777b538SAndroid Build Coastguard Worker   ScopedClosureRunner();
169*6777b538SAndroid Build Coastguard Worker   explicit ScopedClosureRunner(OnceClosure closure);
170*6777b538SAndroid Build Coastguard Worker   ScopedClosureRunner(ScopedClosureRunner&& other);
171*6777b538SAndroid Build Coastguard Worker   // Runs the current closure if it's set, then replaces it with the closure
172*6777b538SAndroid Build Coastguard Worker   // from |other|. This is akin to how unique_ptr frees the contained pointer in
173*6777b538SAndroid Build Coastguard Worker   // its move assignment operator. If you need to explicitly avoid running any
174*6777b538SAndroid Build Coastguard Worker   // current closure, use ReplaceClosure().
175*6777b538SAndroid Build Coastguard Worker   ScopedClosureRunner& operator=(ScopedClosureRunner&& other);
176*6777b538SAndroid Build Coastguard Worker   ~ScopedClosureRunner();
177*6777b538SAndroid Build Coastguard Worker 
178*6777b538SAndroid Build Coastguard Worker   explicit operator bool() const { return !!closure_; }
179*6777b538SAndroid Build Coastguard Worker 
180*6777b538SAndroid Build Coastguard Worker   // Calls the current closure and resets it, so it wont be called again.
181*6777b538SAndroid Build Coastguard Worker   void RunAndReset();
182*6777b538SAndroid Build Coastguard Worker 
183*6777b538SAndroid Build Coastguard Worker   // Replaces closure with the new one releasing the old one without calling it.
184*6777b538SAndroid Build Coastguard Worker   void ReplaceClosure(OnceClosure closure);
185*6777b538SAndroid Build Coastguard Worker 
186*6777b538SAndroid Build Coastguard Worker   // Releases the Closure without calling.
187*6777b538SAndroid Build Coastguard Worker   [[nodiscard]] OnceClosure Release();
188*6777b538SAndroid Build Coastguard Worker 
189*6777b538SAndroid Build Coastguard Worker  private:
190*6777b538SAndroid Build Coastguard Worker   OnceClosure closure_;
191*6777b538SAndroid Build Coastguard Worker };
192*6777b538SAndroid Build Coastguard Worker 
193*6777b538SAndroid Build Coastguard Worker // Returns a placeholder type that will implicitly convert into a null callback,
194*6777b538SAndroid Build Coastguard Worker // similar to how std::nullopt / std::nullptr work in conjunction with
195*6777b538SAndroid Build Coastguard Worker // std::optional and various smart pointer types.
196*6777b538SAndroid Build Coastguard Worker constexpr auto NullCallback() {
197*6777b538SAndroid Build Coastguard Worker   return internal::NullCallbackTag();
198*6777b538SAndroid Build Coastguard Worker }
199*6777b538SAndroid Build Coastguard Worker 
200*6777b538SAndroid Build Coastguard Worker // Returns a placeholder type that will implicitly convert into a callback that
201*6777b538SAndroid Build Coastguard Worker // does nothing, similar to how std::nullopt / std::nullptr work in conjunction
202*6777b538SAndroid Build Coastguard Worker // with std::optional and various smart pointer types.
203*6777b538SAndroid Build Coastguard Worker constexpr auto DoNothing() {
204*6777b538SAndroid Build Coastguard Worker   return internal::DoNothingCallbackTag();
205*6777b538SAndroid Build Coastguard Worker }
206*6777b538SAndroid Build Coastguard Worker 
207*6777b538SAndroid Build Coastguard Worker // Similar to the above, but with a type hint. Useful for disambiguating
208*6777b538SAndroid Build Coastguard Worker // among multiple function overloads that take callbacks with different
209*6777b538SAndroid Build Coastguard Worker // signatures:
210*6777b538SAndroid Build Coastguard Worker //
211*6777b538SAndroid Build Coastguard Worker // void F(base::OnceCallback<void()> callback);     // 1
212*6777b538SAndroid Build Coastguard Worker // void F(base::OnceCallback<void(int)> callback);  // 2
213*6777b538SAndroid Build Coastguard Worker //
214*6777b538SAndroid Build Coastguard Worker // F(base::NullCallbackAs<void()>());               // calls 1
215*6777b538SAndroid Build Coastguard Worker // F(base::DoNothingAs<void(int)>());               // calls 2
216*6777b538SAndroid Build Coastguard Worker template <typename Signature>
217*6777b538SAndroid Build Coastguard Worker constexpr auto NullCallbackAs() {
218*6777b538SAndroid Build Coastguard Worker   return internal::NullCallbackTag::WithSignature<Signature>();
219*6777b538SAndroid Build Coastguard Worker }
220*6777b538SAndroid Build Coastguard Worker 
221*6777b538SAndroid Build Coastguard Worker template <typename Signature>
222*6777b538SAndroid Build Coastguard Worker constexpr auto DoNothingAs() {
223*6777b538SAndroid Build Coastguard Worker   return internal::DoNothingCallbackTag::WithSignature<Signature>();
224*6777b538SAndroid Build Coastguard Worker }
225*6777b538SAndroid Build Coastguard Worker 
226*6777b538SAndroid Build Coastguard Worker // Similar to DoNothing above, but with bound arguments. This helper is useful
227*6777b538SAndroid Build Coastguard Worker // for keeping objects alive until the callback runs.
228*6777b538SAndroid Build Coastguard Worker // Example:
229*6777b538SAndroid Build Coastguard Worker //
230*6777b538SAndroid Build Coastguard Worker // void F(base::OnceCallback<void(int)> result_callback);
231*6777b538SAndroid Build Coastguard Worker //
232*6777b538SAndroid Build Coastguard Worker // std::unique_ptr<MyClass> ptr;
233*6777b538SAndroid Build Coastguard Worker // F(base::DoNothingWithBoundArgs(std::move(ptr)));
234*6777b538SAndroid Build Coastguard Worker template <typename... Args>
235*6777b538SAndroid Build Coastguard Worker constexpr auto DoNothingWithBoundArgs(Args&&... args) {
236*6777b538SAndroid Build Coastguard Worker   return internal::DoNothingCallbackTag::WithBoundArguments(
237*6777b538SAndroid Build Coastguard Worker       std::forward<Args>(args)...);
238*6777b538SAndroid Build Coastguard Worker }
239*6777b538SAndroid Build Coastguard Worker 
240*6777b538SAndroid Build Coastguard Worker // Creates a callback that returns `value` when invoked. This helper is useful
241*6777b538SAndroid Build Coastguard Worker // for implementing factories that return a constant value.
242*6777b538SAndroid Build Coastguard Worker // Example:
243*6777b538SAndroid Build Coastguard Worker //
244*6777b538SAndroid Build Coastguard Worker // void F(base::OnceCallback<Widget()> factory);
245*6777b538SAndroid Build Coastguard Worker //
246*6777b538SAndroid Build Coastguard Worker // Widget widget = ...;
247*6777b538SAndroid Build Coastguard Worker // F(base::ReturnValueOnce(std::move(widget)));
248*6777b538SAndroid Build Coastguard Worker template <typename T>
249*6777b538SAndroid Build Coastguard Worker constexpr OnceCallback<T(void)> ReturnValueOnce(T value) {
250*6777b538SAndroid Build Coastguard Worker   static_assert(!std::is_reference_v<T>);
251*6777b538SAndroid Build Coastguard Worker   return base::BindOnce([](T value) { return value; }, std::move(value));
252*6777b538SAndroid Build Coastguard Worker }
253*6777b538SAndroid Build Coastguard Worker 
254*6777b538SAndroid Build Coastguard Worker // Useful for creating a Closure that will delete a pointer when invoked. Only
255*6777b538SAndroid Build Coastguard Worker // use this when necessary. In most cases MessageLoop::DeleteSoon() is a better
256*6777b538SAndroid Build Coastguard Worker // fit.
257*6777b538SAndroid Build Coastguard Worker template <typename T>
258*6777b538SAndroid Build Coastguard Worker void DeletePointer(T* obj) {
259*6777b538SAndroid Build Coastguard Worker   delete obj;
260*6777b538SAndroid Build Coastguard Worker }
261*6777b538SAndroid Build Coastguard Worker 
262*6777b538SAndroid Build Coastguard Worker #if __OBJC__
263*6777b538SAndroid Build Coastguard Worker 
264*6777b538SAndroid Build Coastguard Worker // Creates an Objective-C block with the same signature as the corresponding
265*6777b538SAndroid Build Coastguard Worker // callback. Can be used to implement a callback based API internally based
266*6777b538SAndroid Build Coastguard Worker // on a block based Objective-C API.
267*6777b538SAndroid Build Coastguard Worker //
268*6777b538SAndroid Build Coastguard Worker // Overloaded to work with both repeating and one shot callbacks. Calling the
269*6777b538SAndroid Build Coastguard Worker // block wrapping a base::OnceCallback<...> multiple times will crash (there
270*6777b538SAndroid Build Coastguard Worker // is no way to mark the block as callable only once). Only use that when you
271*6777b538SAndroid Build Coastguard Worker // know that Objective-C API will only invoke the block once.
272*6777b538SAndroid Build Coastguard Worker template <typename R, typename... Args>
273*6777b538SAndroid Build Coastguard Worker auto CallbackToBlock(base::OnceCallback<R(Args...)> callback) {
274*6777b538SAndroid Build Coastguard Worker   __block base::OnceCallback<R(Args...)> block_callback = std::move(callback);
275*6777b538SAndroid Build Coastguard Worker   return ^(Args... args) {
276*6777b538SAndroid Build Coastguard Worker     return std::move(block_callback).Run(std::forward<Args>(args)...);
277*6777b538SAndroid Build Coastguard Worker   };
278*6777b538SAndroid Build Coastguard Worker }
279*6777b538SAndroid Build Coastguard Worker 
280*6777b538SAndroid Build Coastguard Worker template <typename R, typename... Args>
281*6777b538SAndroid Build Coastguard Worker auto CallbackToBlock(base::RepeatingCallback<R(Args...)> callback) {
282*6777b538SAndroid Build Coastguard Worker   return ^(Args... args) {
283*6777b538SAndroid Build Coastguard Worker     return callback.Run(std::forward<Args>(args)...);
284*6777b538SAndroid Build Coastguard Worker   };
285*6777b538SAndroid Build Coastguard Worker }
286*6777b538SAndroid Build Coastguard Worker 
287*6777b538SAndroid Build Coastguard Worker #endif  // __OBJC__
288*6777b538SAndroid Build Coastguard Worker 
289*6777b538SAndroid Build Coastguard Worker }  // namespace base
290*6777b538SAndroid Build Coastguard Worker 
291*6777b538SAndroid Build Coastguard Worker #endif  // BASE_FUNCTIONAL_CALLBACK_HELPERS_H_
292