Index: base/bind_lambda.h |
diff --git a/base/bind_lambda.h b/base/bind_lambda.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2479eb3622e5df42025a06e1813dc511f4d59bfc |
--- /dev/null |
+++ b/base/bind_lambda.h |
@@ -0,0 +1,43 @@ |
+// Copyright (c) 2011 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_BIND_LAMBDA_H_ |
+#define BASE_BIND_LAMBDA_H_ |
+ |
+#include "base/bind.h" |
+ |
+namespace base { |
+namespace internal { |
+ |
+template <typename T> |
+struct RemoveObjectFromMemberFunction {}; |
+template <typename R, typename Z, typename... Args> |
+struct RemoveObjectFromMemberFunction<R (Z::*)(Args...) const> { |
+ typedef R(type)(Args...); |
+}; |
+template <typename R, typename Z, typename... Args> |
+struct RemoveObjectFromMemberFunction<R (Z::*)(Args...)> { |
+ typedef R(type)(Args...); |
+}; |
+ |
+template <typename LambdaType> |
+struct LambdaTraits { |
+ using LambdaSig = decltype(&LambdaType::operator()); |
+ using CallbackSig = typename RemoveObjectFromMemberFunction<LambdaSig>::type; |
+ using CallbackType = Callback<CallbackSig>; |
+}; |
+ |
+template <typename LambdaType> |
+using LambdaCallback = typename LambdaTraits<LambdaType>::CallbackType; |
+ |
+} // namespace internal |
+ |
+template <typename LambdaType> |
+internal::LambdaCallback<LambdaType> BindLambda(const LambdaType& lambda) { |
+ return Bind(&LambdaType::operator(), Owned(new LambdaType(lambda))); |
+} |
+ |
+} // namespace base |
+ |
+#endif // BASE_BIND_LAMBDA_H_ |