| Index: base/bind_internal.h
|
| diff --git a/base/bind_internal.h b/base/bind_internal.h
|
| index dd8afdec82bf2f7eebac08ee9e1f083ae5503f45..fe3764bfb5145c5da73fb5d68fb99108335f8f2e 100644
|
| --- a/base/bind_internal.h
|
| +++ b/base/bind_internal.h
|
| @@ -21,35 +21,229 @@ namespace internal {
|
| // The method by which a function is invoked is determined by 3 different
|
| // dimensions:
|
| //
|
| -// 1) The type of function (normal, method, const-method)
|
| -// 2) The arity of the function
|
| +// 1) The type of function (normal or method).
|
| +// 2) The arity of the function.
|
| // 3) The number of bound parameters.
|
| //
|
| -// The FunctionTraitsN classes unwrap the function signature type to
|
| -// specialize based on the first two dimensions. The N in FunctionTraitsN
|
| -// specifies the 3rd dimension. We could have specified the unbound parameters
|
| -// via template parameters, but this method looked cleaner.
|
| +// The templates below handle the determination of each of these dimensions.
|
| +// In brief:
|
| //
|
| -// The FunctionTraitsN contains a static DoInvoke() function that is the key to
|
| -// implementing type erasure in the Callback() classes. DoInvoke() is a static
|
| -// function with a fixed signature that is independent of StorageType; its
|
| -// first argument is a pointer to the non-templated common baseclass of
|
| -// StorageType. This lets us store pointer to DoInvoke() in a function pointer
|
| -// that has knowledge of the specific StorageType, and thus no knowledge of the
|
| -// bound function and bound parameter types.
|
| +// FunctionTraits<> -- Provides a normalied signature, and other traits.
|
| +// InvokerN<> -- Provides a DoInvoke() function that actually executes
|
| +// a calback.
|
| +// InvokerStorageN<> -- Provides storage for the bound parameters, and
|
| +// typedefs to the above.
|
| +//
|
| +// More details about the design of each class is included in a comment closer
|
| +// to their defition.
|
| +
|
| +// FunctionTraits<>
|
| +//
|
| +// The FunctionTraits<> template determines the type of function, and also
|
| +// creates a NormalizedType used to select the InvokerN classes. It turns out
|
| +// that syntactically, you only really have 2 variations when invoking a
|
| +// funciton pointer: normal, and method. One is invoked func_ptr(arg1). The
|
| +// other is invoked (*obj_->method_ptr(arg1)).
|
| +//
|
| +// However, in the type system, there are many more distinctions. In standard
|
| +// C++, there's all variations of const, and volatile on the function pointer.
|
| +// In Windows, there are additional calling conventions (eg., __stdcall,
|
| +// __fastcall, etc.). FunctionTraits<> handles categorizing each of these into
|
| +// a normalized signature.
|
| +//
|
| +// Having a NormalizedSignature signature, reduces the combinatoric
|
| +// complexity of defintions for the InvokerN<> later. Even though there are
|
| +// only 2 syntactic variations on invoking a function, without normalizing the
|
| +// signature, there would need to be one specialization of InvokerN for each
|
| +// unique (function_type, bound_arg, unbound_args) tuple in order to match all
|
| +// function signatures.
|
| +//
|
| +// By normalizing the function signature, we reduce function_type to exactly 2.
|
| +
|
| +template <typename Sig>
|
| +struct FunctionTraits;
|
| +
|
| +// Function: Arity 0.
|
| +template <typename R>
|
| +struct FunctionTraits<R(*)()> {
|
| + typedef R (*NormalizedSig)();
|
| + typedef base::false_type IsMethod;
|
| +};
|
| +
|
| +// Method: Arity 0.
|
| +template <typename R, typename T>
|
| +struct FunctionTraits<R(T::*)()> {
|
| + typedef R (T::*NormalizedSig)();
|
| + typedef base::true_type IsMethod;
|
| +};
|
| +
|
| +// Const Method: Arity 0.
|
| +template <typename R, typename T>
|
| +struct FunctionTraits<R(T::*)() const> {
|
| + typedef R (T::*NormalizedSig)();
|
| + typedef base::true_type IsMethod;
|
| +};
|
| +
|
| +// Function: Arity 1.
|
| +template <typename R, typename X1>
|
| +struct FunctionTraits<R(*)(X1)> {
|
| + typedef R (*NormalizedSig)(X1);
|
| + typedef base::false_type IsMethod;
|
| +};
|
| +
|
| +// Method: Arity 1.
|
| +template <typename R, typename T, typename X1>
|
| +struct FunctionTraits<R(T::*)(X1)> {
|
| + typedef R (T::*NormalizedSig)(X1);
|
| + typedef base::true_type IsMethod;
|
| +};
|
| +
|
| +// Const Method: Arity 1.
|
| +template <typename R, typename T, typename X1>
|
| +struct FunctionTraits<R(T::*)(X1) const> {
|
| + typedef R (T::*NormalizedSig)(X1);
|
| + typedef base::true_type IsMethod;
|
| +};
|
| +
|
| +// Function: Arity 2.
|
| +template <typename R, typename X1, typename X2>
|
| +struct FunctionTraits<R(*)(X1, X2)> {
|
| + typedef R (*NormalizedSig)(X1, X2);
|
| + typedef base::false_type IsMethod;
|
| +};
|
| +
|
| +// Method: Arity 2.
|
| +template <typename R, typename T, typename X1, typename X2>
|
| +struct FunctionTraits<R(T::*)(X1, X2)> {
|
| + typedef R (T::*NormalizedSig)(X1, X2);
|
| + typedef base::true_type IsMethod;
|
| +};
|
| +
|
| +// Const Method: Arity 2.
|
| +template <typename R, typename T, typename X1, typename X2>
|
| +struct FunctionTraits<R(T::*)(X1, X2) const> {
|
| + typedef R (T::*NormalizedSig)(X1, X2);
|
| + typedef base::true_type IsMethod;
|
| +};
|
| +
|
| +// Function: Arity 3.
|
| +template <typename R, typename X1, typename X2, typename X3>
|
| +struct FunctionTraits<R(*)(X1, X2, X3)> {
|
| + typedef R (*NormalizedSig)(X1, X2, X3);
|
| + typedef base::false_type IsMethod;
|
| +};
|
| +
|
| +// Method: Arity 3.
|
| +template <typename R, typename T, typename X1, typename X2, typename X3>
|
| +struct FunctionTraits<R(T::*)(X1, X2, X3)> {
|
| + typedef R (T::*NormalizedSig)(X1, X2, X3);
|
| + typedef base::true_type IsMethod;
|
| +};
|
| +
|
| +// Const Method: Arity 3.
|
| +template <typename R, typename T, typename X1, typename X2, typename X3>
|
| +struct FunctionTraits<R(T::*)(X1, X2, X3) const> {
|
| + typedef R (T::*NormalizedSig)(X1, X2, X3);
|
| + typedef base::true_type IsMethod;
|
| +};
|
| +
|
| +// Function: Arity 4.
|
| +template <typename R, typename X1, typename X2, typename X3, typename X4>
|
| +struct FunctionTraits<R(*)(X1, X2, X3, X4)> {
|
| + typedef R (*NormalizedSig)(X1, X2, X3, X4);
|
| + typedef base::false_type IsMethod;
|
| +};
|
| +
|
| +// Method: Arity 4.
|
| +template <typename R, typename T, typename X1, typename X2, typename X3,
|
| + typename X4>
|
| +struct FunctionTraits<R(T::*)(X1, X2, X3, X4)> {
|
| + typedef R (T::*NormalizedSig)(X1, X2, X3, X4);
|
| + typedef base::true_type IsMethod;
|
| +};
|
| +
|
| +// Const Method: Arity 4.
|
| +template <typename R, typename T, typename X1, typename X2, typename X3,
|
| + typename X4>
|
| +struct FunctionTraits<R(T::*)(X1, X2, X3, X4) const> {
|
| + typedef R (T::*NormalizedSig)(X1, X2, X3, X4);
|
| + typedef base::true_type IsMethod;
|
| +};
|
| +
|
| +// Function: Arity 5.
|
| +template <typename R, typename X1, typename X2, typename X3, typename X4,
|
| + typename X5>
|
| +struct FunctionTraits<R(*)(X1, X2, X3, X4, X5)> {
|
| + typedef R (*NormalizedSig)(X1, X2, X3, X4, X5);
|
| + typedef base::false_type IsMethod;
|
| +};
|
| +
|
| +// Method: Arity 5.
|
| +template <typename R, typename T, typename X1, typename X2, typename X3,
|
| + typename X4, typename X5>
|
| +struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5)> {
|
| + typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5);
|
| + typedef base::true_type IsMethod;
|
| +};
|
| +
|
| +// Const Method: Arity 5.
|
| +template <typename R, typename T, typename X1, typename X2, typename X3,
|
| + typename X4, typename X5>
|
| +struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5) const> {
|
| + typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5);
|
| + typedef base::true_type IsMethod;
|
| +};
|
| +
|
| +// Function: Arity 6.
|
| +template <typename R, typename X1, typename X2, typename X3, typename X4,
|
| + typename X5, typename X6>
|
| +struct FunctionTraits<R(*)(X1, X2, X3, X4, X5, X6)> {
|
| + typedef R (*NormalizedSig)(X1, X2, X3, X4, X5, X6);
|
| + typedef base::false_type IsMethod;
|
| +};
|
| +
|
| +// Method: Arity 6.
|
| +template <typename R, typename T, typename X1, typename X2, typename X3,
|
| + typename X4, typename X5, typename X6>
|
| +struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5, X6)> {
|
| + typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5, X6);
|
| + typedef base::true_type IsMethod;
|
| +};
|
| +
|
| +// Const Method: Arity 6.
|
| +template <typename R, typename T, typename X1, typename X2, typename X3,
|
| + typename X4, typename X5, typename X6>
|
| +struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5, X6) const> {
|
| + typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5, X6);
|
| + typedef base::true_type IsMethod;
|
| +};
|
| +
|
| +// InvokerN<>
|
| +//
|
| +// The InvokerN templates contain a static DoInvoke() function that is the key
|
| +// to implementing type erasure in the Callback() classes.
|
| +//
|
| +// DoInvoke() is a static function with a fixed signature that is independent
|
| +// of StorageType; its first argument is a pointer to the non-templated common
|
| +// baseclass of StorageType. This lets us store pointer to DoInvoke() in a
|
| +// function pointer that has knowledge of the specific StorageType, and thus
|
| +// no knowledge of the bound function and bound parameter types.
|
| //
|
| // As long as we ensure that DoInvoke() is only used with pointers there were
|
| // upcasted from the correct StorageType, we can be sure that execution is
|
| // safe.
|
| +//
|
| +// The InvokerN templates are the only point that knows the number of bound
|
| +// and unbound arguments. This is intentional because it allows the other
|
| +// templates classes in the system to only have as many specializations as
|
| +// the max arity of function we wish to support.
|
|
|
| -template <typename StorageType, typename Sig>
|
| -struct FunctionTraits0;
|
| +template <typename StorageType, typename NormalizedSig>
|
| +struct Invoker0;
|
|
|
| // Function: Arity 0 -> 0.
|
| template <typename StorageType, typename R>
|
| -struct FunctionTraits0<StorageType, R(*)()> {
|
| - typedef base::false_type IsMethod;
|
| -
|
| +struct Invoker0<StorageType, R(*)()> {
|
| static R DoInvoke(InvokerStorageBase* base) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_();
|
| @@ -58,13 +252,11 @@ struct FunctionTraits0<StorageType, R(*)()> {
|
|
|
| // Function: Arity 1 -> 1.
|
| template <typename StorageType, typename R,typename X1>
|
| -struct FunctionTraits0<StorageType, R(*)(X1)> {
|
| +struct Invoker0<StorageType, R(*)(X1)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X1& x1) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(x1);
|
| @@ -73,14 +265,12 @@ struct FunctionTraits0<StorageType, R(*)(X1)> {
|
|
|
| // Function: Arity 2 -> 2.
|
| template <typename StorageType, typename R,typename X1, typename X2>
|
| -struct FunctionTraits0<StorageType, R(*)(X1, X2)> {
|
| +struct Invoker0<StorageType, R(*)(X1, X2)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(x1, x2);
|
| @@ -90,15 +280,13 @@ struct FunctionTraits0<StorageType, R(*)(X1, X2)> {
|
| // Function: Arity 3 -> 3.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3>
|
| -struct FunctionTraits0<StorageType, R(*)(X1, X2, X3)> {
|
| +struct Invoker0<StorageType, R(*)(X1, X2, X3)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| is_non_const_reference<X3>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
|
| const X3& x3) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -109,7 +297,7 @@ struct FunctionTraits0<StorageType, R(*)(X1, X2, X3)> {
|
| // Function: Arity 4 -> 4.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4>
|
| -struct FunctionTraits0<StorageType, R(*)(X1, X2, X3, X4)> {
|
| +struct Invoker0<StorageType, R(*)(X1, X2, X3, X4)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -117,8 +305,6 @@ struct FunctionTraits0<StorageType, R(*)(X1, X2, X3, X4)> {
|
| is_non_const_reference<X4>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
|
| const X3& x3, const X4& x4) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -129,7 +315,7 @@ struct FunctionTraits0<StorageType, R(*)(X1, X2, X3, X4)> {
|
| // Function: Arity 5 -> 5.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4, typename X5>
|
| -struct FunctionTraits0<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| +struct Invoker0<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -138,8 +324,6 @@ struct FunctionTraits0<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| is_non_const_reference<X5>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
|
| const X3& x3, const X4& x4, const X5& x5) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -150,7 +334,7 @@ struct FunctionTraits0<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| // Function: Arity 6 -> 6.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4, typename X5, typename X6>
|
| -struct FunctionTraits0<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| +struct Invoker0<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -160,8 +344,6 @@ struct FunctionTraits0<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| is_non_const_reference<X6>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
|
| const X3& x3, const X4& x4, const X5& x5, const X6& x6) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -169,18 +351,16 @@ struct FunctionTraits0<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| }
|
| };
|
|
|
| -template <typename StorageType, typename Sig>
|
| -struct FunctionTraits1;
|
| +template <typename StorageType, typename NormalizedSig>
|
| +struct Invoker1;
|
|
|
| // Function: Arity 1 -> 0.
|
| template <typename StorageType, typename R,typename X1>
|
| -struct FunctionTraits1<StorageType, R(*)(X1)> {
|
| +struct Invoker1<StorageType, R(*)(X1)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(Unwrap(invoker->p1_));
|
| @@ -189,36 +369,21 @@ struct FunctionTraits1<StorageType, R(*)(X1)> {
|
|
|
| // Method: Arity 0 -> 0.
|
| template <typename StorageType, typename R, typename T>
|
| -struct FunctionTraits1<StorageType, R(T::*)()> {
|
| - typedef base::true_type IsMethod;
|
| -
|
| +struct Invoker1<StorageType, R(T::*)()> {
|
| static R DoInvoke(InvokerStorageBase* base) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return (Unwrap(invoker->p1_)->*invoker->f_)();
|
| }
|
| };
|
|
|
| -// Const Method: Arity 0 -> 0.
|
| -template <typename StorageType, typename R, typename T>
|
| -struct FunctionTraits1<StorageType, R(T::*)() const> {
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base ) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)();
|
| - }
|
| -};
|
| -
|
| // Function: Arity 2 -> 1.
|
| template <typename StorageType, typename R,typename X1, typename X2>
|
| -struct FunctionTraits1<StorageType, R(*)(X1, X2)> {
|
| +struct Invoker1<StorageType, R(*)(X1, X2)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X2& x2) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(Unwrap(invoker->p1_), x2);
|
| @@ -227,46 +392,27 @@ struct FunctionTraits1<StorageType, R(*)(X1, X2)> {
|
|
|
| // Method: Arity 1 -> 1.
|
| template <typename StorageType, typename R, typename T, typename X1>
|
| -struct FunctionTraits1<StorageType, R(T::*)(X1)> {
|
| +struct Invoker1<StorageType, R(T::*)(X1)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X1& x1) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return (Unwrap(invoker->p1_)->*invoker->f_)(x1);
|
| }
|
| };
|
|
|
| -// Const Method: Arity 1 -> 1.
|
| -template <typename StorageType, typename R, typename T, typename X1>
|
| -struct FunctionTraits1<StorageType, R(T::*)(X1) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base, const X1& x1) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(x1);
|
| - }
|
| -};
|
| -
|
| // Function: Arity 3 -> 2.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3>
|
| -struct FunctionTraits1<StorageType, R(*)(X1, X2, X3)> {
|
| +struct Invoker1<StorageType, R(*)(X1, X2, X3)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| is_non_const_reference<X3>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(Unwrap(invoker->p1_), x2, x3);
|
| @@ -276,41 +422,22 @@ struct FunctionTraits1<StorageType, R(*)(X1, X2, X3)> {
|
| // Method: Arity 2 -> 2.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2>
|
| -struct FunctionTraits1<StorageType, R(T::*)(X1, X2)> {
|
| +struct Invoker1<StorageType, R(T::*)(X1, X2)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2);
|
| }
|
| };
|
|
|
| -// Const Method: Arity 2 -> 2.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2>
|
| -struct FunctionTraits1<StorageType, R(T::*)(X1, X2) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2);
|
| - }
|
| -};
|
| -
|
| // Function: Arity 4 -> 3.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4>
|
| -struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4)> {
|
| +struct Invoker1<StorageType, R(*)(X1, X2, X3, X4)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -318,8 +445,6 @@ struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4)> {
|
| is_non_const_reference<X4>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
|
| const X4& x4) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -330,15 +455,13 @@ struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4)> {
|
| // Method: Arity 3 -> 3.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2, typename X3>
|
| -struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3)> {
|
| +struct Invoker1<StorageType, R(T::*)(X1, X2, X3)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| is_non_const_reference<X3>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
|
| const X3& x3) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -346,28 +469,10 @@ struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3)> {
|
| }
|
| };
|
|
|
| -// Const Method: Arity 3 -> 3.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2, typename X3>
|
| -struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - || is_non_const_reference<X3>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
|
| - const X3& x3) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3);
|
| - }
|
| -};
|
| -
|
| // Function: Arity 5 -> 4.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4, typename X5>
|
| -struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| +struct Invoker1<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -376,8 +481,6 @@ struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| is_non_const_reference<X5>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
|
| const X4& x4, const X5& x5) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -388,7 +491,7 @@ struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| // Method: Arity 4 -> 4.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2, typename X3, typename X4>
|
| -struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| +struct Invoker1<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -396,8 +499,6 @@ struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| is_non_const_reference<X4>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
|
| const X3& x3, const X4& x4) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -405,29 +506,10 @@ struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| }
|
| };
|
|
|
| -// Const Method: Arity 4 -> 4.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2, typename X3, typename X4>
|
| -struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - || is_non_const_reference<X3>::value ||
|
| - is_non_const_reference<X4>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
|
| - const X3& x3, const X4& x4) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4);
|
| - }
|
| -};
|
| -
|
| // Function: Arity 6 -> 5.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4, typename X5, typename X6>
|
| -struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| +struct Invoker1<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -437,8 +519,6 @@ struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| is_non_const_reference<X6>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
|
| const X4& x4, const X5& x5, const X6& x6) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -449,7 +529,7 @@ struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| // Method: Arity 5 -> 5.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2, typename X3, typename X4, typename X5>
|
| -struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| +struct Invoker1<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -458,8 +538,6 @@ struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| is_non_const_reference<X5>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
|
| const X3& x3, const X4& x4, const X5& x5) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -467,39 +545,17 @@ struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| }
|
| };
|
|
|
| -// Const Method: Arity 5 -> 5.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2, typename X3, typename X4, typename X5>
|
| -struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - || is_non_const_reference<X3>::value ||
|
| - is_non_const_reference<X4>::value ||
|
| - is_non_const_reference<X5>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
|
| - const X3& x3, const X4& x4, const X5& x5) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4, x5);
|
| - }
|
| -};
|
| -
|
| -template <typename StorageType, typename Sig>
|
| -struct FunctionTraits2;
|
| +template <typename StorageType, typename NormalizedSig>
|
| +struct Invoker2;
|
|
|
| // Function: Arity 2 -> 0.
|
| template <typename StorageType, typename R,typename X1, typename X2>
|
| -struct FunctionTraits2<StorageType, R(*)(X1, X2)> {
|
| +struct Invoker2<StorageType, R(*)(X1, X2)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_));
|
| @@ -508,46 +564,27 @@ struct FunctionTraits2<StorageType, R(*)(X1, X2)> {
|
|
|
| // Method: Arity 1 -> 0.
|
| template <typename StorageType, typename R, typename T, typename X1>
|
| -struct FunctionTraits2<StorageType, R(T::*)(X1)> {
|
| +struct Invoker2<StorageType, R(T::*)(X1)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_));
|
| }
|
| };
|
|
|
| -// Const Method: Arity 1 -> 0.
|
| -template <typename StorageType, typename R, typename T, typename X1>
|
| -struct FunctionTraits2<StorageType, R(T::*)(X1) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base ) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_));
|
| - }
|
| -};
|
| -
|
| // Function: Arity 3 -> 1.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3>
|
| -struct FunctionTraits2<StorageType, R(*)(X1, X2, X3)> {
|
| +struct Invoker2<StorageType, R(*)(X1, X2, X3)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| is_non_const_reference<X3>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X3& x3) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3);
|
| @@ -557,41 +594,22 @@ struct FunctionTraits2<StorageType, R(*)(X1, X2, X3)> {
|
| // Method: Arity 2 -> 1.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2>
|
| -struct FunctionTraits2<StorageType, R(T::*)(X1, X2)> {
|
| +struct Invoker2<StorageType, R(T::*)(X1, X2)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X2& x2) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2);
|
| }
|
| };
|
|
|
| -// Const Method: Arity 2 -> 1.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2>
|
| -struct FunctionTraits2<StorageType, R(T::*)(X1, X2) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base, const X2& x2) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2);
|
| - }
|
| -};
|
| -
|
| // Function: Arity 4 -> 2.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4>
|
| -struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4)> {
|
| +struct Invoker2<StorageType, R(*)(X1, X2, X3, X4)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -599,8 +617,6 @@ struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4)> {
|
| is_non_const_reference<X4>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4);
|
| @@ -610,42 +626,23 @@ struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4)> {
|
| // Method: Arity 3 -> 2.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2, typename X3>
|
| -struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3)> {
|
| +struct Invoker2<StorageType, R(T::*)(X1, X2, X3)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| is_non_const_reference<X3>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3);
|
| }
|
| };
|
|
|
| -// Const Method: Arity 3 -> 2.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2, typename X3>
|
| -struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - || is_non_const_reference<X3>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3);
|
| - }
|
| -};
|
| -
|
| // Function: Arity 5 -> 3.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4, typename X5>
|
| -struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| +struct Invoker2<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -654,8 +651,6 @@ struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| is_non_const_reference<X5>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4,
|
| const X5& x5) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -666,7 +661,7 @@ struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| // Method: Arity 4 -> 3.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2, typename X3, typename X4>
|
| -struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| +struct Invoker2<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -674,8 +669,6 @@ struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| is_non_const_reference<X4>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
|
| const X4& x4) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -684,30 +677,10 @@ struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| }
|
| };
|
|
|
| -// Const Method: Arity 4 -> 3.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2, typename X3, typename X4>
|
| -struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - || is_non_const_reference<X3>::value ||
|
| - is_non_const_reference<X4>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
|
| - const X4& x4) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3,
|
| - x4);
|
| - }
|
| -};
|
| -
|
| // Function: Arity 6 -> 4.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4, typename X5, typename X6>
|
| -struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| +struct Invoker2<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -717,8 +690,6 @@ struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| is_non_const_reference<X6>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4,
|
| const X5& x5, const X6& x6) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -730,7 +701,7 @@ struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| // Method: Arity 5 -> 4.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2, typename X3, typename X4, typename X5>
|
| -struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| +struct Invoker2<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -739,8 +710,6 @@ struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| is_non_const_reference<X5>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
|
| const X4& x4, const X5& x5) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -749,42 +718,19 @@ struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| }
|
| };
|
|
|
| -// Const Method: Arity 5 -> 4.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2, typename X3, typename X4, typename X5>
|
| -struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - || is_non_const_reference<X3>::value ||
|
| - is_non_const_reference<X4>::value ||
|
| - is_non_const_reference<X5>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
|
| - const X4& x4, const X5& x5) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3,
|
| - x4, x5);
|
| - }
|
| -};
|
| -
|
| -template <typename StorageType, typename Sig>
|
| -struct FunctionTraits3;
|
| +template <typename StorageType, typename NormalizedSig>
|
| +struct Invoker3;
|
|
|
| // Function: Arity 3 -> 0.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3>
|
| -struct FunctionTraits3<StorageType, R(*)(X1, X2, X3)> {
|
| +struct Invoker3<StorageType, R(*)(X1, X2, X3)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| is_non_const_reference<X3>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
|
| @@ -795,14 +741,12 @@ struct FunctionTraits3<StorageType, R(*)(X1, X2, X3)> {
|
| // Method: Arity 2 -> 0.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2>
|
| -struct FunctionTraits3<StorageType, R(T::*)(X1, X2)> {
|
| +struct Invoker3<StorageType, R(T::*)(X1, X2)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| @@ -810,28 +754,10 @@ struct FunctionTraits3<StorageType, R(T::*)(X1, X2)> {
|
| }
|
| };
|
|
|
| -// Const Method: Arity 2 -> 0.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2>
|
| -struct FunctionTraits3<StorageType, R(T::*)(X1, X2) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base ) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| - Unwrap(invoker->p3_));
|
| - }
|
| -};
|
| -
|
| // Function: Arity 4 -> 1.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4>
|
| -struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4)> {
|
| +struct Invoker3<StorageType, R(*)(X1, X2, X3, X4)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -839,8 +765,6 @@ struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4)> {
|
| is_non_const_reference<X4>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X4& x4) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
|
| @@ -851,15 +775,13 @@ struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4)> {
|
| // Method: Arity 3 -> 1.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2, typename X3>
|
| -struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3)> {
|
| +struct Invoker3<StorageType, R(T::*)(X1, X2, X3)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| is_non_const_reference<X3>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X3& x3) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| @@ -867,28 +789,10 @@ struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3)> {
|
| }
|
| };
|
|
|
| -// Const Method: Arity 3 -> 1.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2, typename X3>
|
| -struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - || is_non_const_reference<X3>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base, const X3& x3) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| - Unwrap(invoker->p3_), x3);
|
| - }
|
| -};
|
| -
|
| // Function: Arity 5 -> 2.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4, typename X5>
|
| -struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| +struct Invoker3<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -897,8 +801,6 @@ struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| is_non_const_reference<X5>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X4& x4, const X5& x5) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
|
| @@ -909,7 +811,7 @@ struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| // Method: Arity 4 -> 2.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2, typename X3, typename X4>
|
| -struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| +struct Invoker3<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -917,8 +819,6 @@ struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| is_non_const_reference<X4>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| @@ -926,29 +826,10 @@ struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| }
|
| };
|
|
|
| -// Const Method: Arity 4 -> 2.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2, typename X3, typename X4>
|
| -struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - || is_non_const_reference<X3>::value ||
|
| - is_non_const_reference<X4>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| - Unwrap(invoker->p3_), x3, x4);
|
| - }
|
| -};
|
| -
|
| // Function: Arity 6 -> 3.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4, typename X5, typename X6>
|
| -struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| +struct Invoker3<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -958,8 +839,6 @@ struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| is_non_const_reference<X6>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X4& x4, const X5& x5,
|
| const X6& x6) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -971,7 +850,7 @@ struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| // Method: Arity 5 -> 3.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2, typename X3, typename X4, typename X5>
|
| -struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| +struct Invoker3<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -980,8 +859,6 @@ struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| is_non_const_reference<X5>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4,
|
| const X5& x5) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| @@ -990,34 +867,13 @@ struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| }
|
| };
|
|
|
| -// Const Method: Arity 5 -> 3.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2, typename X3, typename X4, typename X5>
|
| -struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - || is_non_const_reference<X3>::value ||
|
| - is_non_const_reference<X4>::value ||
|
| - is_non_const_reference<X5>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4,
|
| - const X5& x5) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| - Unwrap(invoker->p3_), x3, x4, x5);
|
| - }
|
| -};
|
| -
|
| -template <typename StorageType, typename Sig>
|
| -struct FunctionTraits4;
|
| +template <typename StorageType, typename NormalizedSig>
|
| +struct Invoker4;
|
|
|
| // Function: Arity 4 -> 0.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4>
|
| -struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4)> {
|
| +struct Invoker4<StorageType, R(*)(X1, X2, X3, X4)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -1025,8 +881,6 @@ struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4)> {
|
| is_non_const_reference<X4>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
|
| @@ -1037,15 +891,13 @@ struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4)> {
|
| // Method: Arity 3 -> 0.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2, typename X3>
|
| -struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3)> {
|
| +struct Invoker4<StorageType, R(T::*)(X1, X2, X3)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| is_non_const_reference<X3>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| @@ -1053,28 +905,10 @@ struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3)> {
|
| }
|
| };
|
|
|
| -// Const Method: Arity 3 -> 0.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2, typename X3>
|
| -struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - || is_non_const_reference<X3>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base ) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| - Unwrap(invoker->p3_), Unwrap(invoker->p4_));
|
| - }
|
| -};
|
| -
|
| // Function: Arity 5 -> 1.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4, typename X5>
|
| -struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| +struct Invoker4<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -1083,8 +917,6 @@ struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| is_non_const_reference<X5>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X5& x5) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
|
| @@ -1095,7 +927,7 @@ struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| // Method: Arity 4 -> 1.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2, typename X3, typename X4>
|
| -struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| +struct Invoker4<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -1103,8 +935,6 @@ struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| is_non_const_reference<X4>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X4& x4) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| @@ -1112,29 +942,10 @@ struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| }
|
| };
|
|
|
| -// Const Method: Arity 4 -> 1.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2, typename X3, typename X4>
|
| -struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - || is_non_const_reference<X3>::value ||
|
| - is_non_const_reference<X4>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base, const X4& x4) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| - Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4);
|
| - }
|
| -};
|
| -
|
| // Function: Arity 6 -> 2.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4, typename X5, typename X6>
|
| -struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| +struct Invoker4<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -1144,8 +955,6 @@ struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| is_non_const_reference<X6>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X5& x5, const X6& x6) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
|
| @@ -1156,7 +965,7 @@ struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| // Method: Arity 5 -> 2.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2, typename X3, typename X4, typename X5>
|
| -struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| +struct Invoker4<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -1165,8 +974,6 @@ struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| is_non_const_reference<X5>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X4& x4, const X5& x5) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| @@ -1174,33 +981,13 @@ struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| }
|
| };
|
|
|
| -// Const Method: Arity 5 -> 2.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2, typename X3, typename X4, typename X5>
|
| -struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - || is_non_const_reference<X3>::value ||
|
| - is_non_const_reference<X4>::value ||
|
| - is_non_const_reference<X5>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base, const X4& x4, const X5& x5) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| - Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4, x5);
|
| - }
|
| -};
|
| -
|
| -template <typename StorageType, typename Sig>
|
| -struct FunctionTraits5;
|
| +template <typename StorageType, typename NormalizedSig>
|
| +struct Invoker5;
|
|
|
| // Function: Arity 5 -> 0.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4, typename X5>
|
| -struct FunctionTraits5<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| +struct Invoker5<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -1209,8 +996,6 @@ struct FunctionTraits5<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| is_non_const_reference<X5>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
|
| @@ -1221,7 +1006,7 @@ struct FunctionTraits5<StorageType, R(*)(X1, X2, X3, X4, X5)> {
|
| // Method: Arity 4 -> 0.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2, typename X3, typename X4>
|
| -struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| +struct Invoker5<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -1229,8 +1014,6 @@ struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| is_non_const_reference<X4>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| @@ -1238,29 +1021,10 @@ struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4)> {
|
| }
|
| };
|
|
|
| -// Const Method: Arity 4 -> 0.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2, typename X3, typename X4>
|
| -struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - || is_non_const_reference<X3>::value ||
|
| - is_non_const_reference<X4>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base ) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| - Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_));
|
| - }
|
| -};
|
| -
|
| // Function: Arity 6 -> 1.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4, typename X5, typename X6>
|
| -struct FunctionTraits5<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| +struct Invoker5<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -1270,8 +1034,6 @@ struct FunctionTraits5<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| is_non_const_reference<X6>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X6& x6) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
|
| @@ -1282,7 +1044,7 @@ struct FunctionTraits5<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| // Method: Arity 5 -> 1.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2, typename X3, typename X4, typename X5>
|
| -struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| +struct Invoker5<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -1291,8 +1053,6 @@ struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| is_non_const_reference<X5>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base, const X5& x5) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| @@ -1300,33 +1060,13 @@ struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| }
|
| };
|
|
|
| -// Const Method: Arity 5 -> 1.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2, typename X3, typename X4, typename X5>
|
| -struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - || is_non_const_reference<X3>::value ||
|
| - is_non_const_reference<X4>::value ||
|
| - is_non_const_reference<X5>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base, const X5& x5) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| - Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5);
|
| - }
|
| -};
|
| -
|
| -template <typename StorageType, typename Sig>
|
| -struct FunctionTraits6;
|
| +template <typename StorageType, typename NormalizedSig>
|
| +struct Invoker6;
|
|
|
| // Function: Arity 6 -> 0.
|
| template <typename StorageType, typename R,typename X1, typename X2,
|
| typename X3, typename X4, typename X5, typename X6>
|
| -struct FunctionTraits6<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| +struct Invoker6<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -1336,8 +1076,6 @@ struct FunctionTraits6<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| is_non_const_reference<X6>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::false_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
|
| @@ -1349,7 +1087,7 @@ struct FunctionTraits6<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
|
| // Method: Arity 5 -> 0.
|
| template <typename StorageType, typename R, typename T, typename X1,
|
| typename X2, typename X3, typename X4, typename X5>
|
| -struct FunctionTraits6<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| +struct Invoker6<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| COMPILE_ASSERT(
|
| !( is_non_const_reference<X1>::value ||
|
| is_non_const_reference<X2>::value ||
|
| @@ -1358,8 +1096,6 @@ struct FunctionTraits6<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| is_non_const_reference<X5>::value ),
|
| do_not_bind_functions_with_nonconst_ref);
|
|
|
| - typedef base::true_type IsMethod;
|
| -
|
| static R DoInvoke(InvokerStorageBase* base) {
|
| StorageType* invoker = static_cast<StorageType*>(base);
|
| return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| @@ -1368,47 +1104,28 @@ struct FunctionTraits6<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
|
| }
|
| };
|
|
|
| -// Const Method: Arity 5 -> 0.
|
| -template <typename StorageType, typename R, typename T, typename X1,
|
| - typename X2, typename X3, typename X4, typename X5>
|
| -struct FunctionTraits6<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
|
| - COMPILE_ASSERT(
|
| - !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
|
| - || is_non_const_reference<X3>::value ||
|
| - is_non_const_reference<X4>::value ||
|
| - is_non_const_reference<X5>::value ),
|
| - do_not_bind_functions_with_nonconst_ref);
|
| -
|
| - typedef base::true_type IsMethod;
|
| -
|
| - static R DoInvoke(InvokerStorageBase* base ) {
|
| - StorageType* invoker = static_cast<StorageType*>(base);
|
| - return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
|
| - Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_),
|
| - Unwrap(invoker->p6_));
|
| - }
|
| -};
|
| -
|
|
|
| -// These are the actual storage classes for the invokers.
|
| +// InvokerStorageN<>
|
| +//
|
| +// These are the actual storage classes for the Invokers.
|
| //
|
| // Though these types are "classes", they are being used as structs with
|
| // all member variable public. We cannot make it a struct because it inherits
|
| // from a class which causes a compiler warning. We cannot add a "Run()" method
|
| // that forwards the unbound arguments because that would require we unwrap the
|
| -// Sig type like in FunctionTraitsN above to know the return type, and the arity
|
| +// Sig type like in InvokerN above to know the return type, and the arity
|
| // of Run().
|
| //
|
| -// An alternate solution would be to merge FunctionTraitsN and InvokerStorageN,
|
| +// An alternate solution would be to merge InvokerN and InvokerStorageN,
|
| // but the generated code seemed harder to read.
|
|
|
| template <typename Sig>
|
| class InvokerStorage0 : public InvokerStorageBase {
|
| public:
|
| typedef InvokerStorage0 StorageType;
|
| - typedef FunctionTraits0<StorageType, Sig> FunctionTraits;
|
| - typedef typename FunctionTraits::IsMethod IsMethod;
|
| -
|
| + typedef FunctionTraits<Sig> TargetTraits;
|
| + typedef Invoker0<StorageType, typename TargetTraits::NormalizedSig> Invoker;
|
| + typedef typename TargetTraits::IsMethod IsMethod;
|
|
|
|
|
| InvokerStorage0(Sig f)
|
| @@ -1424,9 +1141,9 @@ template <typename Sig, typename P1>
|
| class InvokerStorage1 : public InvokerStorageBase {
|
| public:
|
| typedef InvokerStorage1 StorageType;
|
| - typedef FunctionTraits1<StorageType, Sig> FunctionTraits;
|
| - typedef typename FunctionTraits::IsMethod IsMethod;
|
| -
|
| + typedef FunctionTraits<Sig> TargetTraits;
|
| + typedef Invoker1<StorageType, typename TargetTraits::NormalizedSig> Invoker;
|
| + typedef typename TargetTraits::IsMethod IsMethod;
|
| // For methods, we need to be careful for parameter 1. We skip the
|
| // scoped_refptr check because the binder itself takes care of this. We also
|
| // disallow binding of an array as the method's target object.
|
| @@ -1454,9 +1171,9 @@ template <typename Sig, typename P1, typename P2>
|
| class InvokerStorage2 : public InvokerStorageBase {
|
| public:
|
| typedef InvokerStorage2 StorageType;
|
| - typedef FunctionTraits2<StorageType, Sig> FunctionTraits;
|
| - typedef typename FunctionTraits::IsMethod IsMethod;
|
| -
|
| + typedef FunctionTraits<Sig> TargetTraits;
|
| + typedef Invoker2<StorageType, typename TargetTraits::NormalizedSig> Invoker;
|
| + typedef typename TargetTraits::IsMethod IsMethod;
|
| // For methods, we need to be careful for parameter 1. We skip the
|
| // scoped_refptr check because the binder itself takes care of this. We also
|
| // disallow binding of an array as the method's target object.
|
| @@ -1488,9 +1205,9 @@ template <typename Sig, typename P1, typename P2, typename P3>
|
| class InvokerStorage3 : public InvokerStorageBase {
|
| public:
|
| typedef InvokerStorage3 StorageType;
|
| - typedef FunctionTraits3<StorageType, Sig> FunctionTraits;
|
| - typedef typename FunctionTraits::IsMethod IsMethod;
|
| -
|
| + typedef FunctionTraits<Sig> TargetTraits;
|
| + typedef Invoker3<StorageType, typename TargetTraits::NormalizedSig> Invoker;
|
| + typedef typename TargetTraits::IsMethod IsMethod;
|
| // For methods, we need to be careful for parameter 1. We skip the
|
| // scoped_refptr check because the binder itself takes care of this. We also
|
| // disallow binding of an array as the method's target object.
|
| @@ -1526,9 +1243,9 @@ template <typename Sig, typename P1, typename P2, typename P3, typename P4>
|
| class InvokerStorage4 : public InvokerStorageBase {
|
| public:
|
| typedef InvokerStorage4 StorageType;
|
| - typedef FunctionTraits4<StorageType, Sig> FunctionTraits;
|
| - typedef typename FunctionTraits::IsMethod IsMethod;
|
| -
|
| + typedef FunctionTraits<Sig> TargetTraits;
|
| + typedef Invoker4<StorageType, typename TargetTraits::NormalizedSig> Invoker;
|
| + typedef typename TargetTraits::IsMethod IsMethod;
|
| // For methods, we need to be careful for parameter 1. We skip the
|
| // scoped_refptr check because the binder itself takes care of this. We also
|
| // disallow binding of an array as the method's target object.
|
| @@ -1569,9 +1286,9 @@ template <typename Sig, typename P1, typename P2, typename P3, typename P4,
|
| class InvokerStorage5 : public InvokerStorageBase {
|
| public:
|
| typedef InvokerStorage5 StorageType;
|
| - typedef FunctionTraits5<StorageType, Sig> FunctionTraits;
|
| - typedef typename FunctionTraits::IsMethod IsMethod;
|
| -
|
| + typedef FunctionTraits<Sig> TargetTraits;
|
| + typedef Invoker5<StorageType, typename TargetTraits::NormalizedSig> Invoker;
|
| + typedef typename TargetTraits::IsMethod IsMethod;
|
| // For methods, we need to be careful for parameter 1. We skip the
|
| // scoped_refptr check because the binder itself takes care of this. We also
|
| // disallow binding of an array as the method's target object.
|
| @@ -1617,9 +1334,9 @@ template <typename Sig, typename P1, typename P2, typename P3, typename P4,
|
| class InvokerStorage6 : public InvokerStorageBase {
|
| public:
|
| typedef InvokerStorage6 StorageType;
|
| - typedef FunctionTraits6<StorageType, Sig> FunctionTraits;
|
| - typedef typename FunctionTraits::IsMethod IsMethod;
|
| -
|
| + typedef FunctionTraits<Sig> TargetTraits;
|
| + typedef Invoker6<StorageType, typename TargetTraits::NormalizedSig> Invoker;
|
| + typedef typename TargetTraits::IsMethod IsMethod;
|
| // For methods, we need to be careful for parameter 1. We skip the
|
| // scoped_refptr check because the binder itself takes care of this. We also
|
| // disallow binding of an array as the method's target object.
|
|
|