59 lines
1.9 KiB
C
59 lines
1.9 KiB
C
|
|
// 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_
|