// 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 #include "base/test/rectify_callback_internal.h" namespace base { // RectifyCallback: // // CallbackType RectifyCallback( // CallbackType callback) // // DesiredCallbackType RectifyCallback( // 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; // void Fn(CbType); // // // These all ignore arguments when passing the callback: // Fn(RectifyCallback(BindOnce([](){ return true; }))); // Fn(RectifyCallback(BindOnce([](C c){ return true; }))); // Fn(RectifyCallback(BindOnce([](B c, C c){ return true; }))); // // // This also works, though it makes no change to the input callback: // Fn(RectifyCallback( // 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 // void Fn(T&& t) { FnImpl(RectifyCallback(std::forward(t))); } // template auto RectifyCallback(Actual&& callback) { using Impl = internal::RectifyCallbackImpl>; return Impl::Rectify(std::move(callback)); } } // namespace base #endif // BASE_TEST_RECTIFY_CALLBACK_H_