| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef BASE_TEST_BIND_TEST_UTIL_H_ |
| #define BASE_TEST_BIND_TEST_UTIL_H_ |
| |
| #include "base/bind.h" |
| |
| namespace base { |
| namespace internal { |
| |
| template <typename F, typename Signature> |
| struct BindLambdaHelper; |
| |
| template <typename F, typename R, typename... Args> |
| struct BindLambdaHelper<F, R(Args...)> { |
| static R Run(const std::decay_t<F>& f, Args... args) { |
| return f(std::forward<Args>(args)...); |
| } |
| }; |
| |
| } // namespace internal |
| |
| // A variant of Bind() that can bind capturing lambdas for testing. |
| // This doesn't support extra arguments binding as the lambda itself can do. |
| #if __cplusplus < 201402L |
| template <typename F> |
| auto BindLambdaForTesting(F&& f) -> decltype( |
| BindRepeating(&internal::BindLambdaHelper< |
| F, |
| internal::ExtractCallableRunType<std::decay_t<F>>>::Run, |
| std::forward<F>(f))) { |
| using Signature = internal::ExtractCallableRunType<std::decay_t<F>>; |
| return BindRepeating(&internal::BindLambdaHelper<F, Signature>::Run, |
| std::forward<F>(f)); |
| } |
| #else |
| template <typename F> |
| decltype(auto) BindLambdaForTesting(F&& f) { |
| using Signature = internal::ExtractCallableRunType<std::decay_t<F>>; |
| return BindRepeating(&internal::BindLambdaHelper<F, Signature>::Run, |
| std::forward<F>(f)); |
| } |
| #endif |
| |
| } // namespace base |
| |
| #endif // BASE_TEST_BIND_TEST_UTIL_H_ |