bind_internal.h revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
1// This file was GENERATED by command:
2//     pump.py bind_internal.h.pump
3// DO NOT EDIT BY HAND!!!
4
5
6// Copyright (c) 2011 The Chromium Authors. All rights reserved.
7// Use of this source code is governed by a BSD-style license that can be
8// found in the LICENSE file.
9
10#ifndef BASE_BIND_INTERNAL_H_
11#define BASE_BIND_INTERNAL_H_
12#pragma once
13
14#include "base/bind_helpers.h"
15#include "base/callback_helpers.h"
16#include "base/template_util.h"
17
18namespace base {
19namespace internal {
20
21// The method by which a function is invoked is determined by 3 different
22// dimensions:
23//
24//   1) The type of function (normal, method, const-method)
25//   2) The arity of the function
26//   3) The number of bound parameters.
27//
28// The FunctionTraitsN classes unwrap the function signature type to
29// specialize based on the first two dimensions.  The N in FunctionTraitsN
30// specifies the 3rd dimension.  We could have specified the unbound parameters
31// via template parameters, but this method looked cleaner.
32//
33// The FunctionTraitsN contains a static DoInvoke() function that is the key to
34// implementing type erasure in the Callback() classes.  DoInvoke() is a static
35// function with a fixed signature that is independent of StorageType; its
36// first argument is a pointer to the non-templated common baseclass of
37// StorageType. This lets us store pointer to DoInvoke() in a function pointer
38// that has knowledge of the specific StorageType, and thus no knowledge of the
39// bound function and bound parameter types.
40//
41// As long as we ensure that DoInvoke() is only used with pointers there were
42// upcasted from the correct StorageType, we can be sure that execution is
43// safe.
44
45template <typename StorageType, typename Sig>
46struct FunctionTraits0;
47
48// Function: Arity 0 -> 0.
49template <typename StorageType, typename R>
50struct FunctionTraits0<StorageType, R(*)()> {
51  typedef base::false_type IsMethod;
52
53  static R DoInvoke(InvokerStorageBase* base) {
54    StorageType* invoker = static_cast<StorageType*>(base);
55    return invoker->f_();
56  }
57};
58
59// Function: Arity 1 -> 1.
60template <typename StorageType, typename R,typename X1>
61struct FunctionTraits0<StorageType, R(*)(X1)> {
62  COMPILE_ASSERT(
63      !( is_non_const_reference<X1>::value ),
64      do_not_bind_functions_with_nonconst_ref);
65
66  typedef base::false_type IsMethod;
67
68  static R DoInvoke(InvokerStorageBase* base, const X1& x1) {
69    StorageType* invoker = static_cast<StorageType*>(base);
70    return invoker->f_(x1);
71  }
72};
73
74// Function: Arity 2 -> 2.
75template <typename StorageType, typename R,typename X1, typename X2>
76struct FunctionTraits0<StorageType, R(*)(X1, X2)> {
77  COMPILE_ASSERT(
78      !( is_non_const_reference<X1>::value ||
79          is_non_const_reference<X2>::value ),
80      do_not_bind_functions_with_nonconst_ref);
81
82  typedef base::false_type IsMethod;
83
84  static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2) {
85    StorageType* invoker = static_cast<StorageType*>(base);
86    return invoker->f_(x1, x2);
87  }
88};
89
90// Function: Arity 3 -> 3.
91template <typename StorageType, typename R,typename X1, typename X2,
92    typename X3>
93struct FunctionTraits0<StorageType, R(*)(X1, X2, X3)> {
94  COMPILE_ASSERT(
95      !( is_non_const_reference<X1>::value ||
96          is_non_const_reference<X2>::value ||
97          is_non_const_reference<X3>::value ),
98      do_not_bind_functions_with_nonconst_ref);
99
100  typedef base::false_type IsMethod;
101
102  static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
103      const X3& x3) {
104    StorageType* invoker = static_cast<StorageType*>(base);
105    return invoker->f_(x1, x2, x3);
106  }
107};
108
109// Function: Arity 4 -> 4.
110template <typename StorageType, typename R,typename X1, typename X2,
111    typename X3, typename X4>
112struct FunctionTraits0<StorageType, R(*)(X1, X2, X3, X4)> {
113  COMPILE_ASSERT(
114      !( is_non_const_reference<X1>::value ||
115          is_non_const_reference<X2>::value ||
116          is_non_const_reference<X3>::value ||
117          is_non_const_reference<X4>::value ),
118      do_not_bind_functions_with_nonconst_ref);
119
120  typedef base::false_type IsMethod;
121
122  static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
123      const X3& x3, const X4& x4) {
124    StorageType* invoker = static_cast<StorageType*>(base);
125    return invoker->f_(x1, x2, x3, x4);
126  }
127};
128
129// Function: Arity 5 -> 5.
130template <typename StorageType, typename R,typename X1, typename X2,
131    typename X3, typename X4, typename X5>
132struct FunctionTraits0<StorageType, R(*)(X1, X2, X3, X4, X5)> {
133  COMPILE_ASSERT(
134      !( is_non_const_reference<X1>::value ||
135          is_non_const_reference<X2>::value ||
136          is_non_const_reference<X3>::value ||
137          is_non_const_reference<X4>::value ||
138          is_non_const_reference<X5>::value ),
139      do_not_bind_functions_with_nonconst_ref);
140
141  typedef base::false_type IsMethod;
142
143  static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
144      const X3& x3, const X4& x4, const X5& x5) {
145    StorageType* invoker = static_cast<StorageType*>(base);
146    return invoker->f_(x1, x2, x3, x4, x5);
147  }
148};
149
150// Function: Arity 6 -> 6.
151template <typename StorageType, typename R,typename X1, typename X2,
152    typename X3, typename X4, typename X5, typename X6>
153struct FunctionTraits0<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
154  COMPILE_ASSERT(
155      !( is_non_const_reference<X1>::value ||
156          is_non_const_reference<X2>::value ||
157          is_non_const_reference<X3>::value ||
158          is_non_const_reference<X4>::value ||
159          is_non_const_reference<X5>::value ||
160          is_non_const_reference<X6>::value ),
161      do_not_bind_functions_with_nonconst_ref);
162
163  typedef base::false_type IsMethod;
164
165  static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
166      const X3& x3, const X4& x4, const X5& x5, const X6& x6) {
167    StorageType* invoker = static_cast<StorageType*>(base);
168    return invoker->f_(x1, x2, x3, x4, x5, x6);
169  }
170};
171
172template <typename StorageType, typename Sig>
173struct FunctionTraits1;
174
175// Function: Arity 1 -> 0.
176template <typename StorageType, typename R,typename X1>
177struct FunctionTraits1<StorageType, R(*)(X1)> {
178  COMPILE_ASSERT(
179      !( is_non_const_reference<X1>::value ),
180      do_not_bind_functions_with_nonconst_ref);
181
182  typedef base::false_type IsMethod;
183
184  static R DoInvoke(InvokerStorageBase* base) {
185    StorageType* invoker = static_cast<StorageType*>(base);
186    return invoker->f_(Unwrap(invoker->p1_));
187  }
188};
189
190// Method: Arity 0 -> 0.
191template <typename StorageType, typename R, typename T>
192struct FunctionTraits1<StorageType, R(T::*)()> {
193  typedef base::true_type IsMethod;
194
195  static R DoInvoke(InvokerStorageBase* base) {
196    StorageType* invoker = static_cast<StorageType*>(base);
197    return (Unwrap(invoker->p1_)->*invoker->f_)();
198  }
199};
200
201// Const Method: Arity 0 -> 0.
202template <typename StorageType, typename R, typename T>
203struct FunctionTraits1<StorageType, R(T::*)() const> {
204  typedef base::true_type IsMethod;
205
206  static R DoInvoke(InvokerStorageBase* base ) {
207    StorageType* invoker = static_cast<StorageType*>(base);
208    return (Unwrap(invoker->p1_)->*invoker->f_)();
209  }
210};
211
212// Function: Arity 2 -> 1.
213template <typename StorageType, typename R,typename X1, typename X2>
214struct FunctionTraits1<StorageType, R(*)(X1, X2)> {
215  COMPILE_ASSERT(
216      !( is_non_const_reference<X1>::value ||
217          is_non_const_reference<X2>::value ),
218      do_not_bind_functions_with_nonconst_ref);
219
220  typedef base::false_type IsMethod;
221
222  static R DoInvoke(InvokerStorageBase* base, const X2& x2) {
223    StorageType* invoker = static_cast<StorageType*>(base);
224    return invoker->f_(Unwrap(invoker->p1_), x2);
225  }
226};
227
228// Method: Arity 1 -> 1.
229template <typename StorageType, typename R, typename T, typename X1>
230struct FunctionTraits1<StorageType, R(T::*)(X1)> {
231  COMPILE_ASSERT(
232      !( is_non_const_reference<X1>::value ),
233      do_not_bind_functions_with_nonconst_ref);
234
235  typedef base::true_type IsMethod;
236
237  static R DoInvoke(InvokerStorageBase* base, const X1& x1) {
238    StorageType* invoker = static_cast<StorageType*>(base);
239    return (Unwrap(invoker->p1_)->*invoker->f_)(x1);
240  }
241};
242
243// Const Method: Arity 1 -> 1.
244template <typename StorageType, typename R, typename T, typename X1>
245struct FunctionTraits1<StorageType, R(T::*)(X1) const> {
246  COMPILE_ASSERT(
247      !(is_non_const_reference<X1>::value ),
248      do_not_bind_functions_with_nonconst_ref);
249
250  typedef base::true_type IsMethod;
251
252  static R DoInvoke(InvokerStorageBase* base,  const X1& x1) {
253    StorageType* invoker = static_cast<StorageType*>(base);
254    return (Unwrap(invoker->p1_)->*invoker->f_)(x1);
255  }
256};
257
258// Function: Arity 3 -> 2.
259template <typename StorageType, typename R,typename X1, typename X2,
260    typename X3>
261struct FunctionTraits1<StorageType, R(*)(X1, X2, X3)> {
262  COMPILE_ASSERT(
263      !( is_non_const_reference<X1>::value ||
264          is_non_const_reference<X2>::value ||
265          is_non_const_reference<X3>::value ),
266      do_not_bind_functions_with_nonconst_ref);
267
268  typedef base::false_type IsMethod;
269
270  static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3) {
271    StorageType* invoker = static_cast<StorageType*>(base);
272    return invoker->f_(Unwrap(invoker->p1_), x2, x3);
273  }
274};
275
276// Method: Arity 2 -> 2.
277template <typename StorageType, typename R, typename T, typename X1,
278    typename X2>
279struct FunctionTraits1<StorageType, R(T::*)(X1, X2)> {
280  COMPILE_ASSERT(
281      !( is_non_const_reference<X1>::value ||
282          is_non_const_reference<X2>::value ),
283      do_not_bind_functions_with_nonconst_ref);
284
285  typedef base::true_type IsMethod;
286
287  static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2) {
288    StorageType* invoker = static_cast<StorageType*>(base);
289    return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2);
290  }
291};
292
293// Const Method: Arity 2 -> 2.
294template <typename StorageType, typename R, typename T, typename X1,
295    typename X2>
296struct FunctionTraits1<StorageType, R(T::*)(X1, X2) const> {
297  COMPILE_ASSERT(
298      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
299          ),
300      do_not_bind_functions_with_nonconst_ref);
301
302  typedef base::true_type IsMethod;
303
304  static R DoInvoke(InvokerStorageBase* base,  const X1& x1, const X2& x2) {
305    StorageType* invoker = static_cast<StorageType*>(base);
306    return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2);
307  }
308};
309
310// Function: Arity 4 -> 3.
311template <typename StorageType, typename R,typename X1, typename X2,
312    typename X3, typename X4>
313struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4)> {
314  COMPILE_ASSERT(
315      !( is_non_const_reference<X1>::value ||
316          is_non_const_reference<X2>::value ||
317          is_non_const_reference<X3>::value ||
318          is_non_const_reference<X4>::value ),
319      do_not_bind_functions_with_nonconst_ref);
320
321  typedef base::false_type IsMethod;
322
323  static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
324      const X4& x4) {
325    StorageType* invoker = static_cast<StorageType*>(base);
326    return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4);
327  }
328};
329
330// Method: Arity 3 -> 3.
331template <typename StorageType, typename R, typename T, typename X1,
332    typename X2, typename X3>
333struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3)> {
334  COMPILE_ASSERT(
335      !( is_non_const_reference<X1>::value ||
336          is_non_const_reference<X2>::value ||
337          is_non_const_reference<X3>::value ),
338      do_not_bind_functions_with_nonconst_ref);
339
340  typedef base::true_type IsMethod;
341
342  static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
343      const X3& x3) {
344    StorageType* invoker = static_cast<StorageType*>(base);
345    return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3);
346  }
347};
348
349// Const Method: Arity 3 -> 3.
350template <typename StorageType, typename R, typename T, typename X1,
351    typename X2, typename X3>
352struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3) const> {
353  COMPILE_ASSERT(
354      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
355          || is_non_const_reference<X3>::value ),
356      do_not_bind_functions_with_nonconst_ref);
357
358  typedef base::true_type IsMethod;
359
360  static R DoInvoke(InvokerStorageBase* base,  const X1& x1, const X2& x2,
361      const X3& x3) {
362    StorageType* invoker = static_cast<StorageType*>(base);
363    return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3);
364  }
365};
366
367// Function: Arity 5 -> 4.
368template <typename StorageType, typename R,typename X1, typename X2,
369    typename X3, typename X4, typename X5>
370struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4, X5)> {
371  COMPILE_ASSERT(
372      !( is_non_const_reference<X1>::value ||
373          is_non_const_reference<X2>::value ||
374          is_non_const_reference<X3>::value ||
375          is_non_const_reference<X4>::value ||
376          is_non_const_reference<X5>::value ),
377      do_not_bind_functions_with_nonconst_ref);
378
379  typedef base::false_type IsMethod;
380
381  static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
382      const X4& x4, const X5& x5) {
383    StorageType* invoker = static_cast<StorageType*>(base);
384    return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5);
385  }
386};
387
388// Method: Arity 4 -> 4.
389template <typename StorageType, typename R, typename T, typename X1,
390    typename X2, typename X3, typename X4>
391struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4)> {
392  COMPILE_ASSERT(
393      !( is_non_const_reference<X1>::value ||
394          is_non_const_reference<X2>::value ||
395          is_non_const_reference<X3>::value ||
396          is_non_const_reference<X4>::value ),
397      do_not_bind_functions_with_nonconst_ref);
398
399  typedef base::true_type IsMethod;
400
401  static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
402      const X3& x3, const X4& x4) {
403    StorageType* invoker = static_cast<StorageType*>(base);
404    return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4);
405  }
406};
407
408// Const Method: Arity 4 -> 4.
409template <typename StorageType, typename R, typename T, typename X1,
410    typename X2, typename X3, typename X4>
411struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4) const> {
412  COMPILE_ASSERT(
413      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
414          || is_non_const_reference<X3>::value ||
415          is_non_const_reference<X4>::value ),
416      do_not_bind_functions_with_nonconst_ref);
417
418  typedef base::true_type IsMethod;
419
420  static R DoInvoke(InvokerStorageBase* base,  const X1& x1, const X2& x2,
421      const X3& x3, const X4& x4) {
422    StorageType* invoker = static_cast<StorageType*>(base);
423    return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4);
424  }
425};
426
427// Function: Arity 6 -> 5.
428template <typename StorageType, typename R,typename X1, typename X2,
429    typename X3, typename X4, typename X5, typename X6>
430struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
431  COMPILE_ASSERT(
432      !( is_non_const_reference<X1>::value ||
433          is_non_const_reference<X2>::value ||
434          is_non_const_reference<X3>::value ||
435          is_non_const_reference<X4>::value ||
436          is_non_const_reference<X5>::value ||
437          is_non_const_reference<X6>::value ),
438      do_not_bind_functions_with_nonconst_ref);
439
440  typedef base::false_type IsMethod;
441
442  static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
443      const X4& x4, const X5& x5, const X6& x6) {
444    StorageType* invoker = static_cast<StorageType*>(base);
445    return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5, x6);
446  }
447};
448
449// Method: Arity 5 -> 5.
450template <typename StorageType, typename R, typename T, typename X1,
451    typename X2, typename X3, typename X4, typename X5>
452struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
453  COMPILE_ASSERT(
454      !( is_non_const_reference<X1>::value ||
455          is_non_const_reference<X2>::value ||
456          is_non_const_reference<X3>::value ||
457          is_non_const_reference<X4>::value ||
458          is_non_const_reference<X5>::value ),
459      do_not_bind_functions_with_nonconst_ref);
460
461  typedef base::true_type IsMethod;
462
463  static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
464      const X3& x3, const X4& x4, const X5& x5) {
465    StorageType* invoker = static_cast<StorageType*>(base);
466    return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4, x5);
467  }
468};
469
470// Const Method: Arity 5 -> 5.
471template <typename StorageType, typename R, typename T, typename X1,
472    typename X2, typename X3, typename X4, typename X5>
473struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
474  COMPILE_ASSERT(
475      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
476          || is_non_const_reference<X3>::value ||
477          is_non_const_reference<X4>::value ||
478          is_non_const_reference<X5>::value ),
479      do_not_bind_functions_with_nonconst_ref);
480
481  typedef base::true_type IsMethod;
482
483  static R DoInvoke(InvokerStorageBase* base,  const X1& x1, const X2& x2,
484      const X3& x3, const X4& x4, const X5& x5) {
485    StorageType* invoker = static_cast<StorageType*>(base);
486    return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4, x5);
487  }
488};
489
490template <typename StorageType, typename Sig>
491struct FunctionTraits2;
492
493// Function: Arity 2 -> 0.
494template <typename StorageType, typename R,typename X1, typename X2>
495struct FunctionTraits2<StorageType, R(*)(X1, X2)> {
496  COMPILE_ASSERT(
497      !( is_non_const_reference<X1>::value ||
498          is_non_const_reference<X2>::value ),
499      do_not_bind_functions_with_nonconst_ref);
500
501  typedef base::false_type IsMethod;
502
503  static R DoInvoke(InvokerStorageBase* base) {
504    StorageType* invoker = static_cast<StorageType*>(base);
505    return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_));
506  }
507};
508
509// Method: Arity 1 -> 0.
510template <typename StorageType, typename R, typename T, typename X1>
511struct FunctionTraits2<StorageType, R(T::*)(X1)> {
512  COMPILE_ASSERT(
513      !( is_non_const_reference<X1>::value ),
514      do_not_bind_functions_with_nonconst_ref);
515
516  typedef base::true_type IsMethod;
517
518  static R DoInvoke(InvokerStorageBase* base) {
519    StorageType* invoker = static_cast<StorageType*>(base);
520    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_));
521  }
522};
523
524// Const Method: Arity 1 -> 0.
525template <typename StorageType, typename R, typename T, typename X1>
526struct FunctionTraits2<StorageType, R(T::*)(X1) const> {
527  COMPILE_ASSERT(
528      !(is_non_const_reference<X1>::value ),
529      do_not_bind_functions_with_nonconst_ref);
530
531  typedef base::true_type IsMethod;
532
533  static R DoInvoke(InvokerStorageBase* base ) {
534    StorageType* invoker = static_cast<StorageType*>(base);
535    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_));
536  }
537};
538
539// Function: Arity 3 -> 1.
540template <typename StorageType, typename R,typename X1, typename X2,
541    typename X3>
542struct FunctionTraits2<StorageType, R(*)(X1, X2, X3)> {
543  COMPILE_ASSERT(
544      !( is_non_const_reference<X1>::value ||
545          is_non_const_reference<X2>::value ||
546          is_non_const_reference<X3>::value ),
547      do_not_bind_functions_with_nonconst_ref);
548
549  typedef base::false_type IsMethod;
550
551  static R DoInvoke(InvokerStorageBase* base, const X3& x3) {
552    StorageType* invoker = static_cast<StorageType*>(base);
553    return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3);
554  }
555};
556
557// Method: Arity 2 -> 1.
558template <typename StorageType, typename R, typename T, typename X1,
559    typename X2>
560struct FunctionTraits2<StorageType, R(T::*)(X1, X2)> {
561  COMPILE_ASSERT(
562      !( is_non_const_reference<X1>::value ||
563          is_non_const_reference<X2>::value ),
564      do_not_bind_functions_with_nonconst_ref);
565
566  typedef base::true_type IsMethod;
567
568  static R DoInvoke(InvokerStorageBase* base, const X2& x2) {
569    StorageType* invoker = static_cast<StorageType*>(base);
570    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2);
571  }
572};
573
574// Const Method: Arity 2 -> 1.
575template <typename StorageType, typename R, typename T, typename X1,
576    typename X2>
577struct FunctionTraits2<StorageType, R(T::*)(X1, X2) const> {
578  COMPILE_ASSERT(
579      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
580          ),
581      do_not_bind_functions_with_nonconst_ref);
582
583  typedef base::true_type IsMethod;
584
585  static R DoInvoke(InvokerStorageBase* base,  const X2& x2) {
586    StorageType* invoker = static_cast<StorageType*>(base);
587    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2);
588  }
589};
590
591// Function: Arity 4 -> 2.
592template <typename StorageType, typename R,typename X1, typename X2,
593    typename X3, typename X4>
594struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4)> {
595  COMPILE_ASSERT(
596      !( is_non_const_reference<X1>::value ||
597          is_non_const_reference<X2>::value ||
598          is_non_const_reference<X3>::value ||
599          is_non_const_reference<X4>::value ),
600      do_not_bind_functions_with_nonconst_ref);
601
602  typedef base::false_type IsMethod;
603
604  static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4) {
605    StorageType* invoker = static_cast<StorageType*>(base);
606    return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4);
607  }
608};
609
610// Method: Arity 3 -> 2.
611template <typename StorageType, typename R, typename T, typename X1,
612    typename X2, typename X3>
613struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3)> {
614  COMPILE_ASSERT(
615      !( is_non_const_reference<X1>::value ||
616          is_non_const_reference<X2>::value ||
617          is_non_const_reference<X3>::value ),
618      do_not_bind_functions_with_nonconst_ref);
619
620  typedef base::true_type IsMethod;
621
622  static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3) {
623    StorageType* invoker = static_cast<StorageType*>(base);
624    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3);
625  }
626};
627
628// Const Method: Arity 3 -> 2.
629template <typename StorageType, typename R, typename T, typename X1,
630    typename X2, typename X3>
631struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3) const> {
632  COMPILE_ASSERT(
633      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
634          || is_non_const_reference<X3>::value ),
635      do_not_bind_functions_with_nonconst_ref);
636
637  typedef base::true_type IsMethod;
638
639  static R DoInvoke(InvokerStorageBase* base,  const X2& x2, const X3& x3) {
640    StorageType* invoker = static_cast<StorageType*>(base);
641    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3);
642  }
643};
644
645// Function: Arity 5 -> 3.
646template <typename StorageType, typename R,typename X1, typename X2,
647    typename X3, typename X4, typename X5>
648struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4, X5)> {
649  COMPILE_ASSERT(
650      !( is_non_const_reference<X1>::value ||
651          is_non_const_reference<X2>::value ||
652          is_non_const_reference<X3>::value ||
653          is_non_const_reference<X4>::value ||
654          is_non_const_reference<X5>::value ),
655      do_not_bind_functions_with_nonconst_ref);
656
657  typedef base::false_type IsMethod;
658
659  static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4,
660      const X5& x5) {
661    StorageType* invoker = static_cast<StorageType*>(base);
662    return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5);
663  }
664};
665
666// Method: Arity 4 -> 3.
667template <typename StorageType, typename R, typename T, typename X1,
668    typename X2, typename X3, typename X4>
669struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4)> {
670  COMPILE_ASSERT(
671      !( is_non_const_reference<X1>::value ||
672          is_non_const_reference<X2>::value ||
673          is_non_const_reference<X3>::value ||
674          is_non_const_reference<X4>::value ),
675      do_not_bind_functions_with_nonconst_ref);
676
677  typedef base::true_type IsMethod;
678
679  static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
680      const X4& x4) {
681    StorageType* invoker = static_cast<StorageType*>(base);
682    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3,
683        x4);
684  }
685};
686
687// Const Method: Arity 4 -> 3.
688template <typename StorageType, typename R, typename T, typename X1,
689    typename X2, typename X3, typename X4>
690struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4) const> {
691  COMPILE_ASSERT(
692      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
693          || is_non_const_reference<X3>::value ||
694          is_non_const_reference<X4>::value ),
695      do_not_bind_functions_with_nonconst_ref);
696
697  typedef base::true_type IsMethod;
698
699  static R DoInvoke(InvokerStorageBase* base,  const X2& x2, const X3& x3,
700      const X4& x4) {
701    StorageType* invoker = static_cast<StorageType*>(base);
702    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3,
703        x4);
704  }
705};
706
707// Function: Arity 6 -> 4.
708template <typename StorageType, typename R,typename X1, typename X2,
709    typename X3, typename X4, typename X5, typename X6>
710struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
711  COMPILE_ASSERT(
712      !( is_non_const_reference<X1>::value ||
713          is_non_const_reference<X2>::value ||
714          is_non_const_reference<X3>::value ||
715          is_non_const_reference<X4>::value ||
716          is_non_const_reference<X5>::value ||
717          is_non_const_reference<X6>::value ),
718      do_not_bind_functions_with_nonconst_ref);
719
720  typedef base::false_type IsMethod;
721
722  static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4,
723      const X5& x5, const X6& x6) {
724    StorageType* invoker = static_cast<StorageType*>(base);
725    return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5,
726        x6);
727  }
728};
729
730// Method: Arity 5 -> 4.
731template <typename StorageType, typename R, typename T, typename X1,
732    typename X2, typename X3, typename X4, typename X5>
733struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
734  COMPILE_ASSERT(
735      !( is_non_const_reference<X1>::value ||
736          is_non_const_reference<X2>::value ||
737          is_non_const_reference<X3>::value ||
738          is_non_const_reference<X4>::value ||
739          is_non_const_reference<X5>::value ),
740      do_not_bind_functions_with_nonconst_ref);
741
742  typedef base::true_type IsMethod;
743
744  static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
745      const X4& x4, const X5& x5) {
746    StorageType* invoker = static_cast<StorageType*>(base);
747    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3,
748        x4, x5);
749  }
750};
751
752// Const Method: Arity 5 -> 4.
753template <typename StorageType, typename R, typename T, typename X1,
754    typename X2, typename X3, typename X4, typename X5>
755struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
756  COMPILE_ASSERT(
757      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
758          || is_non_const_reference<X3>::value ||
759          is_non_const_reference<X4>::value ||
760          is_non_const_reference<X5>::value ),
761      do_not_bind_functions_with_nonconst_ref);
762
763  typedef base::true_type IsMethod;
764
765  static R DoInvoke(InvokerStorageBase* base,  const X2& x2, const X3& x3,
766      const X4& x4, const X5& x5) {
767    StorageType* invoker = static_cast<StorageType*>(base);
768    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3,
769        x4, x5);
770  }
771};
772
773template <typename StorageType, typename Sig>
774struct FunctionTraits3;
775
776// Function: Arity 3 -> 0.
777template <typename StorageType, typename R,typename X1, typename X2,
778    typename X3>
779struct FunctionTraits3<StorageType, R(*)(X1, X2, X3)> {
780  COMPILE_ASSERT(
781      !( is_non_const_reference<X1>::value ||
782          is_non_const_reference<X2>::value ||
783          is_non_const_reference<X3>::value ),
784      do_not_bind_functions_with_nonconst_ref);
785
786  typedef base::false_type IsMethod;
787
788  static R DoInvoke(InvokerStorageBase* base) {
789    StorageType* invoker = static_cast<StorageType*>(base);
790    return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
791        Unwrap(invoker->p3_));
792  }
793};
794
795// Method: Arity 2 -> 0.
796template <typename StorageType, typename R, typename T, typename X1,
797    typename X2>
798struct FunctionTraits3<StorageType, R(T::*)(X1, X2)> {
799  COMPILE_ASSERT(
800      !( is_non_const_reference<X1>::value ||
801          is_non_const_reference<X2>::value ),
802      do_not_bind_functions_with_nonconst_ref);
803
804  typedef base::true_type IsMethod;
805
806  static R DoInvoke(InvokerStorageBase* base) {
807    StorageType* invoker = static_cast<StorageType*>(base);
808    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
809        Unwrap(invoker->p3_));
810  }
811};
812
813// Const Method: Arity 2 -> 0.
814template <typename StorageType, typename R, typename T, typename X1,
815    typename X2>
816struct FunctionTraits3<StorageType, R(T::*)(X1, X2) const> {
817  COMPILE_ASSERT(
818      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
819          ),
820      do_not_bind_functions_with_nonconst_ref);
821
822  typedef base::true_type IsMethod;
823
824  static R DoInvoke(InvokerStorageBase* base ) {
825    StorageType* invoker = static_cast<StorageType*>(base);
826    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
827        Unwrap(invoker->p3_));
828  }
829};
830
831// Function: Arity 4 -> 1.
832template <typename StorageType, typename R,typename X1, typename X2,
833    typename X3, typename X4>
834struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4)> {
835  COMPILE_ASSERT(
836      !( is_non_const_reference<X1>::value ||
837          is_non_const_reference<X2>::value ||
838          is_non_const_reference<X3>::value ||
839          is_non_const_reference<X4>::value ),
840      do_not_bind_functions_with_nonconst_ref);
841
842  typedef base::false_type IsMethod;
843
844  static R DoInvoke(InvokerStorageBase* base, const X4& x4) {
845    StorageType* invoker = static_cast<StorageType*>(base);
846    return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
847        Unwrap(invoker->p3_), x4);
848  }
849};
850
851// Method: Arity 3 -> 1.
852template <typename StorageType, typename R, typename T, typename X1,
853    typename X2, typename X3>
854struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3)> {
855  COMPILE_ASSERT(
856      !( is_non_const_reference<X1>::value ||
857          is_non_const_reference<X2>::value ||
858          is_non_const_reference<X3>::value ),
859      do_not_bind_functions_with_nonconst_ref);
860
861  typedef base::true_type IsMethod;
862
863  static R DoInvoke(InvokerStorageBase* base, const X3& x3) {
864    StorageType* invoker = static_cast<StorageType*>(base);
865    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
866        Unwrap(invoker->p3_), x3);
867  }
868};
869
870// Const Method: Arity 3 -> 1.
871template <typename StorageType, typename R, typename T, typename X1,
872    typename X2, typename X3>
873struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3) const> {
874  COMPILE_ASSERT(
875      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
876          || is_non_const_reference<X3>::value ),
877      do_not_bind_functions_with_nonconst_ref);
878
879  typedef base::true_type IsMethod;
880
881  static R DoInvoke(InvokerStorageBase* base,  const X3& x3) {
882    StorageType* invoker = static_cast<StorageType*>(base);
883    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
884        Unwrap(invoker->p3_), x3);
885  }
886};
887
888// Function: Arity 5 -> 2.
889template <typename StorageType, typename R,typename X1, typename X2,
890    typename X3, typename X4, typename X5>
891struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4, X5)> {
892  COMPILE_ASSERT(
893      !( is_non_const_reference<X1>::value ||
894          is_non_const_reference<X2>::value ||
895          is_non_const_reference<X3>::value ||
896          is_non_const_reference<X4>::value ||
897          is_non_const_reference<X5>::value ),
898      do_not_bind_functions_with_nonconst_ref);
899
900  typedef base::false_type IsMethod;
901
902  static R DoInvoke(InvokerStorageBase* base, const X4& x4, const X5& x5) {
903    StorageType* invoker = static_cast<StorageType*>(base);
904    return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
905        Unwrap(invoker->p3_), x4, x5);
906  }
907};
908
909// Method: Arity 4 -> 2.
910template <typename StorageType, typename R, typename T, typename X1,
911    typename X2, typename X3, typename X4>
912struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4)> {
913  COMPILE_ASSERT(
914      !( is_non_const_reference<X1>::value ||
915          is_non_const_reference<X2>::value ||
916          is_non_const_reference<X3>::value ||
917          is_non_const_reference<X4>::value ),
918      do_not_bind_functions_with_nonconst_ref);
919
920  typedef base::true_type IsMethod;
921
922  static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4) {
923    StorageType* invoker = static_cast<StorageType*>(base);
924    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
925        Unwrap(invoker->p3_), x3, x4);
926  }
927};
928
929// Const Method: Arity 4 -> 2.
930template <typename StorageType, typename R, typename T, typename X1,
931    typename X2, typename X3, typename X4>
932struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4) const> {
933  COMPILE_ASSERT(
934      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
935          || is_non_const_reference<X3>::value ||
936          is_non_const_reference<X4>::value ),
937      do_not_bind_functions_with_nonconst_ref);
938
939  typedef base::true_type IsMethod;
940
941  static R DoInvoke(InvokerStorageBase* base,  const X3& x3, const X4& x4) {
942    StorageType* invoker = static_cast<StorageType*>(base);
943    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
944        Unwrap(invoker->p3_), x3, x4);
945  }
946};
947
948// Function: Arity 6 -> 3.
949template <typename StorageType, typename R,typename X1, typename X2,
950    typename X3, typename X4, typename X5, typename X6>
951struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
952  COMPILE_ASSERT(
953      !( is_non_const_reference<X1>::value ||
954          is_non_const_reference<X2>::value ||
955          is_non_const_reference<X3>::value ||
956          is_non_const_reference<X4>::value ||
957          is_non_const_reference<X5>::value ||
958          is_non_const_reference<X6>::value ),
959      do_not_bind_functions_with_nonconst_ref);
960
961  typedef base::false_type IsMethod;
962
963  static R DoInvoke(InvokerStorageBase* base, const X4& x4, const X5& x5,
964      const X6& x6) {
965    StorageType* invoker = static_cast<StorageType*>(base);
966    return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
967        Unwrap(invoker->p3_), x4, x5, x6);
968  }
969};
970
971// Method: Arity 5 -> 3.
972template <typename StorageType, typename R, typename T, typename X1,
973    typename X2, typename X3, typename X4, typename X5>
974struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
975  COMPILE_ASSERT(
976      !( is_non_const_reference<X1>::value ||
977          is_non_const_reference<X2>::value ||
978          is_non_const_reference<X3>::value ||
979          is_non_const_reference<X4>::value ||
980          is_non_const_reference<X5>::value ),
981      do_not_bind_functions_with_nonconst_ref);
982
983  typedef base::true_type IsMethod;
984
985  static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4,
986      const X5& x5) {
987    StorageType* invoker = static_cast<StorageType*>(base);
988    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
989        Unwrap(invoker->p3_), x3, x4, x5);
990  }
991};
992
993// Const Method: Arity 5 -> 3.
994template <typename StorageType, typename R, typename T, typename X1,
995    typename X2, typename X3, typename X4, typename X5>
996struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
997  COMPILE_ASSERT(
998      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
999          || is_non_const_reference<X3>::value ||
1000          is_non_const_reference<X4>::value ||
1001          is_non_const_reference<X5>::value ),
1002      do_not_bind_functions_with_nonconst_ref);
1003
1004  typedef base::true_type IsMethod;
1005
1006  static R DoInvoke(InvokerStorageBase* base,  const X3& x3, const X4& x4,
1007      const X5& x5) {
1008    StorageType* invoker = static_cast<StorageType*>(base);
1009    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1010        Unwrap(invoker->p3_), x3, x4, x5);
1011  }
1012};
1013
1014template <typename StorageType, typename Sig>
1015struct FunctionTraits4;
1016
1017// Function: Arity 4 -> 0.
1018template <typename StorageType, typename R,typename X1, typename X2,
1019    typename X3, typename X4>
1020struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4)> {
1021  COMPILE_ASSERT(
1022      !( is_non_const_reference<X1>::value ||
1023          is_non_const_reference<X2>::value ||
1024          is_non_const_reference<X3>::value ||
1025          is_non_const_reference<X4>::value ),
1026      do_not_bind_functions_with_nonconst_ref);
1027
1028  typedef base::false_type IsMethod;
1029
1030  static R DoInvoke(InvokerStorageBase* base) {
1031    StorageType* invoker = static_cast<StorageType*>(base);
1032    return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
1033        Unwrap(invoker->p3_), Unwrap(invoker->p4_));
1034  }
1035};
1036
1037// Method: Arity 3 -> 0.
1038template <typename StorageType, typename R, typename T, typename X1,
1039    typename X2, typename X3>
1040struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3)> {
1041  COMPILE_ASSERT(
1042      !( is_non_const_reference<X1>::value ||
1043          is_non_const_reference<X2>::value ||
1044          is_non_const_reference<X3>::value ),
1045      do_not_bind_functions_with_nonconst_ref);
1046
1047  typedef base::true_type IsMethod;
1048
1049  static R DoInvoke(InvokerStorageBase* base) {
1050    StorageType* invoker = static_cast<StorageType*>(base);
1051    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1052        Unwrap(invoker->p3_), Unwrap(invoker->p4_));
1053  }
1054};
1055
1056// Const Method: Arity 3 -> 0.
1057template <typename StorageType, typename R, typename T, typename X1,
1058    typename X2, typename X3>
1059struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3) const> {
1060  COMPILE_ASSERT(
1061      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
1062          || is_non_const_reference<X3>::value ),
1063      do_not_bind_functions_with_nonconst_ref);
1064
1065  typedef base::true_type IsMethod;
1066
1067  static R DoInvoke(InvokerStorageBase* base ) {
1068    StorageType* invoker = static_cast<StorageType*>(base);
1069    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1070        Unwrap(invoker->p3_), Unwrap(invoker->p4_));
1071  }
1072};
1073
1074// Function: Arity 5 -> 1.
1075template <typename StorageType, typename R,typename X1, typename X2,
1076    typename X3, typename X4, typename X5>
1077struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4, X5)> {
1078  COMPILE_ASSERT(
1079      !( is_non_const_reference<X1>::value ||
1080          is_non_const_reference<X2>::value ||
1081          is_non_const_reference<X3>::value ||
1082          is_non_const_reference<X4>::value ||
1083          is_non_const_reference<X5>::value ),
1084      do_not_bind_functions_with_nonconst_ref);
1085
1086  typedef base::false_type IsMethod;
1087
1088  static R DoInvoke(InvokerStorageBase* base, const X5& x5) {
1089    StorageType* invoker = static_cast<StorageType*>(base);
1090    return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
1091        Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5);
1092  }
1093};
1094
1095// Method: Arity 4 -> 1.
1096template <typename StorageType, typename R, typename T, typename X1,
1097    typename X2, typename X3, typename X4>
1098struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4)> {
1099  COMPILE_ASSERT(
1100      !( is_non_const_reference<X1>::value ||
1101          is_non_const_reference<X2>::value ||
1102          is_non_const_reference<X3>::value ||
1103          is_non_const_reference<X4>::value ),
1104      do_not_bind_functions_with_nonconst_ref);
1105
1106  typedef base::true_type IsMethod;
1107
1108  static R DoInvoke(InvokerStorageBase* base, const X4& x4) {
1109    StorageType* invoker = static_cast<StorageType*>(base);
1110    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1111        Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4);
1112  }
1113};
1114
1115// Const Method: Arity 4 -> 1.
1116template <typename StorageType, typename R, typename T, typename X1,
1117    typename X2, typename X3, typename X4>
1118struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4) const> {
1119  COMPILE_ASSERT(
1120      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
1121          || is_non_const_reference<X3>::value ||
1122          is_non_const_reference<X4>::value ),
1123      do_not_bind_functions_with_nonconst_ref);
1124
1125  typedef base::true_type IsMethod;
1126
1127  static R DoInvoke(InvokerStorageBase* base,  const X4& x4) {
1128    StorageType* invoker = static_cast<StorageType*>(base);
1129    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1130        Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4);
1131  }
1132};
1133
1134// Function: Arity 6 -> 2.
1135template <typename StorageType, typename R,typename X1, typename X2,
1136    typename X3, typename X4, typename X5, typename X6>
1137struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
1138  COMPILE_ASSERT(
1139      !( is_non_const_reference<X1>::value ||
1140          is_non_const_reference<X2>::value ||
1141          is_non_const_reference<X3>::value ||
1142          is_non_const_reference<X4>::value ||
1143          is_non_const_reference<X5>::value ||
1144          is_non_const_reference<X6>::value ),
1145      do_not_bind_functions_with_nonconst_ref);
1146
1147  typedef base::false_type IsMethod;
1148
1149  static R DoInvoke(InvokerStorageBase* base, const X5& x5, const X6& x6) {
1150    StorageType* invoker = static_cast<StorageType*>(base);
1151    return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
1152        Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5, x6);
1153  }
1154};
1155
1156// Method: Arity 5 -> 2.
1157template <typename StorageType, typename R, typename T, typename X1,
1158    typename X2, typename X3, typename X4, typename X5>
1159struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
1160  COMPILE_ASSERT(
1161      !( is_non_const_reference<X1>::value ||
1162          is_non_const_reference<X2>::value ||
1163          is_non_const_reference<X3>::value ||
1164          is_non_const_reference<X4>::value ||
1165          is_non_const_reference<X5>::value ),
1166      do_not_bind_functions_with_nonconst_ref);
1167
1168  typedef base::true_type IsMethod;
1169
1170  static R DoInvoke(InvokerStorageBase* base, const X4& x4, const X5& x5) {
1171    StorageType* invoker = static_cast<StorageType*>(base);
1172    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1173        Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4, x5);
1174  }
1175};
1176
1177// Const Method: Arity 5 -> 2.
1178template <typename StorageType, typename R, typename T, typename X1,
1179    typename X2, typename X3, typename X4, typename X5>
1180struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
1181  COMPILE_ASSERT(
1182      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
1183          || is_non_const_reference<X3>::value ||
1184          is_non_const_reference<X4>::value ||
1185          is_non_const_reference<X5>::value ),
1186      do_not_bind_functions_with_nonconst_ref);
1187
1188  typedef base::true_type IsMethod;
1189
1190  static R DoInvoke(InvokerStorageBase* base,  const X4& x4, const X5& x5) {
1191    StorageType* invoker = static_cast<StorageType*>(base);
1192    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1193        Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4, x5);
1194  }
1195};
1196
1197template <typename StorageType, typename Sig>
1198struct FunctionTraits5;
1199
1200// Function: Arity 5 -> 0.
1201template <typename StorageType, typename R,typename X1, typename X2,
1202    typename X3, typename X4, typename X5>
1203struct FunctionTraits5<StorageType, R(*)(X1, X2, X3, X4, X5)> {
1204  COMPILE_ASSERT(
1205      !( is_non_const_reference<X1>::value ||
1206          is_non_const_reference<X2>::value ||
1207          is_non_const_reference<X3>::value ||
1208          is_non_const_reference<X4>::value ||
1209          is_non_const_reference<X5>::value ),
1210      do_not_bind_functions_with_nonconst_ref);
1211
1212  typedef base::false_type IsMethod;
1213
1214  static R DoInvoke(InvokerStorageBase* base) {
1215    StorageType* invoker = static_cast<StorageType*>(base);
1216    return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
1217        Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_));
1218  }
1219};
1220
1221// Method: Arity 4 -> 0.
1222template <typename StorageType, typename R, typename T, typename X1,
1223    typename X2, typename X3, typename X4>
1224struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4)> {
1225  COMPILE_ASSERT(
1226      !( is_non_const_reference<X1>::value ||
1227          is_non_const_reference<X2>::value ||
1228          is_non_const_reference<X3>::value ||
1229          is_non_const_reference<X4>::value ),
1230      do_not_bind_functions_with_nonconst_ref);
1231
1232  typedef base::true_type IsMethod;
1233
1234  static R DoInvoke(InvokerStorageBase* base) {
1235    StorageType* invoker = static_cast<StorageType*>(base);
1236    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1237        Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_));
1238  }
1239};
1240
1241// Const Method: Arity 4 -> 0.
1242template <typename StorageType, typename R, typename T, typename X1,
1243    typename X2, typename X3, typename X4>
1244struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4) const> {
1245  COMPILE_ASSERT(
1246      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
1247          || is_non_const_reference<X3>::value ||
1248          is_non_const_reference<X4>::value ),
1249      do_not_bind_functions_with_nonconst_ref);
1250
1251  typedef base::true_type IsMethod;
1252
1253  static R DoInvoke(InvokerStorageBase* base ) {
1254    StorageType* invoker = static_cast<StorageType*>(base);
1255    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1256        Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_));
1257  }
1258};
1259
1260// Function: Arity 6 -> 1.
1261template <typename StorageType, typename R,typename X1, typename X2,
1262    typename X3, typename X4, typename X5, typename X6>
1263struct FunctionTraits5<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
1264  COMPILE_ASSERT(
1265      !( is_non_const_reference<X1>::value ||
1266          is_non_const_reference<X2>::value ||
1267          is_non_const_reference<X3>::value ||
1268          is_non_const_reference<X4>::value ||
1269          is_non_const_reference<X5>::value ||
1270          is_non_const_reference<X6>::value ),
1271      do_not_bind_functions_with_nonconst_ref);
1272
1273  typedef base::false_type IsMethod;
1274
1275  static R DoInvoke(InvokerStorageBase* base, const X6& x6) {
1276    StorageType* invoker = static_cast<StorageType*>(base);
1277    return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
1278        Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x6);
1279  }
1280};
1281
1282// Method: Arity 5 -> 1.
1283template <typename StorageType, typename R, typename T, typename X1,
1284    typename X2, typename X3, typename X4, typename X5>
1285struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
1286  COMPILE_ASSERT(
1287      !( is_non_const_reference<X1>::value ||
1288          is_non_const_reference<X2>::value ||
1289          is_non_const_reference<X3>::value ||
1290          is_non_const_reference<X4>::value ||
1291          is_non_const_reference<X5>::value ),
1292      do_not_bind_functions_with_nonconst_ref);
1293
1294  typedef base::true_type IsMethod;
1295
1296  static R DoInvoke(InvokerStorageBase* base, const X5& x5) {
1297    StorageType* invoker = static_cast<StorageType*>(base);
1298    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1299        Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5);
1300  }
1301};
1302
1303// Const Method: Arity 5 -> 1.
1304template <typename StorageType, typename R, typename T, typename X1,
1305    typename X2, typename X3, typename X4, typename X5>
1306struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
1307  COMPILE_ASSERT(
1308      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
1309          || is_non_const_reference<X3>::value ||
1310          is_non_const_reference<X4>::value ||
1311          is_non_const_reference<X5>::value ),
1312      do_not_bind_functions_with_nonconst_ref);
1313
1314  typedef base::true_type IsMethod;
1315
1316  static R DoInvoke(InvokerStorageBase* base,  const X5& x5) {
1317    StorageType* invoker = static_cast<StorageType*>(base);
1318    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1319        Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5);
1320  }
1321};
1322
1323template <typename StorageType, typename Sig>
1324struct FunctionTraits6;
1325
1326// Function: Arity 6 -> 0.
1327template <typename StorageType, typename R,typename X1, typename X2,
1328    typename X3, typename X4, typename X5, typename X6>
1329struct FunctionTraits6<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
1330  COMPILE_ASSERT(
1331      !( is_non_const_reference<X1>::value ||
1332          is_non_const_reference<X2>::value ||
1333          is_non_const_reference<X3>::value ||
1334          is_non_const_reference<X4>::value ||
1335          is_non_const_reference<X5>::value ||
1336          is_non_const_reference<X6>::value ),
1337      do_not_bind_functions_with_nonconst_ref);
1338
1339  typedef base::false_type IsMethod;
1340
1341  static R DoInvoke(InvokerStorageBase* base) {
1342    StorageType* invoker = static_cast<StorageType*>(base);
1343    return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
1344        Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_),
1345        Unwrap(invoker->p6_));
1346  }
1347};
1348
1349// Method: Arity 5 -> 0.
1350template <typename StorageType, typename R, typename T, typename X1,
1351    typename X2, typename X3, typename X4, typename X5>
1352struct FunctionTraits6<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
1353  COMPILE_ASSERT(
1354      !( is_non_const_reference<X1>::value ||
1355          is_non_const_reference<X2>::value ||
1356          is_non_const_reference<X3>::value ||
1357          is_non_const_reference<X4>::value ||
1358          is_non_const_reference<X5>::value ),
1359      do_not_bind_functions_with_nonconst_ref);
1360
1361  typedef base::true_type IsMethod;
1362
1363  static R DoInvoke(InvokerStorageBase* base) {
1364    StorageType* invoker = static_cast<StorageType*>(base);
1365    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1366        Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_),
1367        Unwrap(invoker->p6_));
1368  }
1369};
1370
1371// Const Method: Arity 5 -> 0.
1372template <typename StorageType, typename R, typename T, typename X1,
1373    typename X2, typename X3, typename X4, typename X5>
1374struct FunctionTraits6<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
1375  COMPILE_ASSERT(
1376      !(is_non_const_reference<X1>::value || is_non_const_reference<X2>::value
1377          || is_non_const_reference<X3>::value ||
1378          is_non_const_reference<X4>::value ||
1379          is_non_const_reference<X5>::value ),
1380      do_not_bind_functions_with_nonconst_ref);
1381
1382  typedef base::true_type IsMethod;
1383
1384  static R DoInvoke(InvokerStorageBase* base ) {
1385    StorageType* invoker = static_cast<StorageType*>(base);
1386    return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1387        Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_),
1388        Unwrap(invoker->p6_));
1389  }
1390};
1391
1392
1393// These are the actual storage classes for the invokers.
1394//
1395// Though these types are "classes", they are being used as structs with
1396// all member variable public.  We cannot make it a struct because it inherits
1397// from a class which causes a compiler warning.  We cannot add a "Run()" method
1398// that forwards the unbound arguments because that would require we unwrap the
1399// Sig type like in FunctionTraitsN above to know the return type, and the arity
1400// of Run().
1401//
1402// An alternate solution would be to merge FunctionTraitsN and InvokerStorageN,
1403// but the generated code seemed harder to read.
1404
1405template <typename Sig>
1406class InvokerStorage0 : public InvokerStorageBase {
1407 public:
1408  typedef InvokerStorage0 StorageType;
1409  typedef FunctionTraits0<StorageType, Sig> FunctionTraits;
1410  typedef typename FunctionTraits::IsMethod IsMethod;
1411
1412
1413
1414  InvokerStorage0(Sig f)
1415      : f_(f) {
1416  }
1417
1418  virtual ~InvokerStorage0() {  }
1419
1420  Sig f_;
1421};
1422
1423template <typename Sig, typename P1>
1424class InvokerStorage1 : public InvokerStorageBase {
1425 public:
1426  typedef InvokerStorage1 StorageType;
1427  typedef FunctionTraits1<StorageType, Sig> FunctionTraits;
1428  typedef typename FunctionTraits::IsMethod IsMethod;
1429
1430  // For methods, we need to be careful for parameter 1.  We skip the
1431  // scoped_refptr check because the binder itself takes care of this. We also
1432  // disallow binding of an array as the method's target object.
1433  COMPILE_ASSERT(IsMethod::value ||
1434                 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1435                 p1_is_refcounted_type_and_needs_scoped_refptr);
1436  COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1437                 first_bound_argument_to_method_cannot_be_array);
1438
1439
1440  InvokerStorage1(Sig f, const P1& p1)
1441      : f_(f), p1_(static_cast<typename BindType<P1>::StorageType>(p1)) {
1442    MaybeRefcount<IsMethod, P1>::AddRef(p1_);
1443  }
1444
1445  virtual ~InvokerStorage1() {
1446    MaybeRefcount<IsMethod, P1>::Release(p1_);
1447  }
1448
1449  Sig f_;
1450  typename BindType<P1>::StorageType p1_;
1451};
1452
1453template <typename Sig, typename P1, typename P2>
1454class InvokerStorage2 : public InvokerStorageBase {
1455 public:
1456  typedef InvokerStorage2 StorageType;
1457  typedef FunctionTraits2<StorageType, Sig> FunctionTraits;
1458  typedef typename FunctionTraits::IsMethod IsMethod;
1459
1460  // For methods, we need to be careful for parameter 1.  We skip the
1461  // scoped_refptr check because the binder itself takes care of this. We also
1462  // disallow binding of an array as the method's target object.
1463  COMPILE_ASSERT(IsMethod::value ||
1464                 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1465                 p1_is_refcounted_type_and_needs_scoped_refptr);
1466  COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1467                 first_bound_argument_to_method_cannot_be_array);
1468  COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value,
1469                 p2_is_refcounted_type_and_needs_scoped_refptr);
1470
1471
1472  InvokerStorage2(Sig f, const P1& p1, const P2& p2)
1473      : f_(f), p1_(static_cast<typename BindType<P1>::StorageType>(p1)),
1474          p2_(static_cast<typename BindType<P2>::StorageType>(p2)) {
1475    MaybeRefcount<IsMethod, P1>::AddRef(p1_);
1476  }
1477
1478  virtual ~InvokerStorage2() {
1479    MaybeRefcount<IsMethod, P1>::Release(p1_);
1480  }
1481
1482  Sig f_;
1483  typename BindType<P1>::StorageType p1_;
1484  typename BindType<P2>::StorageType p2_;
1485};
1486
1487template <typename Sig, typename P1, typename P2, typename P3>
1488class InvokerStorage3 : public InvokerStorageBase {
1489 public:
1490  typedef InvokerStorage3 StorageType;
1491  typedef FunctionTraits3<StorageType, Sig> FunctionTraits;
1492  typedef typename FunctionTraits::IsMethod IsMethod;
1493
1494  // For methods, we need to be careful for parameter 1.  We skip the
1495  // scoped_refptr check because the binder itself takes care of this. We also
1496  // disallow binding of an array as the method's target object.
1497  COMPILE_ASSERT(IsMethod::value ||
1498                 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1499                 p1_is_refcounted_type_and_needs_scoped_refptr);
1500  COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1501                 first_bound_argument_to_method_cannot_be_array);
1502  COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value,
1503                 p2_is_refcounted_type_and_needs_scoped_refptr);
1504  COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P3>::value,
1505                 p3_is_refcounted_type_and_needs_scoped_refptr);
1506
1507
1508  InvokerStorage3(Sig f, const P1& p1, const P2& p2, const P3& p3)
1509      : f_(f), p1_(static_cast<typename BindType<P1>::StorageType>(p1)),
1510          p2_(static_cast<typename BindType<P2>::StorageType>(p2)),
1511          p3_(static_cast<typename BindType<P3>::StorageType>(p3)) {
1512    MaybeRefcount<IsMethod, P1>::AddRef(p1_);
1513  }
1514
1515  virtual ~InvokerStorage3() {
1516    MaybeRefcount<IsMethod, P1>::Release(p1_);
1517  }
1518
1519  Sig f_;
1520  typename BindType<P1>::StorageType p1_;
1521  typename BindType<P2>::StorageType p2_;
1522  typename BindType<P3>::StorageType p3_;
1523};
1524
1525template <typename Sig, typename P1, typename P2, typename P3, typename P4>
1526class InvokerStorage4 : public InvokerStorageBase {
1527 public:
1528  typedef InvokerStorage4 StorageType;
1529  typedef FunctionTraits4<StorageType, Sig> FunctionTraits;
1530  typedef typename FunctionTraits::IsMethod IsMethod;
1531
1532  // For methods, we need to be careful for parameter 1.  We skip the
1533  // scoped_refptr check because the binder itself takes care of this. We also
1534  // disallow binding of an array as the method's target object.
1535  COMPILE_ASSERT(IsMethod::value ||
1536                 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1537                 p1_is_refcounted_type_and_needs_scoped_refptr);
1538  COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1539                 first_bound_argument_to_method_cannot_be_array);
1540  COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value,
1541                 p2_is_refcounted_type_and_needs_scoped_refptr);
1542  COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P3>::value,
1543                 p3_is_refcounted_type_and_needs_scoped_refptr);
1544  COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P4>::value,
1545                 p4_is_refcounted_type_and_needs_scoped_refptr);
1546
1547
1548  InvokerStorage4(Sig f, const P1& p1, const P2& p2, const P3& p3, const P4& p4)
1549      : f_(f), p1_(static_cast<typename BindType<P1>::StorageType>(p1)),
1550          p2_(static_cast<typename BindType<P2>::StorageType>(p2)),
1551          p3_(static_cast<typename BindType<P3>::StorageType>(p3)),
1552          p4_(static_cast<typename BindType<P4>::StorageType>(p4)) {
1553    MaybeRefcount<IsMethod, P1>::AddRef(p1_);
1554  }
1555
1556  virtual ~InvokerStorage4() {
1557    MaybeRefcount<IsMethod, P1>::Release(p1_);
1558  }
1559
1560  Sig f_;
1561  typename BindType<P1>::StorageType p1_;
1562  typename BindType<P2>::StorageType p2_;
1563  typename BindType<P3>::StorageType p3_;
1564  typename BindType<P4>::StorageType p4_;
1565};
1566
1567template <typename Sig, typename P1, typename P2, typename P3, typename P4,
1568    typename P5>
1569class InvokerStorage5 : public InvokerStorageBase {
1570 public:
1571  typedef InvokerStorage5 StorageType;
1572  typedef FunctionTraits5<StorageType, Sig> FunctionTraits;
1573  typedef typename FunctionTraits::IsMethod IsMethod;
1574
1575  // For methods, we need to be careful for parameter 1.  We skip the
1576  // scoped_refptr check because the binder itself takes care of this. We also
1577  // disallow binding of an array as the method's target object.
1578  COMPILE_ASSERT(IsMethod::value ||
1579                 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1580                 p1_is_refcounted_type_and_needs_scoped_refptr);
1581  COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1582                 first_bound_argument_to_method_cannot_be_array);
1583  COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value,
1584                 p2_is_refcounted_type_and_needs_scoped_refptr);
1585  COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P3>::value,
1586                 p3_is_refcounted_type_and_needs_scoped_refptr);
1587  COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P4>::value,
1588                 p4_is_refcounted_type_and_needs_scoped_refptr);
1589  COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P5>::value,
1590                 p5_is_refcounted_type_and_needs_scoped_refptr);
1591
1592
1593  InvokerStorage5(Sig f, const P1& p1, const P2& p2, const P3& p3,
1594      const P4& p4, const P5& p5)
1595      : f_(f), p1_(static_cast<typename BindType<P1>::StorageType>(p1)),
1596          p2_(static_cast<typename BindType<P2>::StorageType>(p2)),
1597          p3_(static_cast<typename BindType<P3>::StorageType>(p3)),
1598          p4_(static_cast<typename BindType<P4>::StorageType>(p4)),
1599          p5_(static_cast<typename BindType<P5>::StorageType>(p5)) {
1600    MaybeRefcount<IsMethod, P1>::AddRef(p1_);
1601  }
1602
1603  virtual ~InvokerStorage5() {
1604    MaybeRefcount<IsMethod, P1>::Release(p1_);
1605  }
1606
1607  Sig f_;
1608  typename BindType<P1>::StorageType p1_;
1609  typename BindType<P2>::StorageType p2_;
1610  typename BindType<P3>::StorageType p3_;
1611  typename BindType<P4>::StorageType p4_;
1612  typename BindType<P5>::StorageType p5_;
1613};
1614
1615template <typename Sig, typename P1, typename P2, typename P3, typename P4,
1616    typename P5, typename P6>
1617class InvokerStorage6 : public InvokerStorageBase {
1618 public:
1619  typedef InvokerStorage6 StorageType;
1620  typedef FunctionTraits6<StorageType, Sig> FunctionTraits;
1621  typedef typename FunctionTraits::IsMethod IsMethod;
1622
1623  // For methods, we need to be careful for parameter 1.  We skip the
1624  // scoped_refptr check because the binder itself takes care of this. We also
1625  // disallow binding of an array as the method's target object.
1626  COMPILE_ASSERT(IsMethod::value ||
1627                 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1628                 p1_is_refcounted_type_and_needs_scoped_refptr);
1629  COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1630                 first_bound_argument_to_method_cannot_be_array);
1631  COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value,
1632                 p2_is_refcounted_type_and_needs_scoped_refptr);
1633  COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P3>::value,
1634                 p3_is_refcounted_type_and_needs_scoped_refptr);
1635  COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P4>::value,
1636                 p4_is_refcounted_type_and_needs_scoped_refptr);
1637  COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P5>::value,
1638                 p5_is_refcounted_type_and_needs_scoped_refptr);
1639  COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P6>::value,
1640                 p6_is_refcounted_type_and_needs_scoped_refptr);
1641
1642
1643  InvokerStorage6(Sig f, const P1& p1, const P2& p2, const P3& p3,
1644      const P4& p4, const P5& p5, const P6& p6)
1645      : f_(f), p1_(static_cast<typename BindType<P1>::StorageType>(p1)),
1646          p2_(static_cast<typename BindType<P2>::StorageType>(p2)),
1647          p3_(static_cast<typename BindType<P3>::StorageType>(p3)),
1648          p4_(static_cast<typename BindType<P4>::StorageType>(p4)),
1649          p5_(static_cast<typename BindType<P5>::StorageType>(p5)),
1650          p6_(static_cast<typename BindType<P6>::StorageType>(p6)) {
1651    MaybeRefcount<IsMethod, P1>::AddRef(p1_);
1652  }
1653
1654  virtual ~InvokerStorage6() {
1655    MaybeRefcount<IsMethod, P1>::Release(p1_);
1656  }
1657
1658  Sig f_;
1659  typename BindType<P1>::StorageType p1_;
1660  typename BindType<P2>::StorageType p2_;
1661  typename BindType<P3>::StorageType p3_;
1662  typename BindType<P4>::StorageType p4_;
1663  typename BindType<P5>::StorageType p5_;
1664  typename BindType<P6>::StorageType p6_;
1665};
1666
1667}  // namespace internal
1668}  // namespace base
1669
1670#endif  // BASE_BIND_INTERNAL_H_
1671