|  | // 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. | 
|  | 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)); | 
|  | } | 
|  |  | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_TEST_BIND_TEST_UTIL_H_ |