| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef BASE_TEST_RECTIFY_CALLBACK_H_ |
| #define BASE_TEST_RECTIFY_CALLBACK_H_ |
| |
| #include <utility> |
| |
| #include "base/test/rectify_callback_internal.h" |
| |
| namespace base { |
| |
| // RectifyCallback: |
| // |
| // CallbackType<DesiredSignature> RectifyCallback<DesiredSignature>( |
| // CallbackType<ActualSignature> callback) |
| // |
| // DesiredCallbackType RectifyCallback<DesiredCallbackType>( |
| // ActualCallbackType callback) |
| // |
| // Rectifies the signature of `callback` with `DesiredSignature` or |
| // `DesiredCallbackType` by ignoring the first N arguments of the desired |
| // callback type. Useful when binding callbacks with lots of arguments you don't |
| // actually care about. |
| // |
| // For now, `ActualSignature` and `DesiredSignature` must have the same return |
| // type, and the common arguments between the two must match. |
| // |
| // Example: |
| // |
| // using CbType = OnceCallback<bool(A, B, C)>; |
| // void Fn(CbType); |
| // |
| // // These all ignore arguments when passing the callback: |
| // Fn(RectifyCallback<CbType>(BindOnce([](){ return true; }))); |
| // Fn(RectifyCallback<CbType>(BindOnce([](C c){ return true; }))); |
| // Fn(RectifyCallback<CbType>(BindOnce([](B c, C c){ return true; }))); |
| // |
| // // This also works, though it makes no change to the input callback: |
| // Fn(RectifyCallback<CbType>( |
| // BindOnce([](A a, B c, C c){ return true; }))); |
| // |
| // You can also make RectifyCallback implicit by embedding it in a template |
| // version of your function. |
| // |
| // template <typename T> |
| // void Fn(T&& t) { FnImpl(RectifyCallback<CbType>(std::forward<T>(t))); } |
| // |
| template <typename Desired, typename Actual> |
| auto RectifyCallback(Actual&& callback) { |
| using Impl = internal::RectifyCallbackImpl<Desired, std::decay_t<Actual>>; |
| return Impl::Rectify(std::move(callback)); |
| } |
| |
| } // namespace base |
| |
| #endif // BASE_TEST_RECTIFY_CALLBACK_H_ |