Index: base/bind_internal.h |
diff --git a/base/bind_internal.h b/base/bind_internal.h |
index ae17ebf86c1a6c17f3a6cb5108a10d690ad4be61..2142797053e48de1551963b0986b034cf44d07f5 100644 |
--- a/base/bind_internal.h |
+++ b/base/bind_internal.h |
@@ -51,18 +51,15 @@ namespace internal { |
// Types: |
// RunnableAdapter<> -- Wraps the various "function" pointer types into an |
// object that adheres to the Runnable interface. |
-// There are |3*ARITY| RunnableAdapter types. |
// FunctionTraits<> -- Type traits that unwrap a function signature into a |
// a set of easier to use typedefs. Used mainly for |
// compile time asserts. |
// There are |ARITY| FunctionTraits types. |
// ForceVoidReturn<> -- Helper class for translating function signatures to |
// equivalent forms with a "void" return type. |
-// There are |ARITY| ForceVoidReturn types. |
// FunctorTraits<> -- Type traits used determine the correct RunType and |
// RunnableType for a Functor. This is where function |
// signature adapters are applied. |
-// There are |ARITY| ForceVoidReturn types. |
// MakeRunnable<> -- Takes a Functor and returns an object in the Runnable |
// type class that represents the underlying Functor. |
// There are |O(1)| MakeRunnable types. |
@@ -71,7 +68,6 @@ namespace internal { |
// and for ignoring return values. This is separate from |
// Invoker to avoid creating multiple version of Invoker<> |
// which grows at O(n^2) with the arity. |
-// There are |k*ARITY| InvokeHelper types. |
// Invoker<> -- Unwraps the curried parameters and executes the Runnable. |
// There are |(ARITY^2 + ARITY)/2| Invoketypes. |
// BindState<> -- Stores the curried parameters, and is the main entry point |
@@ -101,550 +97,64 @@ namespace internal { |
template <typename Functor> |
class RunnableAdapter; |
-// Function: Arity 0. |
-template <typename R> |
-class RunnableAdapter<R(*)()> { |
- public: |
- typedef R (RunType)(); |
- |
- explicit RunnableAdapter(R(*function)()) |
- : function_(function) { |
- } |
- |
- R Run() { |
- return function_(); |
- } |
- |
- private: |
- R (*function_)(); |
-}; |
- |
-// Method: Arity 0. |
-template <typename R, typename T> |
-class RunnableAdapter<R(T::*)()> { |
- public: |
- typedef R (RunType)(T*); |
- typedef true_type IsMethod; |
- |
- explicit RunnableAdapter(R(T::*method)()) |
- : method_(method) { |
- } |
- |
- R Run(T* object) { |
- return (object->*method_)(); |
- } |
- |
- private: |
- R (T::*method_)(); |
-}; |
- |
-// Const Method: Arity 0. |
-template <typename R, typename T> |
-class RunnableAdapter<R(T::*)() const> { |
- public: |
- typedef R (RunType)(const T*); |
- typedef true_type IsMethod; |
- |
- explicit RunnableAdapter(R(T::*method)() const) |
- : method_(method) { |
- } |
- |
- R Run(const T* object) { |
- return (object->*method_)(); |
- } |
- |
- private: |
- R (T::*method_)() const; |
-}; |
- |
-// Function: Arity 1. |
-template <typename R, typename A1> |
-class RunnableAdapter<R(*)(A1)> { |
- public: |
- typedef R (RunType)(A1); |
- |
- explicit RunnableAdapter(R(*function)(A1)) |
- : function_(function) { |
- } |
- |
- R Run(typename CallbackParamTraits<A1>::ForwardType a1) { |
- return function_(CallbackForward(a1)); |
- } |
- |
- private: |
- R (*function_)(A1); |
-}; |
- |
-// Method: Arity 1. |
-template <typename R, typename T, typename A1> |
-class RunnableAdapter<R(T::*)(A1)> { |
+// Function. |
+template <typename R, typename... Args> |
+class RunnableAdapter<R(*)(Args...)> { |
public: |
- typedef R (RunType)(T*, A1); |
- typedef true_type IsMethod; |
- |
- explicit RunnableAdapter(R(T::*method)(A1)) |
- : method_(method) { |
- } |
- |
- R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1) { |
- return (object->*method_)(CallbackForward(a1)); |
- } |
- |
- private: |
- R (T::*method_)(A1); |
-}; |
- |
-// Const Method: Arity 1. |
-template <typename R, typename T, typename A1> |
-class RunnableAdapter<R(T::*)(A1) const> { |
- public: |
- typedef R (RunType)(const T*, A1); |
- typedef true_type IsMethod; |
- |
- explicit RunnableAdapter(R(T::*method)(A1) const) |
- : method_(method) { |
- } |
- |
- R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1) { |
- return (object->*method_)(CallbackForward(a1)); |
- } |
- |
- private: |
- R (T::*method_)(A1) const; |
-}; |
- |
-// Function: Arity 2. |
-template <typename R, typename A1, typename A2> |
-class RunnableAdapter<R(*)(A1, A2)> { |
- public: |
- typedef R (RunType)(A1, A2); |
+ typedef R (RunType)(Args...); |
- explicit RunnableAdapter(R(*function)(A1, A2)) |
+ explicit RunnableAdapter(R(*function)(Args...)) |
: function_(function) { |
} |
- R Run(typename CallbackParamTraits<A1>::ForwardType a1, |
- typename CallbackParamTraits<A2>::ForwardType a2) { |
- return function_(CallbackForward(a1), CallbackForward(a2)); |
+ R Run(typename CallbackParamTraits<Args>::ForwardType... args) { |
+ return function_(CallbackForward(args)...); |
} |
private: |
- R (*function_)(A1, A2); |
+ R (*function_)(Args...); |
}; |
-// Method: Arity 2. |
-template <typename R, typename T, typename A1, typename A2> |
-class RunnableAdapter<R(T::*)(A1, A2)> { |
+// Method. |
+template <typename R, typename T, typename... Args> |
+class RunnableAdapter<R(T::*)(Args...)> { |
public: |
- typedef R (RunType)(T*, A1, A2); |
+ typedef R (RunType)(T*, Args...); |
typedef true_type IsMethod; |
- explicit RunnableAdapter(R(T::*method)(A1, A2)) |
+ explicit RunnableAdapter(R(T::*method)(Args...)) |
: method_(method) { |
} |
- R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1, |
- typename CallbackParamTraits<A2>::ForwardType a2) { |
- return (object->*method_)(CallbackForward(a1), CallbackForward(a2)); |
+ R Run(T* object, typename CallbackParamTraits<Args>::ForwardType... args) { |
+ return (object->*method_)(CallbackForward(args)...); |
} |
private: |
- R (T::*method_)(A1, A2); |
+ R (T::*method_)(Args...); |
}; |
-// Const Method: Arity 2. |
-template <typename R, typename T, typename A1, typename A2> |
-class RunnableAdapter<R(T::*)(A1, A2) const> { |
+// Const Method. |
+template <typename R, typename T, typename... Args> |
+class RunnableAdapter<R(T::*)(Args...) const> { |
public: |
- typedef R (RunType)(const T*, A1, A2); |
+ typedef R (RunType)(const T*, Args...); |
typedef true_type IsMethod; |
- explicit RunnableAdapter(R(T::*method)(A1, A2) const) |
+ explicit RunnableAdapter(R(T::*method)(Args...) const) |
: method_(method) { |
} |
- R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1, |
- typename CallbackParamTraits<A2>::ForwardType a2) { |
- return (object->*method_)(CallbackForward(a1), CallbackForward(a2)); |
- } |
- |
- private: |
- R (T::*method_)(A1, A2) const; |
-}; |
- |
-// Function: Arity 3. |
-template <typename R, typename A1, typename A2, typename A3> |
-class RunnableAdapter<R(*)(A1, A2, A3)> { |
- public: |
- typedef R (RunType)(A1, A2, A3); |
- |
- explicit RunnableAdapter(R(*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_(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3)); |
+ R Run(const T* object, |
+ typename CallbackParamTraits<Args>::ForwardType... args) { |
+ return (object->*method_)(CallbackForward(args)...); |
} |
private: |
- R (*function_)(A1, A2, A3); |
+ R (T::*method_)(Args...) const; |
}; |
-// Method: Arity 3. |
-template <typename R, typename T, typename A1, typename A2, typename A3> |
-class RunnableAdapter<R(T::*)(A1, A2, A3)> { |
- public: |
- typedef R (RunType)(T*, A1, A2, A3); |
- typedef true_type IsMethod; |
- |
- explicit RunnableAdapter(R(T::*method)(A1, A2, A3)) |
- : method_(method) { |
- } |
- |
- R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1, |
- typename CallbackParamTraits<A2>::ForwardType a2, |
- typename CallbackParamTraits<A3>::ForwardType a3) { |
- return (object->*method_)(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3)); |
- } |
- |
- private: |
- R (T::*method_)(A1, A2, A3); |
-}; |
- |
-// Const Method: Arity 3. |
-template <typename R, typename T, typename A1, typename A2, typename A3> |
-class RunnableAdapter<R(T::*)(A1, A2, A3) const> { |
- public: |
- typedef R (RunType)(const T*, A1, A2, A3); |
- typedef true_type IsMethod; |
- |
- explicit RunnableAdapter(R(T::*method)(A1, A2, A3) const) |
- : method_(method) { |
- } |
- |
- R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1, |
- typename CallbackParamTraits<A2>::ForwardType a2, |
- typename CallbackParamTraits<A3>::ForwardType a3) { |
- return (object->*method_)(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3)); |
- } |
- |
- private: |
- R (T::*method_)(A1, A2, A3) const; |
-}; |
- |
-// Function: Arity 4. |
-template <typename R, typename A1, typename A2, typename A3, typename A4> |
-class RunnableAdapter<R(*)(A1, A2, A3, A4)> { |
- public: |
- typedef R (RunType)(A1, A2, A3, A4); |
- |
- explicit RunnableAdapter(R(*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_(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4)); |
- } |
- |
- private: |
- R (*function_)(A1, A2, A3, A4); |
-}; |
- |
-// Method: Arity 4. |
-template <typename R, typename T, typename A1, typename A2, typename A3, |
- typename A4> |
-class RunnableAdapter<R(T::*)(A1, A2, A3, A4)> { |
- public: |
- typedef R (RunType)(T*, A1, A2, A3, A4); |
- typedef true_type IsMethod; |
- |
- explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4)) |
- : method_(method) { |
- } |
- |
- R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1, |
- typename CallbackParamTraits<A2>::ForwardType a2, |
- typename CallbackParamTraits<A3>::ForwardType a3, |
- typename CallbackParamTraits<A4>::ForwardType a4) { |
- return (object->*method_)(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4)); |
- } |
- |
- private: |
- R (T::*method_)(A1, A2, A3, A4); |
-}; |
- |
-// Const Method: Arity 4. |
-template <typename R, typename T, typename A1, typename A2, typename A3, |
- typename A4> |
-class RunnableAdapter<R(T::*)(A1, A2, A3, A4) const> { |
- public: |
- typedef R (RunType)(const T*, A1, A2, A3, A4); |
- typedef true_type IsMethod; |
- |
- explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4) const) |
- : method_(method) { |
- } |
- |
- R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1, |
- typename CallbackParamTraits<A2>::ForwardType a2, |
- typename CallbackParamTraits<A3>::ForwardType a3, |
- typename CallbackParamTraits<A4>::ForwardType a4) { |
- return (object->*method_)(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4)); |
- } |
- |
- private: |
- R (T::*method_)(A1, A2, A3, A4) const; |
-}; |
- |
-// Function: Arity 5. |
-template <typename R, typename A1, typename A2, typename A3, typename A4, |
- typename A5> |
-class RunnableAdapter<R(*)(A1, A2, A3, A4, A5)> { |
- public: |
- typedef R (RunType)(A1, A2, A3, A4, A5); |
- |
- explicit RunnableAdapter(R(*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_(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4), CallbackForward(a5)); |
- } |
- |
- private: |
- R (*function_)(A1, A2, A3, A4, A5); |
-}; |
- |
-// Method: Arity 5. |
-template <typename R, typename T, typename A1, typename A2, typename A3, |
- typename A4, typename A5> |
-class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5)> { |
- public: |
- typedef R (RunType)(T*, A1, A2, A3, A4, A5); |
- typedef true_type IsMethod; |
- |
- explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5)) |
- : method_(method) { |
- } |
- |
- R Run(T* object, 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 (object->*method_)(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4), CallbackForward(a5)); |
- } |
- |
- private: |
- R (T::*method_)(A1, A2, A3, A4, A5); |
-}; |
- |
-// Const Method: Arity 5. |
-template <typename R, typename T, typename A1, typename A2, typename A3, |
- typename A4, typename A5> |
-class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5) const> { |
- public: |
- typedef R (RunType)(const T*, A1, A2, A3, A4, A5); |
- typedef true_type IsMethod; |
- |
- explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5) const) |
- : method_(method) { |
- } |
- |
- R Run(const T* object, 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 (object->*method_)(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4), CallbackForward(a5)); |
- } |
- |
- private: |
- R (T::*method_)(A1, A2, A3, A4, A5) const; |
-}; |
- |
-// Function: Arity 6. |
-template <typename R, typename A1, typename A2, typename A3, typename A4, |
- typename A5, typename A6> |
-class RunnableAdapter<R(*)(A1, A2, A3, A4, A5, A6)> { |
- public: |
- typedef R (RunType)(A1, A2, A3, A4, A5, A6); |
- |
- explicit RunnableAdapter(R(*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_(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), |
- CallbackForward(a6)); |
- } |
- |
- private: |
- R (*function_)(A1, A2, A3, A4, A5, A6); |
-}; |
- |
-// Method: Arity 6. |
-template <typename R, typename T, typename A1, typename A2, typename A3, |
- typename A4, typename A5, typename A6> |
-class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6)> { |
- public: |
- typedef R (RunType)(T*, A1, A2, A3, A4, A5, A6); |
- typedef true_type IsMethod; |
- |
- explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6)) |
- : method_(method) { |
- } |
- |
- R Run(T* object, 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 (object->*method_)(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), |
- CallbackForward(a6)); |
- } |
- |
- private: |
- R (T::*method_)(A1, A2, A3, A4, A5, A6); |
-}; |
- |
-// Const Method: Arity 6. |
-template <typename R, typename T, typename A1, typename A2, typename A3, |
- typename A4, typename A5, typename A6> |
-class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6) const> { |
- public: |
- typedef R (RunType)(const T*, A1, A2, A3, A4, A5, A6); |
- typedef true_type IsMethod; |
- |
- explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6) const) |
- : method_(method) { |
- } |
- |
- R Run(const T* object, 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 (object->*method_)(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), |
- CallbackForward(a6)); |
- } |
- |
- private: |
- R (T::*method_)(A1, A2, A3, A4, A5, A6) const; |
-}; |
- |
-// Function: Arity 7. |
-template <typename R, typename A1, typename A2, typename A3, typename A4, |
- typename A5, typename A6, typename A7> |
-class RunnableAdapter<R(*)(A1, A2, A3, A4, A5, A6, A7)> { |
- public: |
- typedef R (RunType)(A1, A2, A3, A4, A5, A6, A7); |
- |
- explicit RunnableAdapter(R(*function)(A1, A2, A3, A4, A5, A6, A7)) |
- : 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, |
- typename CallbackParamTraits<A7>::ForwardType a7) { |
- return function_(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), |
- CallbackForward(a6), CallbackForward(a7)); |
- } |
- |
- private: |
- R (*function_)(A1, A2, A3, A4, A5, A6, A7); |
-}; |
- |
-// Method: Arity 7. |
-template <typename R, typename T, typename A1, typename A2, typename A3, |
- typename A4, typename A5, typename A6, typename A7> |
-class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6, A7)> { |
- public: |
- typedef R (RunType)(T*, A1, A2, A3, A4, A5, A6, A7); |
- typedef true_type IsMethod; |
- |
- explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6, A7)) |
- : method_(method) { |
- } |
- |
- R Run(T* object, 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, |
- typename CallbackParamTraits<A7>::ForwardType a7) { |
- return (object->*method_)(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), |
- CallbackForward(a6), CallbackForward(a7)); |
- } |
- |
- private: |
- R (T::*method_)(A1, A2, A3, A4, A5, A6, A7); |
-}; |
- |
-// Const Method: Arity 7. |
-template <typename R, typename T, typename A1, typename A2, typename A3, |
- typename A4, typename A5, typename A6, typename A7> |
-class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6, A7) const> { |
- public: |
- typedef R (RunType)(const T*, A1, A2, A3, A4, A5, A6, A7); |
- typedef true_type IsMethod; |
- |
- explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6, A7) const) |
- : method_(method) { |
- } |
- |
- R Run(const T* object, 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, |
- typename CallbackParamTraits<A7>::ForwardType a7) { |
- return (object->*method_)(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), |
- CallbackForward(a6), CallbackForward(a7)); |
- } |
- |
- private: |
- R (T::*method_)(A1, A2, A3, A4, A5, A6, A7) const; |
-}; |
- |
- |
+// TODO(tzik): Remove FunctionTraits after we finish removing bind.pump. |
// FunctionTraits<> |
// |
// Breaks a function signature apart into typedefs for easier introspection. |
@@ -729,47 +239,9 @@ struct FunctionTraits<R(A1, A2, A3, A4, A5, A6, A7)> { |
template <typename Sig> |
struct ForceVoidReturn; |
-template <typename R> |
-struct ForceVoidReturn<R()> { |
- typedef void(RunType)(); |
-}; |
- |
-template <typename R, typename A1> |
-struct ForceVoidReturn<R(A1)> { |
- typedef void(RunType)(A1); |
-}; |
- |
-template <typename R, typename A1, typename A2> |
-struct ForceVoidReturn<R(A1, A2)> { |
- typedef void(RunType)(A1, A2); |
-}; |
- |
-template <typename R, typename A1, typename A2, typename A3> |
-struct ForceVoidReturn<R(A1, A2, A3)> { |
- typedef void(RunType)(A1, A2, A3); |
-}; |
- |
-template <typename R, typename A1, typename A2, typename A3, typename A4> |
-struct ForceVoidReturn<R(A1, A2, A3, A4)> { |
- typedef void(RunType)(A1, A2, A3, A4); |
-}; |
- |
-template <typename R, typename A1, typename A2, typename A3, typename A4, |
- typename A5> |
-struct ForceVoidReturn<R(A1, A2, A3, A4, A5)> { |
- typedef void(RunType)(A1, A2, A3, A4, A5); |
-}; |
- |
-template <typename R, typename A1, typename A2, typename A3, typename A4, |
- typename A5, typename A6> |
-struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6)> { |
- typedef void(RunType)(A1, A2, A3, A4, A5, A6); |
-}; |
- |
-template <typename R, typename A1, typename A2, typename A3, typename A4, |
- typename A5, typename A6, typename A7> |
-struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6, A7)> { |
- typedef void(RunType)(A1, A2, A3, A4, A5, A6, A7); |
+template <typename R, typename... Args> |
+struct ForceVoidReturn<R(Args...)> { |
+ typedef void(RunType)(Args...); |
}; |
@@ -840,246 +312,28 @@ template <bool IsWeakCall, typename ReturnType, typename Runnable, |
typename ArgsType> |
struct InvokeHelper; |
-template <typename ReturnType, typename Runnable> |
-struct InvokeHelper<false, ReturnType, Runnable, |
- void()> { |
- static ReturnType MakeItSo(Runnable runnable) { |
- return runnable.Run(); |
- } |
-}; |
- |
-template <typename Runnable> |
-struct InvokeHelper<false, void, Runnable, |
- void()> { |
- static void MakeItSo(Runnable runnable) { |
- runnable.Run(); |
- } |
-}; |
- |
-template <typename ReturnType, typename Runnable,typename A1> |
-struct InvokeHelper<false, ReturnType, Runnable, |
- void(A1)> { |
- static ReturnType MakeItSo(Runnable runnable, A1 a1) { |
- return runnable.Run(CallbackForward(a1)); |
- } |
-}; |
- |
-template <typename Runnable,typename A1> |
-struct InvokeHelper<false, void, Runnable, |
- void(A1)> { |
- static void MakeItSo(Runnable runnable, A1 a1) { |
- runnable.Run(CallbackForward(a1)); |
- } |
-}; |
- |
-template <typename Runnable, typename BoundWeakPtr> |
-struct InvokeHelper<true, void, Runnable, |
- void(BoundWeakPtr)> { |
- static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr) { |
- if (!weak_ptr.get()) { |
- return; |
- } |
- runnable.Run(weak_ptr.get()); |
- } |
-}; |
- |
-template <typename ReturnType, typename Runnable,typename A1, typename A2> |
-struct InvokeHelper<false, ReturnType, Runnable, |
- void(A1, A2)> { |
- static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2) { |
- return runnable.Run(CallbackForward(a1), CallbackForward(a2)); |
- } |
-}; |
- |
-template <typename Runnable,typename A1, typename A2> |
-struct InvokeHelper<false, void, Runnable, |
- void(A1, A2)> { |
- static void MakeItSo(Runnable runnable, A1 a1, A2 a2) { |
- runnable.Run(CallbackForward(a1), CallbackForward(a2)); |
- } |
-}; |
- |
-template <typename Runnable, typename BoundWeakPtr, typename A2> |
-struct InvokeHelper<true, void, Runnable, |
- void(BoundWeakPtr, A2)> { |
- static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2) { |
- if (!weak_ptr.get()) { |
- return; |
- } |
- runnable.Run(weak_ptr.get(), CallbackForward(a2)); |
- } |
-}; |
- |
-template <typename ReturnType, typename Runnable,typename A1, typename A2, |
- typename A3> |
+template <typename ReturnType, typename Runnable, typename... Args> |
struct InvokeHelper<false, ReturnType, Runnable, |
- void(A1, A2, A3)> { |
- static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) { |
- return runnable.Run(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3)); |
- } |
-}; |
- |
-template <typename Runnable,typename A1, typename A2, typename A3> |
-struct InvokeHelper<false, void, Runnable, |
- void(A1, A2, A3)> { |
- static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) { |
- runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3)); |
+ void(Args...)> { |
+ static ReturnType MakeItSo(Runnable runnable, Args... args) { |
+ return runnable.Run(CallbackForward(args)...); |
} |
}; |
-template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3> |
-struct InvokeHelper<true, void, Runnable, |
- void(BoundWeakPtr, A2, A3)> { |
- static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3) { |
- if (!weak_ptr.get()) { |
- return; |
- } |
- runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3)); |
- } |
-}; |
- |
-template <typename ReturnType, typename Runnable,typename A1, typename A2, |
- typename A3, typename A4> |
-struct InvokeHelper<false, ReturnType, Runnable, |
- void(A1, A2, A3, A4)> { |
- static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) { |
- return runnable.Run(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4)); |
- } |
-}; |
- |
-template <typename Runnable,typename A1, typename A2, typename A3, typename A4> |
-struct InvokeHelper<false, void, Runnable, |
- void(A1, A2, A3, A4)> { |
- static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) { |
- runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3), |
- CallbackForward(a4)); |
- } |
-}; |
- |
-template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3, |
- typename A4> |
-struct InvokeHelper<true, void, Runnable, |
- void(BoundWeakPtr, A2, A3, A4)> { |
- static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3, |
- A4 a4) { |
- if (!weak_ptr.get()) { |
- return; |
- } |
- runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3), |
- CallbackForward(a4)); |
- } |
-}; |
- |
-template <typename ReturnType, typename Runnable,typename A1, typename A2, |
- typename A3, typename A4, typename A5> |
-struct InvokeHelper<false, ReturnType, Runnable, |
- void(A1, A2, A3, A4, A5)> { |
- static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, |
- A5 a5) { |
- return runnable.Run(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4), CallbackForward(a5)); |
- } |
-}; |
- |
-template <typename Runnable,typename A1, typename A2, typename A3, typename A4, |
- typename A5> |
-struct InvokeHelper<false, void, Runnable, |
- void(A1, A2, A3, A4, A5)> { |
- static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { |
- runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3), |
- CallbackForward(a4), CallbackForward(a5)); |
- } |
-}; |
- |
-template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3, |
- typename A4, typename A5> |
-struct InvokeHelper<true, void, Runnable, |
- void(BoundWeakPtr, A2, A3, A4, A5)> { |
- static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3, |
- A4 a4, A5 a5) { |
- if (!weak_ptr.get()) { |
- return; |
- } |
- runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3), |
- CallbackForward(a4), CallbackForward(a5)); |
- } |
-}; |
- |
-template <typename ReturnType, typename Runnable,typename A1, typename A2, |
- typename A3, typename A4, typename A5, typename A6> |
-struct InvokeHelper<false, ReturnType, Runnable, |
- void(A1, A2, A3, A4, A5, A6)> { |
- static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, |
- A5 a5, A6 a6) { |
- return runnable.Run(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), |
- CallbackForward(a6)); |
- } |
-}; |
- |
-template <typename Runnable,typename A1, typename A2, typename A3, typename A4, |
- typename A5, typename A6> |
-struct InvokeHelper<false, void, Runnable, |
- void(A1, A2, A3, A4, A5, A6)> { |
- static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, |
- A6 a6) { |
- runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3), |
- CallbackForward(a4), CallbackForward(a5), CallbackForward(a6)); |
- } |
-}; |
- |
-template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3, |
- typename A4, typename A5, typename A6> |
-struct InvokeHelper<true, void, Runnable, |
- void(BoundWeakPtr, A2, A3, A4, A5, A6)> { |
- static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3, |
- A4 a4, A5 a5, A6 a6) { |
- if (!weak_ptr.get()) { |
- return; |
- } |
- runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3), |
- CallbackForward(a4), CallbackForward(a5), CallbackForward(a6)); |
- } |
-}; |
- |
-template <typename ReturnType, typename Runnable,typename A1, typename A2, |
- typename A3, typename A4, typename A5, typename A6, typename A7> |
-struct InvokeHelper<false, ReturnType, Runnable, |
- void(A1, A2, A3, A4, A5, A6, A7)> { |
- static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, |
- A5 a5, A6 a6, A7 a7) { |
- return runnable.Run(CallbackForward(a1), CallbackForward(a2), |
- CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), |
- CallbackForward(a6), CallbackForward(a7)); |
- } |
-}; |
- |
-template <typename Runnable,typename A1, typename A2, typename A3, typename A4, |
- typename A5, typename A6, typename A7> |
-struct InvokeHelper<false, void, Runnable, |
- void(A1, A2, A3, A4, A5, A6, A7)> { |
- static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, |
- A6 a6, A7 a7) { |
- runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3), |
- CallbackForward(a4), CallbackForward(a5), CallbackForward(a6), |
- CallbackForward(a7)); |
+template <typename Runnable, typename... Args> |
+struct InvokeHelper<false, void, Runnable, void(Args...)> { |
+ static void MakeItSo(Runnable runnable, Args... args) { |
+ runnable.Run(CallbackForward(args)...); |
} |
}; |
-template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3, |
- typename A4, typename A5, typename A6, typename A7> |
-struct InvokeHelper<true, void, Runnable, |
- void(BoundWeakPtr, A2, A3, A4, A5, A6, A7)> { |
- static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3, |
- A4 a4, A5 a5, A6 a6, A7 a7) { |
+template <typename Runnable, typename BoundWeakPtr, typename... Args> |
+struct InvokeHelper<true, void, Runnable, void(BoundWeakPtr, Args...)> { |
+ static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, Args... args) { |
if (!weak_ptr.get()) { |
return; |
} |
- runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3), |
- CallbackForward(a4), CallbackForward(a5), CallbackForward(a6), |
- CallbackForward(a7)); |
+ runnable.Run(weak_ptr.get(), CallbackForward(args)...); |
} |
}; |