xref: /aosp_15_r20/external/cronet/base/test/rectify_callback.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2022 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 #ifndef BASE_TEST_RECTIFY_CALLBACK_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_TEST_RECTIFY_CALLBACK_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <utility>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/test/rectify_callback_internal.h"
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker namespace base {
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker // RectifyCallback:
15*6777b538SAndroid Build Coastguard Worker //
16*6777b538SAndroid Build Coastguard Worker //     CallbackType<DesiredSignature> RectifyCallback<DesiredSignature>(
17*6777b538SAndroid Build Coastguard Worker //         CallbackType<ActualSignature> callback)
18*6777b538SAndroid Build Coastguard Worker //
19*6777b538SAndroid Build Coastguard Worker //     DesiredCallbackType RectifyCallback<DesiredCallbackType>(
20*6777b538SAndroid Build Coastguard Worker //         ActualCallbackType callback)
21*6777b538SAndroid Build Coastguard Worker //
22*6777b538SAndroid Build Coastguard Worker // Rectifies the signature of `callback` with `DesiredSignature` or
23*6777b538SAndroid Build Coastguard Worker // `DesiredCallbackType` by ignoring the first N arguments of the desired
24*6777b538SAndroid Build Coastguard Worker // callback type. Useful when binding callbacks with lots of arguments you don't
25*6777b538SAndroid Build Coastguard Worker // actually care about.
26*6777b538SAndroid Build Coastguard Worker //
27*6777b538SAndroid Build Coastguard Worker // For now, `ActualSignature` and `DesiredSignature` must have the same return
28*6777b538SAndroid Build Coastguard Worker // type, and the common arguments between the two must match.
29*6777b538SAndroid Build Coastguard Worker //
30*6777b538SAndroid Build Coastguard Worker // Example:
31*6777b538SAndroid Build Coastguard Worker //
32*6777b538SAndroid Build Coastguard Worker //    using CbType = OnceCallback<bool(A, B, C)>;
33*6777b538SAndroid Build Coastguard Worker //    void Fn(CbType);
34*6777b538SAndroid Build Coastguard Worker //
35*6777b538SAndroid Build Coastguard Worker //    // These all ignore arguments when passing the callback:
36*6777b538SAndroid Build Coastguard Worker //    Fn(RectifyCallback<CbType>(BindOnce([](){ return true; })));
37*6777b538SAndroid Build Coastguard Worker //    Fn(RectifyCallback<CbType>(BindOnce([](C c){ return true; })));
38*6777b538SAndroid Build Coastguard Worker //    Fn(RectifyCallback<CbType>(BindOnce([](B c, C c){ return true; })));
39*6777b538SAndroid Build Coastguard Worker //
40*6777b538SAndroid Build Coastguard Worker //    // This also works, though it makes no change to the input callback:
41*6777b538SAndroid Build Coastguard Worker //    Fn(RectifyCallback<CbType>(
42*6777b538SAndroid Build Coastguard Worker //        BindOnce([](A a, B c, C c){ return true; })));
43*6777b538SAndroid Build Coastguard Worker //
44*6777b538SAndroid Build Coastguard Worker // You can also make RectifyCallback implicit by embedding it in a template
45*6777b538SAndroid Build Coastguard Worker // version of your function.
46*6777b538SAndroid Build Coastguard Worker //
47*6777b538SAndroid Build Coastguard Worker //    template <typename T>
48*6777b538SAndroid Build Coastguard Worker //    void Fn(T&& t) { FnImpl(RectifyCallback<CbType>(std::forward<T>(t))); }
49*6777b538SAndroid Build Coastguard Worker //
50*6777b538SAndroid Build Coastguard Worker template <typename Desired, typename Actual>
RectifyCallback(Actual && callback)51*6777b538SAndroid Build Coastguard Worker auto RectifyCallback(Actual&& callback) {
52*6777b538SAndroid Build Coastguard Worker   using Impl = internal::RectifyCallbackImpl<Desired, std::decay_t<Actual>>;
53*6777b538SAndroid Build Coastguard Worker   return Impl::Rectify(std::move(callback));
54*6777b538SAndroid Build Coastguard Worker }
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker }  // namespace base
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker #endif  // BASE_TEST_RECTIFY_CALLBACK_H_
59