// 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) { … } } // namespace base #endif // BASE_TEST_RECTIFY_CALLBACK_H_