Index: base/bind_internal_win.h |
diff --git a/base/bind_internal_win.h b/base/bind_internal_win.h |
index 250f472ca817c7b32560c28efa0dfe5dd723bf03..17d3aa3f625c367cedd1b8c1b39a174a76843e09 100644 |
--- a/base/bind_internal_win.h |
+++ b/base/bind_internal_win.h |
@@ -8,7 +8,7 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-// Specializations of FunctionTraits<> for Windows specific calling |
+// Specializations of RunnableAdapter<> for Windows specific calling |
// conventions. Please see base/bind_internal.h for more info. |
#ifndef BASE_BIND_INTERNAL_WIN_H_ |
@@ -23,203 +23,293 @@ |
namespace base { |
namespace internal { |
-template <typename Sig> |
-struct FunctionTraits; |
+template <typename Functor> |
+class RunnableAdapter; |
// __stdcall Function: Arity 0. |
template <typename R> |
-struct FunctionTraits<R(__stdcall *)()> { |
- typedef R (*NormalizedSig)(); |
- typedef false_type IsMethod; |
+class RunnableAdapter<R(__stdcall *)()> { |
+ public: |
+ typedef R (RunType)(); |
- typedef R Return; |
+ explicit RunnableAdapter(R(__stdcall *function)()) |
+ : function_(function) { |
+ } |
+ |
+ R Run() { |
+ return function_(); |
+ } |
+ |
+ private: |
+ R (__stdcall *function_)(); |
}; |
// __fastcall Function: Arity 0. |
template <typename R> |
-struct FunctionTraits<R(__fastcall *)()> { |
- typedef R (*NormalizedSig)(); |
- typedef false_type IsMethod; |
+class RunnableAdapter<R(__fastcall *)()> { |
+ public: |
+ typedef R (RunType)(); |
+ |
+ explicit RunnableAdapter(R(__fastcall *function)()) |
+ : function_(function) { |
+ } |
+ |
+ R Run() { |
+ return function_(); |
+ } |
- typedef R Return; |
+ private: |
+ R (__fastcall *function_)(); |
}; |
// __stdcall Function: Arity 1. |
-template <typename R, typename X1> |
-struct FunctionTraits<R(__stdcall *)(X1)> { |
- typedef R (*NormalizedSig)(X1); |
- typedef false_type IsMethod; |
+template <typename R, typename A1> |
+class RunnableAdapter<R(__stdcall *)(A1)> { |
+ public: |
+ typedef R (RunType)(A1); |
- typedef R Return; |
+ explicit RunnableAdapter(R(__stdcall *function)(A1)) |
+ : function_(function) { |
+ } |
- // Target type for each bound parameter. |
- typedef X1 B1; |
+ R Run(typename CallbackParamTraits<A1>::ForwardType a1) { |
+ return function_(a1); |
+ } |
+ |
+ private: |
+ R (__stdcall *function_)(A1); |
}; |
// __fastcall Function: Arity 1. |
-template <typename R, typename X1> |
-struct FunctionTraits<R(__fastcall *)(X1)> { |
- typedef R (*NormalizedSig)(X1); |
- typedef false_type IsMethod; |
+template <typename R, typename A1> |
+class RunnableAdapter<R(__fastcall *)(A1)> { |
+ public: |
+ typedef R (RunType)(A1); |
+ |
+ explicit RunnableAdapter(R(__fastcall *function)(A1)) |
+ : function_(function) { |
+ } |
- typedef R Return; |
+ R Run(typename CallbackParamTraits<A1>::ForwardType a1) { |
+ return function_(a1); |
+ } |
- // Target type for each bound parameter. |
- typedef X1 B1; |
+ private: |
+ R (__fastcall *function_)(A1); |
}; |
// __stdcall Function: Arity 2. |
-template <typename R, typename X1, typename X2> |
-struct FunctionTraits<R(__stdcall *)(X1, X2)> { |
- typedef R (*NormalizedSig)(X1, X2); |
- typedef false_type IsMethod; |
- |
- typedef R Return; |
- |
- // Target type for each bound parameter. |
- typedef X1 B1; |
- typedef X2 B2; |
+template <typename R, typename A1, typename A2> |
+class RunnableAdapter<R(__stdcall *)(A1, A2)> { |
+ public: |
+ typedef R (RunType)(A1, A2); |
+ |
+ explicit RunnableAdapter(R(__stdcall *function)(A1, A2)) |
+ : function_(function) { |
+ } |
+ |
+ R Run(typename CallbackParamTraits<A1>::ForwardType a1, |
+ typename CallbackParamTraits<A2>::ForwardType a2) { |
+ return function_(a1, a2); |
+ } |
+ |
+ private: |
+ R (__stdcall *function_)(A1, A2); |
}; |
// __fastcall Function: Arity 2. |
-template <typename R, typename X1, typename X2> |
-struct FunctionTraits<R(__fastcall *)(X1, X2)> { |
- typedef R (*NormalizedSig)(X1, X2); |
- typedef false_type IsMethod; |
- |
- typedef R Return; |
- |
- // Target type for each bound parameter. |
- typedef X1 B1; |
- typedef X2 B2; |
+template <typename R, typename A1, typename A2> |
+class RunnableAdapter<R(__fastcall *)(A1, A2)> { |
+ public: |
+ typedef R (RunType)(A1, A2); |
+ |
+ explicit RunnableAdapter(R(__fastcall *function)(A1, A2)) |
+ : function_(function) { |
+ } |
+ |
+ R Run(typename CallbackParamTraits<A1>::ForwardType a1, |
+ typename CallbackParamTraits<A2>::ForwardType a2) { |
+ return function_(a1, a2); |
+ } |
+ |
+ private: |
+ R (__fastcall *function_)(A1, A2); |
}; |
// __stdcall Function: Arity 3. |
-template <typename R, typename X1, typename X2, typename X3> |
-struct FunctionTraits<R(__stdcall *)(X1, X2, X3)> { |
- typedef R (*NormalizedSig)(X1, X2, X3); |
- typedef false_type IsMethod; |
- |
- typedef R Return; |
- |
- // Target type for each bound parameter. |
- typedef X1 B1; |
- typedef X2 B2; |
- typedef X3 B3; |
+template <typename R, typename A1, typename A2, typename A3> |
+class RunnableAdapter<R(__stdcall *)(A1, A2, A3)> { |
+ public: |
+ typedef R (RunType)(A1, A2, A3); |
+ |
+ explicit RunnableAdapter(R(__stdcall *function)(A1, A2, A3)) |
+ : function_(function) { |
+ } |
+ |
+ R Run(typename CallbackParamTraits<A1>::ForwardType a1, |
+ typename CallbackParamTraits<A2>::ForwardType a2, |
+ typename CallbackParamTraits<A3>::ForwardType a3) { |
+ return function_(a1, a2, a3); |
+ } |
+ |
+ private: |
+ R (__stdcall *function_)(A1, A2, A3); |
}; |
// __fastcall Function: Arity 3. |
-template <typename R, typename X1, typename X2, typename X3> |
-struct FunctionTraits<R(__fastcall *)(X1, X2, X3)> { |
- typedef R (*NormalizedSig)(X1, X2, X3); |
- typedef false_type IsMethod; |
- |
- typedef R Return; |
- |
- // Target type for each bound parameter. |
- typedef X1 B1; |
- typedef X2 B2; |
- typedef X3 B3; |
+template <typename R, typename A1, typename A2, typename A3> |
+class RunnableAdapter<R(__fastcall *)(A1, A2, A3)> { |
+ public: |
+ typedef R (RunType)(A1, A2, A3); |
+ |
+ explicit RunnableAdapter(R(__fastcall *function)(A1, A2, A3)) |
+ : function_(function) { |
+ } |
+ |
+ R Run(typename CallbackParamTraits<A1>::ForwardType a1, |
+ typename CallbackParamTraits<A2>::ForwardType a2, |
+ typename CallbackParamTraits<A3>::ForwardType a3) { |
+ return function_(a1, a2, a3); |
+ } |
+ |
+ private: |
+ R (__fastcall *function_)(A1, A2, A3); |
}; |
// __stdcall Function: Arity 4. |
-template <typename R, typename X1, typename X2, typename X3, typename X4> |
-struct FunctionTraits<R(__stdcall *)(X1, X2, X3, X4)> { |
- typedef R (*NormalizedSig)(X1, X2, X3, X4); |
- typedef false_type IsMethod; |
- |
- typedef R Return; |
- |
- // Target type for each bound parameter. |
- typedef X1 B1; |
- typedef X2 B2; |
- typedef X3 B3; |
- typedef X4 B4; |
+template <typename R, typename A1, typename A2, typename A3, typename A4> |
+class RunnableAdapter<R(__stdcall *)(A1, A2, A3, A4)> { |
+ public: |
+ typedef R (RunType)(A1, A2, A3, A4); |
+ |
+ explicit RunnableAdapter(R(__stdcall *function)(A1, A2, A3, A4)) |
+ : function_(function) { |
+ } |
+ |
+ R Run(typename CallbackParamTraits<A1>::ForwardType a1, |
+ typename CallbackParamTraits<A2>::ForwardType a2, |
+ typename CallbackParamTraits<A3>::ForwardType a3, |
+ typename CallbackParamTraits<A4>::ForwardType a4) { |
+ return function_(a1, a2, a3, a4); |
+ } |
+ |
+ private: |
+ R (__stdcall *function_)(A1, A2, A3, A4); |
}; |
// __fastcall Function: Arity 4. |
-template <typename R, typename X1, typename X2, typename X3, typename X4> |
-struct FunctionTraits<R(__fastcall *)(X1, X2, X3, X4)> { |
- typedef R (*NormalizedSig)(X1, X2, X3, X4); |
- typedef false_type IsMethod; |
- |
- typedef R Return; |
- |
- // Target type for each bound parameter. |
- typedef X1 B1; |
- typedef X2 B2; |
- typedef X3 B3; |
- typedef X4 B4; |
+template <typename R, typename A1, typename A2, typename A3, typename A4> |
+class RunnableAdapter<R(__fastcall *)(A1, A2, A3, A4)> { |
+ public: |
+ typedef R (RunType)(A1, A2, A3, A4); |
+ |
+ explicit RunnableAdapter(R(__fastcall *function)(A1, A2, A3, A4)) |
+ : function_(function) { |
+ } |
+ |
+ R Run(typename CallbackParamTraits<A1>::ForwardType a1, |
+ typename CallbackParamTraits<A2>::ForwardType a2, |
+ typename CallbackParamTraits<A3>::ForwardType a3, |
+ typename CallbackParamTraits<A4>::ForwardType a4) { |
+ return function_(a1, a2, a3, a4); |
+ } |
+ |
+ private: |
+ R (__fastcall *function_)(A1, A2, A3, A4); |
}; |
// __stdcall Function: Arity 5. |
-template <typename R, typename X1, typename X2, typename X3, typename X4, |
- typename X5> |
-struct FunctionTraits<R(__stdcall *)(X1, X2, X3, X4, X5)> { |
- typedef R (*NormalizedSig)(X1, X2, X3, X4, X5); |
- typedef false_type IsMethod; |
- |
- typedef R Return; |
- |
- // Target type for each bound parameter. |
- typedef X1 B1; |
- typedef X2 B2; |
- typedef X3 B3; |
- typedef X4 B4; |
- typedef X5 B5; |
+template <typename R, typename A1, typename A2, typename A3, typename A4, |
+ typename A5> |
+class RunnableAdapter<R(__stdcall *)(A1, A2, A3, A4, A5)> { |
+ public: |
+ typedef R (RunType)(A1, A2, A3, A4, A5); |
+ |
+ explicit RunnableAdapter(R(__stdcall *function)(A1, A2, A3, A4, A5)) |
+ : function_(function) { |
+ } |
+ |
+ R Run(typename CallbackParamTraits<A1>::ForwardType a1, |
+ typename CallbackParamTraits<A2>::ForwardType a2, |
+ typename CallbackParamTraits<A3>::ForwardType a3, |
+ typename CallbackParamTraits<A4>::ForwardType a4, |
+ typename CallbackParamTraits<A5>::ForwardType a5) { |
+ return function_(a1, a2, a3, a4, a5); |
+ } |
+ |
+ private: |
+ R (__stdcall *function_)(A1, A2, A3, A4, A5); |
}; |
// __fastcall Function: Arity 5. |
-template <typename R, typename X1, typename X2, typename X3, typename X4, |
- typename X5> |
-struct FunctionTraits<R(__fastcall *)(X1, X2, X3, X4, X5)> { |
- typedef R (*NormalizedSig)(X1, X2, X3, X4, X5); |
- typedef false_type IsMethod; |
- |
- typedef R Return; |
- |
- // Target type for each bound parameter. |
- typedef X1 B1; |
- typedef X2 B2; |
- typedef X3 B3; |
- typedef X4 B4; |
- typedef X5 B5; |
+template <typename R, typename A1, typename A2, typename A3, typename A4, |
+ typename A5> |
+class RunnableAdapter<R(__fastcall *)(A1, A2, A3, A4, A5)> { |
+ public: |
+ typedef R (RunType)(A1, A2, A3, A4, A5); |
+ |
+ explicit RunnableAdapter(R(__fastcall *function)(A1, A2, A3, A4, A5)) |
+ : function_(function) { |
+ } |
+ |
+ R Run(typename CallbackParamTraits<A1>::ForwardType a1, |
+ typename CallbackParamTraits<A2>::ForwardType a2, |
+ typename CallbackParamTraits<A3>::ForwardType a3, |
+ typename CallbackParamTraits<A4>::ForwardType a4, |
+ typename CallbackParamTraits<A5>::ForwardType a5) { |
+ return function_(a1, a2, a3, a4, a5); |
+ } |
+ |
+ private: |
+ R (__fastcall *function_)(A1, A2, A3, A4, A5); |
}; |
// __stdcall Function: Arity 6. |
-template <typename R, typename X1, typename X2, typename X3, typename X4, |
- typename X5, typename X6> |
-struct FunctionTraits<R(__stdcall *)(X1, X2, X3, X4, X5, X6)> { |
- typedef R (*NormalizedSig)(X1, X2, X3, X4, X5, X6); |
- typedef false_type IsMethod; |
- |
- typedef R Return; |
- |
- // Target type for each bound parameter. |
- typedef X1 B1; |
- typedef X2 B2; |
- typedef X3 B3; |
- typedef X4 B4; |
- typedef X5 B5; |
- typedef X6 B6; |
+template <typename R, typename A1, typename A2, typename A3, typename A4, |
+ typename A5, typename A6> |
+class RunnableAdapter<R(__stdcall *)(A1, A2, A3, A4, A5, A6)> { |
+ public: |
+ typedef R (RunType)(A1, A2, A3, A4, A5, A6); |
+ |
+ explicit RunnableAdapter(R(__stdcall *function)(A1, A2, A3, A4, A5, A6)) |
+ : function_(function) { |
+ } |
+ |
+ R Run(typename CallbackParamTraits<A1>::ForwardType a1, |
+ typename CallbackParamTraits<A2>::ForwardType a2, |
+ typename CallbackParamTraits<A3>::ForwardType a3, |
+ typename CallbackParamTraits<A4>::ForwardType a4, |
+ typename CallbackParamTraits<A5>::ForwardType a5, |
+ typename CallbackParamTraits<A6>::ForwardType a6) { |
+ return function_(a1, a2, a3, a4, a5, a6); |
+ } |
+ |
+ private: |
+ R (__stdcall *function_)(A1, A2, A3, A4, A5, A6); |
}; |
// __fastcall Function: Arity 6. |
-template <typename R, typename X1, typename X2, typename X3, typename X4, |
- typename X5, typename X6> |
-struct FunctionTraits<R(__fastcall *)(X1, X2, X3, X4, X5, X6)> { |
- typedef R (*NormalizedSig)(X1, X2, X3, X4, X5, X6); |
- typedef false_type IsMethod; |
- |
- typedef R Return; |
- |
- // Target type for each bound parameter. |
- typedef X1 B1; |
- typedef X2 B2; |
- typedef X3 B3; |
- typedef X4 B4; |
- typedef X5 B5; |
- typedef X6 B6; |
+template <typename R, typename A1, typename A2, typename A3, typename A4, |
+ typename A5, typename A6> |
+class RunnableAdapter<R(__fastcall *)(A1, A2, A3, A4, A5, A6)> { |
+ public: |
+ typedef R (RunType)(A1, A2, A3, A4, A5, A6); |
+ |
+ explicit RunnableAdapter(R(__fastcall *function)(A1, A2, A3, A4, A5, A6)) |
+ : function_(function) { |
+ } |
+ |
+ R Run(typename CallbackParamTraits<A1>::ForwardType a1, |
+ typename CallbackParamTraits<A2>::ForwardType a2, |
+ typename CallbackParamTraits<A3>::ForwardType a3, |
+ typename CallbackParamTraits<A4>::ForwardType a4, |
+ typename CallbackParamTraits<A5>::ForwardType a5, |
+ typename CallbackParamTraits<A6>::ForwardType a6) { |
+ return function_(a1, a2, a3, a4, a5, a6); |
+ } |
+ |
+ private: |
+ R (__fastcall *function_)(A1, A2, A3, A4, A5, A6); |
}; |
} // namespace internal |