Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(388)

Side by Side Diff: base/bind_internal.h

Issue 6718021: Callback support for unbound reference and array arguments. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Cleaned up. Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // This file was GENERATED by command: 1 // This file was GENERATED by command:
2 // pump.py bind_internal.h.pump 2 // pump.py bind_internal.h.pump
3 // DO NOT EDIT BY HAND!!! 3 // DO NOT EDIT BY HAND!!!
4 4
5 5
6
6 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 7 // 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 // Use of this source code is governed by a BSD-style license that can be
8 // found in the LICENSE file. 9 // found in the LICENSE file.
9 10
10 #ifndef BASE_BIND_INTERNAL_H_ 11 #ifndef BASE_BIND_INTERNAL_H_
11 #define BASE_BIND_INTERNAL_H_ 12 #define BASE_BIND_INTERNAL_H_
12 #pragma once 13 #pragma once
13 14
14 #include "base/bind_helpers.h" 15 #include "base/bind_helpers.h"
15 #include "base/callback_internal.h" 16 #include "base/callback_internal.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 // By normalizing the function signature, we reduce function_type to exactly 2. 67 // By normalizing the function signature, we reduce function_type to exactly 2.
67 68
68 template <typename Sig> 69 template <typename Sig>
69 struct FunctionTraits; 70 struct FunctionTraits;
70 71
71 // Function: Arity 0. 72 // Function: Arity 0.
72 template <typename R> 73 template <typename R>
73 struct FunctionTraits<R(*)()> { 74 struct FunctionTraits<R(*)()> {
74 typedef R (*NormalizedSig)(); 75 typedef R (*NormalizedSig)();
75 typedef false_type IsMethod; 76 typedef false_type IsMethod;
77
76 }; 78 };
77 79
78 // Method: Arity 0. 80 // Method: Arity 0.
79 template <typename R, typename T> 81 template <typename R, typename T>
80 struct FunctionTraits<R(T::*)()> { 82 struct FunctionTraits<R(T::*)()> {
81 typedef R (T::*NormalizedSig)(); 83 typedef R (T::*NormalizedSig)();
82 typedef true_type IsMethod; 84 typedef true_type IsMethod;
85
86 // Target type for each bound parameter.
87 typedef T B1;
88
83 }; 89 };
84 90
85 // Const Method: Arity 0. 91 // Const Method: Arity 0.
86 template <typename R, typename T> 92 template <typename R, typename T>
87 struct FunctionTraits<R(T::*)() const> { 93 struct FunctionTraits<R(T::*)() const> {
88 typedef R (T::*NormalizedSig)(); 94 typedef R (T::*NormalizedSig)();
89 typedef true_type IsMethod; 95 typedef true_type IsMethod;
96
97 // Target type for each bound parameter.
98 typedef T B1;
99
90 }; 100 };
91 101
92 // Function: Arity 1. 102 // Function: Arity 1.
93 template <typename R, typename X1> 103 template <typename R, typename X1>
94 struct FunctionTraits<R(*)(X1)> { 104 struct FunctionTraits<R(*)(X1)> {
95 typedef R (*NormalizedSig)(X1); 105 typedef R (*NormalizedSig)(X1);
96 typedef false_type IsMethod; 106 typedef false_type IsMethod;
107 // Target type for each bound parameter.
108 typedef X1 B1;
109
97 }; 110 };
98 111
99 // Method: Arity 1. 112 // Method: Arity 1.
100 template <typename R, typename T, typename X1> 113 template <typename R, typename T, typename X1>
101 struct FunctionTraits<R(T::*)(X1)> { 114 struct FunctionTraits<R(T::*)(X1)> {
102 typedef R (T::*NormalizedSig)(X1); 115 typedef R (T::*NormalizedSig)(X1);
103 typedef true_type IsMethod; 116 typedef true_type IsMethod;
117
118 // Target type for each bound parameter.
119 typedef T B1;
120 typedef X1 B2;
121
104 }; 122 };
105 123
106 // Const Method: Arity 1. 124 // Const Method: Arity 1.
107 template <typename R, typename T, typename X1> 125 template <typename R, typename T, typename X1>
108 struct FunctionTraits<R(T::*)(X1) const> { 126 struct FunctionTraits<R(T::*)(X1) const> {
109 typedef R (T::*NormalizedSig)(X1); 127 typedef R (T::*NormalizedSig)(X1);
110 typedef true_type IsMethod; 128 typedef true_type IsMethod;
129
130 // Target type for each bound parameter.
131 typedef T B1;
132 typedef X1 B2;
133
111 }; 134 };
112 135
113 // Function: Arity 2. 136 // Function: Arity 2.
114 template <typename R, typename X1, typename X2> 137 template <typename R, typename X1, typename X2>
115 struct FunctionTraits<R(*)(X1, X2)> { 138 struct FunctionTraits<R(*)(X1, X2)> {
116 typedef R (*NormalizedSig)(X1, X2); 139 typedef R (*NormalizedSig)(X1, X2);
117 typedef false_type IsMethod; 140 typedef false_type IsMethod;
141 // Target type for each bound parameter.
142 typedef X1 B1;
143 typedef X2 B2;
144
118 }; 145 };
119 146
120 // Method: Arity 2. 147 // Method: Arity 2.
121 template <typename R, typename T, typename X1, typename X2> 148 template <typename R, typename T, typename X1, typename X2>
122 struct FunctionTraits<R(T::*)(X1, X2)> { 149 struct FunctionTraits<R(T::*)(X1, X2)> {
123 typedef R (T::*NormalizedSig)(X1, X2); 150 typedef R (T::*NormalizedSig)(X1, X2);
124 typedef true_type IsMethod; 151 typedef true_type IsMethod;
152
153 // Target type for each bound parameter.
154 typedef T B1;
155 typedef X1 B2;
156 typedef X2 B3;
157
125 }; 158 };
126 159
127 // Const Method: Arity 2. 160 // Const Method: Arity 2.
128 template <typename R, typename T, typename X1, typename X2> 161 template <typename R, typename T, typename X1, typename X2>
129 struct FunctionTraits<R(T::*)(X1, X2) const> { 162 struct FunctionTraits<R(T::*)(X1, X2) const> {
130 typedef R (T::*NormalizedSig)(X1, X2); 163 typedef R (T::*NormalizedSig)(X1, X2);
131 typedef true_type IsMethod; 164 typedef true_type IsMethod;
165
166 // Target type for each bound parameter.
167 typedef T B1;
168 typedef X1 B2;
169 typedef X2 B3;
170
132 }; 171 };
133 172
134 // Function: Arity 3. 173 // Function: Arity 3.
135 template <typename R, typename X1, typename X2, typename X3> 174 template <typename R, typename X1, typename X2, typename X3>
136 struct FunctionTraits<R(*)(X1, X2, X3)> { 175 struct FunctionTraits<R(*)(X1, X2, X3)> {
137 typedef R (*NormalizedSig)(X1, X2, X3); 176 typedef R (*NormalizedSig)(X1, X2, X3);
138 typedef false_type IsMethod; 177 typedef false_type IsMethod;
178 // Target type for each bound parameter.
179 typedef X1 B1;
180 typedef X2 B2;
181 typedef X3 B3;
182
139 }; 183 };
140 184
141 // Method: Arity 3. 185 // Method: Arity 3.
142 template <typename R, typename T, typename X1, typename X2, typename X3> 186 template <typename R, typename T, typename X1, typename X2, typename X3>
143 struct FunctionTraits<R(T::*)(X1, X2, X3)> { 187 struct FunctionTraits<R(T::*)(X1, X2, X3)> {
144 typedef R (T::*NormalizedSig)(X1, X2, X3); 188 typedef R (T::*NormalizedSig)(X1, X2, X3);
145 typedef true_type IsMethod; 189 typedef true_type IsMethod;
190
191 // Target type for each bound parameter.
192 typedef T B1;
193 typedef X1 B2;
194 typedef X2 B3;
195 typedef X3 B4;
196
146 }; 197 };
147 198
148 // Const Method: Arity 3. 199 // Const Method: Arity 3.
149 template <typename R, typename T, typename X1, typename X2, typename X3> 200 template <typename R, typename T, typename X1, typename X2, typename X3>
150 struct FunctionTraits<R(T::*)(X1, X2, X3) const> { 201 struct FunctionTraits<R(T::*)(X1, X2, X3) const> {
151 typedef R (T::*NormalizedSig)(X1, X2, X3); 202 typedef R (T::*NormalizedSig)(X1, X2, X3);
152 typedef true_type IsMethod; 203 typedef true_type IsMethod;
204
205 // Target type for each bound parameter.
206 typedef T B1;
207 typedef X1 B2;
208 typedef X2 B3;
209 typedef X3 B4;
210
153 }; 211 };
154 212
155 // Function: Arity 4. 213 // Function: Arity 4.
156 template <typename R, typename X1, typename X2, typename X3, typename X4> 214 template <typename R, typename X1, typename X2, typename X3, typename X4>
157 struct FunctionTraits<R(*)(X1, X2, X3, X4)> { 215 struct FunctionTraits<R(*)(X1, X2, X3, X4)> {
158 typedef R (*NormalizedSig)(X1, X2, X3, X4); 216 typedef R (*NormalizedSig)(X1, X2, X3, X4);
159 typedef false_type IsMethod; 217 typedef false_type IsMethod;
218 // Target type for each bound parameter.
219 typedef X1 B1;
220 typedef X2 B2;
221 typedef X3 B3;
222 typedef X4 B4;
223
160 }; 224 };
161 225
162 // Method: Arity 4. 226 // Method: Arity 4.
163 template <typename R, typename T, typename X1, typename X2, typename X3, 227 template <typename R, typename T, typename X1, typename X2, typename X3,
164 typename X4> 228 typename X4>
165 struct FunctionTraits<R(T::*)(X1, X2, X3, X4)> { 229 struct FunctionTraits<R(T::*)(X1, X2, X3, X4)> {
166 typedef R (T::*NormalizedSig)(X1, X2, X3, X4); 230 typedef R (T::*NormalizedSig)(X1, X2, X3, X4);
167 typedef true_type IsMethod; 231 typedef true_type IsMethod;
232
233 // Target type for each bound parameter.
234 typedef T B1;
235 typedef X1 B2;
236 typedef X2 B3;
237 typedef X3 B4;
238 typedef X4 B5;
239
168 }; 240 };
169 241
170 // Const Method: Arity 4. 242 // Const Method: Arity 4.
171 template <typename R, typename T, typename X1, typename X2, typename X3, 243 template <typename R, typename T, typename X1, typename X2, typename X3,
172 typename X4> 244 typename X4>
173 struct FunctionTraits<R(T::*)(X1, X2, X3, X4) const> { 245 struct FunctionTraits<R(T::*)(X1, X2, X3, X4) const> {
174 typedef R (T::*NormalizedSig)(X1, X2, X3, X4); 246 typedef R (T::*NormalizedSig)(X1, X2, X3, X4);
175 typedef true_type IsMethod; 247 typedef true_type IsMethod;
248
249 // Target type for each bound parameter.
250 typedef T B1;
251 typedef X1 B2;
252 typedef X2 B3;
253 typedef X3 B4;
254 typedef X4 B5;
255
176 }; 256 };
177 257
178 // Function: Arity 5. 258 // Function: Arity 5.
179 template <typename R, typename X1, typename X2, typename X3, typename X4, 259 template <typename R, typename X1, typename X2, typename X3, typename X4,
180 typename X5> 260 typename X5>
181 struct FunctionTraits<R(*)(X1, X2, X3, X4, X5)> { 261 struct FunctionTraits<R(*)(X1, X2, X3, X4, X5)> {
182 typedef R (*NormalizedSig)(X1, X2, X3, X4, X5); 262 typedef R (*NormalizedSig)(X1, X2, X3, X4, X5);
183 typedef false_type IsMethod; 263 typedef false_type IsMethod;
264 // Target type for each bound parameter.
265 typedef X1 B1;
266 typedef X2 B2;
267 typedef X3 B3;
268 typedef X4 B4;
269 typedef X5 B5;
270
184 }; 271 };
185 272
186 // Method: Arity 5. 273 // Method: Arity 5.
187 template <typename R, typename T, typename X1, typename X2, typename X3, 274 template <typename R, typename T, typename X1, typename X2, typename X3,
188 typename X4, typename X5> 275 typename X4, typename X5>
189 struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5)> { 276 struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5)> {
190 typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5); 277 typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5);
191 typedef true_type IsMethod; 278 typedef true_type IsMethod;
279
280 // Target type for each bound parameter.
281 typedef T B1;
282 typedef X1 B2;
283 typedef X2 B3;
284 typedef X3 B4;
285 typedef X4 B5;
286 typedef X5 B6;
287
192 }; 288 };
193 289
194 // Const Method: Arity 5. 290 // Const Method: Arity 5.
195 template <typename R, typename T, typename X1, typename X2, typename X3, 291 template <typename R, typename T, typename X1, typename X2, typename X3,
196 typename X4, typename X5> 292 typename X4, typename X5>
197 struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5) const> { 293 struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5) const> {
198 typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5); 294 typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5);
199 typedef true_type IsMethod; 295 typedef true_type IsMethod;
296
297 // Target type for each bound parameter.
298 typedef T B1;
299 typedef X1 B2;
300 typedef X2 B3;
301 typedef X3 B4;
302 typedef X4 B5;
303 typedef X5 B6;
304
200 }; 305 };
201 306
202 // Function: Arity 6. 307 // Function: Arity 6.
203 template <typename R, typename X1, typename X2, typename X3, typename X4, 308 template <typename R, typename X1, typename X2, typename X3, typename X4,
204 typename X5, typename X6> 309 typename X5, typename X6>
205 struct FunctionTraits<R(*)(X1, X2, X3, X4, X5, X6)> { 310 struct FunctionTraits<R(*)(X1, X2, X3, X4, X5, X6)> {
206 typedef R (*NormalizedSig)(X1, X2, X3, X4, X5, X6); 311 typedef R (*NormalizedSig)(X1, X2, X3, X4, X5, X6);
207 typedef false_type IsMethod; 312 typedef false_type IsMethod;
313 // Target type for each bound parameter.
314 typedef X1 B1;
315 typedef X2 B2;
316 typedef X3 B3;
317 typedef X4 B4;
318 typedef X5 B5;
319 typedef X6 B6;
320
208 }; 321 };
209 322
210 // Method: Arity 6. 323 // Method: Arity 6.
211 template <typename R, typename T, typename X1, typename X2, typename X3, 324 template <typename R, typename T, typename X1, typename X2, typename X3,
212 typename X4, typename X5, typename X6> 325 typename X4, typename X5, typename X6>
213 struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5, X6)> { 326 struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5, X6)> {
214 typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5, X6); 327 typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5, X6);
215 typedef true_type IsMethod; 328 typedef true_type IsMethod;
329
330 // Target type for each bound parameter.
331 typedef T B1;
332 typedef X1 B2;
333 typedef X2 B3;
334 typedef X3 B4;
335 typedef X4 B5;
336 typedef X5 B6;
337 typedef X6 B7;
338
216 }; 339 };
217 340
218 // Const Method: Arity 6. 341 // Const Method: Arity 6.
219 template <typename R, typename T, typename X1, typename X2, typename X3, 342 template <typename R, typename T, typename X1, typename X2, typename X3,
220 typename X4, typename X5, typename X6> 343 typename X4, typename X5, typename X6>
221 struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5, X6) const> { 344 struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5, X6) const> {
222 typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5, X6); 345 typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5, X6);
223 typedef true_type IsMethod; 346 typedef true_type IsMethod;
347
348 // Target type for each bound parameter.
349 typedef T B1;
350 typedef X1 B2;
351 typedef X2 B3;
352 typedef X3 B4;
353 typedef X4 B5;
354 typedef X5 B6;
355 typedef X6 B7;
356
224 }; 357 };
225 358
226 // InvokerN<> 359 // InvokerN<>
227 // 360 //
228 // The InvokerN templates contain a static DoInvoke() function that is the key 361 // The InvokerN templates contain a static DoInvoke() function that is the key
229 // to implementing type erasure in the Callback() classes. 362 // to implementing type erasure in the Callback() classes.
230 // 363 //
231 // DoInvoke() is a static function with a fixed signature that is independent 364 // DoInvoke() is a static function with a fixed signature that is independent
232 // of StorageType; its first argument is a pointer to the non-templated common 365 // of StorageType; its first argument is a pointer to the non-templated common
233 // baseclass of StorageType. This lets us store pointer to DoInvoke() in a 366 // baseclass of StorageType. This lets us store pointer to DoInvoke() in a
(...skipping 17 matching lines...) Expand all
251 struct Invoker0<StorageType, R(*)()> { 384 struct Invoker0<StorageType, R(*)()> {
252 static R DoInvoke(InvokerStorageBase* base) { 385 static R DoInvoke(InvokerStorageBase* base) {
253 StorageType* invoker = static_cast<StorageType*>(base); 386 StorageType* invoker = static_cast<StorageType*>(base);
254 return invoker->f_(); 387 return invoker->f_();
255 } 388 }
256 }; 389 };
257 390
258 // Function: Arity 1 -> 1. 391 // Function: Arity 1 -> 1.
259 template <typename StorageType, typename R,typename X1> 392 template <typename StorageType, typename R,typename X1>
260 struct Invoker0<StorageType, R(*)(X1)> { 393 struct Invoker0<StorageType, R(*)(X1)> {
261 COMPILE_ASSERT( 394 static R DoInvoke(InvokerStorageBase* base,
262 !( is_non_const_reference<X1>::value ), 395 typename internal::ParamTraits<X1>::ForwardType x1) {
263 do_not_bind_functions_with_nonconst_ref);
264
265 static R DoInvoke(InvokerStorageBase* base, const X1& x1) {
266 StorageType* invoker = static_cast<StorageType*>(base); 396 StorageType* invoker = static_cast<StorageType*>(base);
267 return invoker->f_(x1); 397 return invoker->f_(x1);
268 } 398 }
269 }; 399 };
270 400
271 // Function: Arity 2 -> 2. 401 // Function: Arity 2 -> 2.
272 template <typename StorageType, typename R,typename X1, typename X2> 402 template <typename StorageType, typename R,typename X1, typename X2>
273 struct Invoker0<StorageType, R(*)(X1, X2)> { 403 struct Invoker0<StorageType, R(*)(X1, X2)> {
274 COMPILE_ASSERT( 404 static R DoInvoke(InvokerStorageBase* base,
275 !( is_non_const_reference<X1>::value || 405 typename internal::ParamTraits<X1>::ForwardType x1,
276 is_non_const_reference<X2>::value ), 406 typename internal::ParamTraits<X2>::ForwardType x2) {
277 do_not_bind_functions_with_nonconst_ref);
278
279 static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2) {
280 StorageType* invoker = static_cast<StorageType*>(base); 407 StorageType* invoker = static_cast<StorageType*>(base);
281 return invoker->f_(x1, x2); 408 return invoker->f_(x1, x2);
282 } 409 }
283 }; 410 };
284 411
285 // Function: Arity 3 -> 3. 412 // Function: Arity 3 -> 3.
286 template <typename StorageType, typename R,typename X1, typename X2, 413 template <typename StorageType, typename R,typename X1, typename X2,
287 typename X3> 414 typename X3>
288 struct Invoker0<StorageType, R(*)(X1, X2, X3)> { 415 struct Invoker0<StorageType, R(*)(X1, X2, X3)> {
289 COMPILE_ASSERT( 416 static R DoInvoke(InvokerStorageBase* base,
290 !( is_non_const_reference<X1>::value || 417 typename internal::ParamTraits<X1>::ForwardType x1,
291 is_non_const_reference<X2>::value || 418 typename internal::ParamTraits<X2>::ForwardType x2,
292 is_non_const_reference<X3>::value ), 419 typename internal::ParamTraits<X3>::ForwardType x3) {
293 do_not_bind_functions_with_nonconst_ref);
294
295 static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
296 const X3& x3) {
297 StorageType* invoker = static_cast<StorageType*>(base); 420 StorageType* invoker = static_cast<StorageType*>(base);
298 return invoker->f_(x1, x2, x3); 421 return invoker->f_(x1, x2, x3);
299 } 422 }
300 }; 423 };
301 424
302 // Function: Arity 4 -> 4. 425 // Function: Arity 4 -> 4.
303 template <typename StorageType, typename R,typename X1, typename X2, 426 template <typename StorageType, typename R,typename X1, typename X2,
304 typename X3, typename X4> 427 typename X3, typename X4>
305 struct Invoker0<StorageType, R(*)(X1, X2, X3, X4)> { 428 struct Invoker0<StorageType, R(*)(X1, X2, X3, X4)> {
306 COMPILE_ASSERT( 429 static R DoInvoke(InvokerStorageBase* base,
307 !( is_non_const_reference<X1>::value || 430 typename internal::ParamTraits<X1>::ForwardType x1,
308 is_non_const_reference<X2>::value || 431 typename internal::ParamTraits<X2>::ForwardType x2,
309 is_non_const_reference<X3>::value || 432 typename internal::ParamTraits<X3>::ForwardType x3,
310 is_non_const_reference<X4>::value ), 433 typename internal::ParamTraits<X4>::ForwardType x4) {
311 do_not_bind_functions_with_nonconst_ref);
312
313 static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
314 const X3& x3, const X4& x4) {
315 StorageType* invoker = static_cast<StorageType*>(base); 434 StorageType* invoker = static_cast<StorageType*>(base);
316 return invoker->f_(x1, x2, x3, x4); 435 return invoker->f_(x1, x2, x3, x4);
317 } 436 }
318 }; 437 };
319 438
320 // Function: Arity 5 -> 5. 439 // Function: Arity 5 -> 5.
321 template <typename StorageType, typename R,typename X1, typename X2, 440 template <typename StorageType, typename R,typename X1, typename X2,
322 typename X3, typename X4, typename X5> 441 typename X3, typename X4, typename X5>
323 struct Invoker0<StorageType, R(*)(X1, X2, X3, X4, X5)> { 442 struct Invoker0<StorageType, R(*)(X1, X2, X3, X4, X5)> {
324 COMPILE_ASSERT( 443 static R DoInvoke(InvokerStorageBase* base,
325 !( is_non_const_reference<X1>::value || 444 typename internal::ParamTraits<X1>::ForwardType x1,
326 is_non_const_reference<X2>::value || 445 typename internal::ParamTraits<X2>::ForwardType x2,
327 is_non_const_reference<X3>::value || 446 typename internal::ParamTraits<X3>::ForwardType x3,
328 is_non_const_reference<X4>::value || 447 typename internal::ParamTraits<X4>::ForwardType x4,
329 is_non_const_reference<X5>::value ), 448 typename internal::ParamTraits<X5>::ForwardType x5) {
330 do_not_bind_functions_with_nonconst_ref);
331
332 static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
333 const X3& x3, const X4& x4, const X5& x5) {
334 StorageType* invoker = static_cast<StorageType*>(base); 449 StorageType* invoker = static_cast<StorageType*>(base);
335 return invoker->f_(x1, x2, x3, x4, x5); 450 return invoker->f_(x1, x2, x3, x4, x5);
336 } 451 }
337 }; 452 };
338 453
339 // Function: Arity 6 -> 6. 454 // Function: Arity 6 -> 6.
340 template <typename StorageType, typename R,typename X1, typename X2, 455 template <typename StorageType, typename R,typename X1, typename X2,
341 typename X3, typename X4, typename X5, typename X6> 456 typename X3, typename X4, typename X5, typename X6>
342 struct Invoker0<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 457 struct Invoker0<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
343 COMPILE_ASSERT( 458 static R DoInvoke(InvokerStorageBase* base,
344 !( is_non_const_reference<X1>::value || 459 typename internal::ParamTraits<X1>::ForwardType x1,
345 is_non_const_reference<X2>::value || 460 typename internal::ParamTraits<X2>::ForwardType x2,
346 is_non_const_reference<X3>::value || 461 typename internal::ParamTraits<X3>::ForwardType x3,
347 is_non_const_reference<X4>::value || 462 typename internal::ParamTraits<X4>::ForwardType x4,
348 is_non_const_reference<X5>::value || 463 typename internal::ParamTraits<X5>::ForwardType x5,
349 is_non_const_reference<X6>::value ), 464 typename internal::ParamTraits<X6>::ForwardType x6) {
350 do_not_bind_functions_with_nonconst_ref);
351
352 static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
353 const X3& x3, const X4& x4, const X5& x5, const X6& x6) {
354 StorageType* invoker = static_cast<StorageType*>(base); 465 StorageType* invoker = static_cast<StorageType*>(base);
355 return invoker->f_(x1, x2, x3, x4, x5, x6); 466 return invoker->f_(x1, x2, x3, x4, x5, x6);
356 } 467 }
357 }; 468 };
358 469
359 template <typename StorageType, typename NormalizedSig> 470 template <typename StorageType, typename NormalizedSig>
360 struct Invoker1; 471 struct Invoker1;
361 472
362 // Function: Arity 1 -> 0. 473 // Function: Arity 1 -> 0.
363 template <typename StorageType, typename R,typename X1> 474 template <typename StorageType, typename R,typename X1>
364 struct Invoker1<StorageType, R(*)(X1)> { 475 struct Invoker1<StorageType, R(*)(X1)> {
365 COMPILE_ASSERT(
366 !( is_non_const_reference<X1>::value ),
367 do_not_bind_functions_with_nonconst_ref);
368
369 static R DoInvoke(InvokerStorageBase* base) { 476 static R DoInvoke(InvokerStorageBase* base) {
370 StorageType* invoker = static_cast<StorageType*>(base); 477 StorageType* invoker = static_cast<StorageType*>(base);
371 return invoker->f_(Unwrap(invoker->p1_)); 478 return invoker->f_(Unwrap(invoker->p1_));
372 } 479 }
373 }; 480 };
374 481
375 // Method: Arity 0 -> 0. 482 // Method: Arity 0 -> 0.
376 template <typename StorageType, typename R, typename T> 483 template <typename StorageType, typename R, typename T>
377 struct Invoker1<StorageType, R(T::*)()> { 484 struct Invoker1<StorageType, R(T::*)()> {
378 static R DoInvoke(InvokerStorageBase* base) { 485 static R DoInvoke(InvokerStorageBase* base) {
379 StorageType* invoker = static_cast<StorageType*>(base); 486 StorageType* invoker = static_cast<StorageType*>(base);
380 return (Unwrap(invoker->p1_)->*invoker->f_)(); 487 return (Unwrap(invoker->p1_)->*invoker->f_)();
381 } 488 }
382 }; 489 };
383 490
384 // Function: Arity 2 -> 1. 491 // Function: Arity 2 -> 1.
385 template <typename StorageType, typename R,typename X1, typename X2> 492 template <typename StorageType, typename R,typename X1, typename X2>
386 struct Invoker1<StorageType, R(*)(X1, X2)> { 493 struct Invoker1<StorageType, R(*)(X1, X2)> {
387 COMPILE_ASSERT( 494 static R DoInvoke(InvokerStorageBase* base,
388 !( is_non_const_reference<X1>::value || 495 typename internal::ParamTraits<X2>::ForwardType x2) {
389 is_non_const_reference<X2>::value ),
390 do_not_bind_functions_with_nonconst_ref);
391
392 static R DoInvoke(InvokerStorageBase* base, const X2& x2) {
393 StorageType* invoker = static_cast<StorageType*>(base); 496 StorageType* invoker = static_cast<StorageType*>(base);
394 return invoker->f_(Unwrap(invoker->p1_), x2); 497 return invoker->f_(Unwrap(invoker->p1_), x2);
395 } 498 }
396 }; 499 };
397 500
398 // Method: Arity 1 -> 1. 501 // Method: Arity 1 -> 1.
399 template <typename StorageType, typename R, typename T, typename X1> 502 template <typename StorageType, typename R, typename T, typename X1>
400 struct Invoker1<StorageType, R(T::*)(X1)> { 503 struct Invoker1<StorageType, R(T::*)(X1)> {
401 COMPILE_ASSERT( 504 static R DoInvoke(InvokerStorageBase* base,
402 !( is_non_const_reference<X1>::value ), 505 typename internal::ParamTraits<X1>::ForwardType x1) {
403 do_not_bind_functions_with_nonconst_ref);
404
405 static R DoInvoke(InvokerStorageBase* base, const X1& x1) {
406 StorageType* invoker = static_cast<StorageType*>(base); 506 StorageType* invoker = static_cast<StorageType*>(base);
407 return (Unwrap(invoker->p1_)->*invoker->f_)(x1); 507 return (Unwrap(invoker->p1_)->*invoker->f_)(x1);
408 } 508 }
409 }; 509 };
410 510
411 // Function: Arity 3 -> 2. 511 // Function: Arity 3 -> 2.
412 template <typename StorageType, typename R,typename X1, typename X2, 512 template <typename StorageType, typename R,typename X1, typename X2,
413 typename X3> 513 typename X3>
414 struct Invoker1<StorageType, R(*)(X1, X2, X3)> { 514 struct Invoker1<StorageType, R(*)(X1, X2, X3)> {
415 COMPILE_ASSERT( 515 static R DoInvoke(InvokerStorageBase* base,
416 !( is_non_const_reference<X1>::value || 516 typename internal::ParamTraits<X2>::ForwardType x2,
417 is_non_const_reference<X2>::value || 517 typename internal::ParamTraits<X3>::ForwardType x3) {
418 is_non_const_reference<X3>::value ),
419 do_not_bind_functions_with_nonconst_ref);
420
421 static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3) {
422 StorageType* invoker = static_cast<StorageType*>(base); 518 StorageType* invoker = static_cast<StorageType*>(base);
423 return invoker->f_(Unwrap(invoker->p1_), x2, x3); 519 return invoker->f_(Unwrap(invoker->p1_), x2, x3);
424 } 520 }
425 }; 521 };
426 522
427 // Method: Arity 2 -> 2. 523 // Method: Arity 2 -> 2.
428 template <typename StorageType, typename R, typename T, typename X1, 524 template <typename StorageType, typename R, typename T, typename X1,
429 typename X2> 525 typename X2>
430 struct Invoker1<StorageType, R(T::*)(X1, X2)> { 526 struct Invoker1<StorageType, R(T::*)(X1, X2)> {
431 COMPILE_ASSERT( 527 static R DoInvoke(InvokerStorageBase* base,
432 !( is_non_const_reference<X1>::value || 528 typename internal::ParamTraits<X1>::ForwardType x1,
433 is_non_const_reference<X2>::value ), 529 typename internal::ParamTraits<X2>::ForwardType x2) {
434 do_not_bind_functions_with_nonconst_ref);
435
436 static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2) {
437 StorageType* invoker = static_cast<StorageType*>(base); 530 StorageType* invoker = static_cast<StorageType*>(base);
438 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2); 531 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2);
439 } 532 }
440 }; 533 };
441 534
442 // Function: Arity 4 -> 3. 535 // Function: Arity 4 -> 3.
443 template <typename StorageType, typename R,typename X1, typename X2, 536 template <typename StorageType, typename R,typename X1, typename X2,
444 typename X3, typename X4> 537 typename X3, typename X4>
445 struct Invoker1<StorageType, R(*)(X1, X2, X3, X4)> { 538 struct Invoker1<StorageType, R(*)(X1, X2, X3, X4)> {
446 COMPILE_ASSERT( 539 static R DoInvoke(InvokerStorageBase* base,
447 !( is_non_const_reference<X1>::value || 540 typename internal::ParamTraits<X2>::ForwardType x2,
448 is_non_const_reference<X2>::value || 541 typename internal::ParamTraits<X3>::ForwardType x3,
449 is_non_const_reference<X3>::value || 542 typename internal::ParamTraits<X4>::ForwardType x4) {
450 is_non_const_reference<X4>::value ),
451 do_not_bind_functions_with_nonconst_ref);
452
453 static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
454 const X4& x4) {
455 StorageType* invoker = static_cast<StorageType*>(base); 543 StorageType* invoker = static_cast<StorageType*>(base);
456 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4); 544 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4);
457 } 545 }
458 }; 546 };
459 547
460 // Method: Arity 3 -> 3. 548 // Method: Arity 3 -> 3.
461 template <typename StorageType, typename R, typename T, typename X1, 549 template <typename StorageType, typename R, typename T, typename X1,
462 typename X2, typename X3> 550 typename X2, typename X3>
463 struct Invoker1<StorageType, R(T::*)(X1, X2, X3)> { 551 struct Invoker1<StorageType, R(T::*)(X1, X2, X3)> {
464 COMPILE_ASSERT( 552 static R DoInvoke(InvokerStorageBase* base,
465 !( is_non_const_reference<X1>::value || 553 typename internal::ParamTraits<X1>::ForwardType x1,
466 is_non_const_reference<X2>::value || 554 typename internal::ParamTraits<X2>::ForwardType x2,
467 is_non_const_reference<X3>::value ), 555 typename internal::ParamTraits<X3>::ForwardType x3) {
468 do_not_bind_functions_with_nonconst_ref);
469
470 static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
471 const X3& x3) {
472 StorageType* invoker = static_cast<StorageType*>(base); 556 StorageType* invoker = static_cast<StorageType*>(base);
473 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3); 557 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3);
474 } 558 }
475 }; 559 };
476 560
477 // Function: Arity 5 -> 4. 561 // Function: Arity 5 -> 4.
478 template <typename StorageType, typename R,typename X1, typename X2, 562 template <typename StorageType, typename R,typename X1, typename X2,
479 typename X3, typename X4, typename X5> 563 typename X3, typename X4, typename X5>
480 struct Invoker1<StorageType, R(*)(X1, X2, X3, X4, X5)> { 564 struct Invoker1<StorageType, R(*)(X1, X2, X3, X4, X5)> {
481 COMPILE_ASSERT( 565 static R DoInvoke(InvokerStorageBase* base,
482 !( is_non_const_reference<X1>::value || 566 typename internal::ParamTraits<X2>::ForwardType x2,
483 is_non_const_reference<X2>::value || 567 typename internal::ParamTraits<X3>::ForwardType x3,
484 is_non_const_reference<X3>::value || 568 typename internal::ParamTraits<X4>::ForwardType x4,
485 is_non_const_reference<X4>::value || 569 typename internal::ParamTraits<X5>::ForwardType x5) {
486 is_non_const_reference<X5>::value ),
487 do_not_bind_functions_with_nonconst_ref);
488
489 static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
490 const X4& x4, const X5& x5) {
491 StorageType* invoker = static_cast<StorageType*>(base); 570 StorageType* invoker = static_cast<StorageType*>(base);
492 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5); 571 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5);
493 } 572 }
494 }; 573 };
495 574
496 // Method: Arity 4 -> 4. 575 // Method: Arity 4 -> 4.
497 template <typename StorageType, typename R, typename T, typename X1, 576 template <typename StorageType, typename R, typename T, typename X1,
498 typename X2, typename X3, typename X4> 577 typename X2, typename X3, typename X4>
499 struct Invoker1<StorageType, R(T::*)(X1, X2, X3, X4)> { 578 struct Invoker1<StorageType, R(T::*)(X1, X2, X3, X4)> {
500 COMPILE_ASSERT( 579 static R DoInvoke(InvokerStorageBase* base,
501 !( is_non_const_reference<X1>::value || 580 typename internal::ParamTraits<X1>::ForwardType x1,
502 is_non_const_reference<X2>::value || 581 typename internal::ParamTraits<X2>::ForwardType x2,
503 is_non_const_reference<X3>::value || 582 typename internal::ParamTraits<X3>::ForwardType x3,
504 is_non_const_reference<X4>::value ), 583 typename internal::ParamTraits<X4>::ForwardType x4) {
505 do_not_bind_functions_with_nonconst_ref);
506
507 static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
508 const X3& x3, const X4& x4) {
509 StorageType* invoker = static_cast<StorageType*>(base); 584 StorageType* invoker = static_cast<StorageType*>(base);
510 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4); 585 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4);
511 } 586 }
512 }; 587 };
513 588
514 // Function: Arity 6 -> 5. 589 // Function: Arity 6 -> 5.
515 template <typename StorageType, typename R,typename X1, typename X2, 590 template <typename StorageType, typename R,typename X1, typename X2,
516 typename X3, typename X4, typename X5, typename X6> 591 typename X3, typename X4, typename X5, typename X6>
517 struct Invoker1<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 592 struct Invoker1<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
518 COMPILE_ASSERT( 593 static R DoInvoke(InvokerStorageBase* base,
519 !( is_non_const_reference<X1>::value || 594 typename internal::ParamTraits<X2>::ForwardType x2,
520 is_non_const_reference<X2>::value || 595 typename internal::ParamTraits<X3>::ForwardType x3,
521 is_non_const_reference<X3>::value || 596 typename internal::ParamTraits<X4>::ForwardType x4,
522 is_non_const_reference<X4>::value || 597 typename internal::ParamTraits<X5>::ForwardType x5,
523 is_non_const_reference<X5>::value || 598 typename internal::ParamTraits<X6>::ForwardType x6) {
524 is_non_const_reference<X6>::value ),
525 do_not_bind_functions_with_nonconst_ref);
526
527 static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
528 const X4& x4, const X5& x5, const X6& x6) {
529 StorageType* invoker = static_cast<StorageType*>(base); 599 StorageType* invoker = static_cast<StorageType*>(base);
530 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5, x6); 600 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5, x6);
531 } 601 }
532 }; 602 };
533 603
534 // Method: Arity 5 -> 5. 604 // Method: Arity 5 -> 5.
535 template <typename StorageType, typename R, typename T, typename X1, 605 template <typename StorageType, typename R, typename T, typename X1,
536 typename X2, typename X3, typename X4, typename X5> 606 typename X2, typename X3, typename X4, typename X5>
537 struct Invoker1<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 607 struct Invoker1<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
538 COMPILE_ASSERT( 608 static R DoInvoke(InvokerStorageBase* base,
539 !( is_non_const_reference<X1>::value || 609 typename internal::ParamTraits<X1>::ForwardType x1,
540 is_non_const_reference<X2>::value || 610 typename internal::ParamTraits<X2>::ForwardType x2,
541 is_non_const_reference<X3>::value || 611 typename internal::ParamTraits<X3>::ForwardType x3,
542 is_non_const_reference<X4>::value || 612 typename internal::ParamTraits<X4>::ForwardType x4,
543 is_non_const_reference<X5>::value ), 613 typename internal::ParamTraits<X5>::ForwardType x5) {
544 do_not_bind_functions_with_nonconst_ref);
545
546 static R DoInvoke(InvokerStorageBase* base, const X1& x1, const X2& x2,
547 const X3& x3, const X4& x4, const X5& x5) {
548 StorageType* invoker = static_cast<StorageType*>(base); 614 StorageType* invoker = static_cast<StorageType*>(base);
549 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4, x5); 615 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4, x5);
550 } 616 }
551 }; 617 };
552 618
553 template <typename StorageType, typename NormalizedSig> 619 template <typename StorageType, typename NormalizedSig>
554 struct Invoker2; 620 struct Invoker2;
555 621
556 // Function: Arity 2 -> 0. 622 // Function: Arity 2 -> 0.
557 template <typename StorageType, typename R,typename X1, typename X2> 623 template <typename StorageType, typename R,typename X1, typename X2>
558 struct Invoker2<StorageType, R(*)(X1, X2)> { 624 struct Invoker2<StorageType, R(*)(X1, X2)> {
559 COMPILE_ASSERT(
560 !( is_non_const_reference<X1>::value ||
561 is_non_const_reference<X2>::value ),
562 do_not_bind_functions_with_nonconst_ref);
563
564 static R DoInvoke(InvokerStorageBase* base) { 625 static R DoInvoke(InvokerStorageBase* base) {
565 StorageType* invoker = static_cast<StorageType*>(base); 626 StorageType* invoker = static_cast<StorageType*>(base);
566 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_)); 627 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_));
567 } 628 }
568 }; 629 };
569 630
570 // Method: Arity 1 -> 0. 631 // Method: Arity 1 -> 0.
571 template <typename StorageType, typename R, typename T, typename X1> 632 template <typename StorageType, typename R, typename T, typename X1>
572 struct Invoker2<StorageType, R(T::*)(X1)> { 633 struct Invoker2<StorageType, R(T::*)(X1)> {
573 COMPILE_ASSERT(
574 !( is_non_const_reference<X1>::value ),
575 do_not_bind_functions_with_nonconst_ref);
576
577 static R DoInvoke(InvokerStorageBase* base) { 634 static R DoInvoke(InvokerStorageBase* base) {
578 StorageType* invoker = static_cast<StorageType*>(base); 635 StorageType* invoker = static_cast<StorageType*>(base);
579 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_)); 636 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_));
580 } 637 }
581 }; 638 };
582 639
583 // Function: Arity 3 -> 1. 640 // Function: Arity 3 -> 1.
584 template <typename StorageType, typename R,typename X1, typename X2, 641 template <typename StorageType, typename R,typename X1, typename X2,
585 typename X3> 642 typename X3>
586 struct Invoker2<StorageType, R(*)(X1, X2, X3)> { 643 struct Invoker2<StorageType, R(*)(X1, X2, X3)> {
587 COMPILE_ASSERT( 644 static R DoInvoke(InvokerStorageBase* base,
588 !( is_non_const_reference<X1>::value || 645 typename internal::ParamTraits<X3>::ForwardType x3) {
589 is_non_const_reference<X2>::value ||
590 is_non_const_reference<X3>::value ),
591 do_not_bind_functions_with_nonconst_ref);
592
593 static R DoInvoke(InvokerStorageBase* base, const X3& x3) {
594 StorageType* invoker = static_cast<StorageType*>(base); 646 StorageType* invoker = static_cast<StorageType*>(base);
595 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3); 647 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3);
596 } 648 }
597 }; 649 };
598 650
599 // Method: Arity 2 -> 1. 651 // Method: Arity 2 -> 1.
600 template <typename StorageType, typename R, typename T, typename X1, 652 template <typename StorageType, typename R, typename T, typename X1,
601 typename X2> 653 typename X2>
602 struct Invoker2<StorageType, R(T::*)(X1, X2)> { 654 struct Invoker2<StorageType, R(T::*)(X1, X2)> {
603 COMPILE_ASSERT( 655 static R DoInvoke(InvokerStorageBase* base,
604 !( is_non_const_reference<X1>::value || 656 typename internal::ParamTraits<X2>::ForwardType x2) {
605 is_non_const_reference<X2>::value ),
606 do_not_bind_functions_with_nonconst_ref);
607
608 static R DoInvoke(InvokerStorageBase* base, const X2& x2) {
609 StorageType* invoker = static_cast<StorageType*>(base); 657 StorageType* invoker = static_cast<StorageType*>(base);
610 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2); 658 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2);
611 } 659 }
612 }; 660 };
613 661
614 // Function: Arity 4 -> 2. 662 // Function: Arity 4 -> 2.
615 template <typename StorageType, typename R,typename X1, typename X2, 663 template <typename StorageType, typename R,typename X1, typename X2,
616 typename X3, typename X4> 664 typename X3, typename X4>
617 struct Invoker2<StorageType, R(*)(X1, X2, X3, X4)> { 665 struct Invoker2<StorageType, R(*)(X1, X2, X3, X4)> {
618 COMPILE_ASSERT( 666 static R DoInvoke(InvokerStorageBase* base,
619 !( is_non_const_reference<X1>::value || 667 typename internal::ParamTraits<X3>::ForwardType x3,
620 is_non_const_reference<X2>::value || 668 typename internal::ParamTraits<X4>::ForwardType x4) {
621 is_non_const_reference<X3>::value ||
622 is_non_const_reference<X4>::value ),
623 do_not_bind_functions_with_nonconst_ref);
624
625 static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4) {
626 StorageType* invoker = static_cast<StorageType*>(base); 669 StorageType* invoker = static_cast<StorageType*>(base);
627 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4); 670 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4);
628 } 671 }
629 }; 672 };
630 673
631 // Method: Arity 3 -> 2. 674 // Method: Arity 3 -> 2.
632 template <typename StorageType, typename R, typename T, typename X1, 675 template <typename StorageType, typename R, typename T, typename X1,
633 typename X2, typename X3> 676 typename X2, typename X3>
634 struct Invoker2<StorageType, R(T::*)(X1, X2, X3)> { 677 struct Invoker2<StorageType, R(T::*)(X1, X2, X3)> {
635 COMPILE_ASSERT( 678 static R DoInvoke(InvokerStorageBase* base,
636 !( is_non_const_reference<X1>::value || 679 typename internal::ParamTraits<X2>::ForwardType x2,
637 is_non_const_reference<X2>::value || 680 typename internal::ParamTraits<X3>::ForwardType x3) {
638 is_non_const_reference<X3>::value ),
639 do_not_bind_functions_with_nonconst_ref);
640
641 static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3) {
642 StorageType* invoker = static_cast<StorageType*>(base); 681 StorageType* invoker = static_cast<StorageType*>(base);
643 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3); 682 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3);
644 } 683 }
645 }; 684 };
646 685
647 // Function: Arity 5 -> 3. 686 // Function: Arity 5 -> 3.
648 template <typename StorageType, typename R,typename X1, typename X2, 687 template <typename StorageType, typename R,typename X1, typename X2,
649 typename X3, typename X4, typename X5> 688 typename X3, typename X4, typename X5>
650 struct Invoker2<StorageType, R(*)(X1, X2, X3, X4, X5)> { 689 struct Invoker2<StorageType, R(*)(X1, X2, X3, X4, X5)> {
651 COMPILE_ASSERT( 690 static R DoInvoke(InvokerStorageBase* base,
652 !( is_non_const_reference<X1>::value || 691 typename internal::ParamTraits<X3>::ForwardType x3,
653 is_non_const_reference<X2>::value || 692 typename internal::ParamTraits<X4>::ForwardType x4,
654 is_non_const_reference<X3>::value || 693 typename internal::ParamTraits<X5>::ForwardType x5) {
655 is_non_const_reference<X4>::value ||
656 is_non_const_reference<X5>::value ),
657 do_not_bind_functions_with_nonconst_ref);
658
659 static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4,
660 const X5& x5) {
661 StorageType* invoker = static_cast<StorageType*>(base); 694 StorageType* invoker = static_cast<StorageType*>(base);
662 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5); 695 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5);
663 } 696 }
664 }; 697 };
665 698
666 // Method: Arity 4 -> 3. 699 // Method: Arity 4 -> 3.
667 template <typename StorageType, typename R, typename T, typename X1, 700 template <typename StorageType, typename R, typename T, typename X1,
668 typename X2, typename X3, typename X4> 701 typename X2, typename X3, typename X4>
669 struct Invoker2<StorageType, R(T::*)(X1, X2, X3, X4)> { 702 struct Invoker2<StorageType, R(T::*)(X1, X2, X3, X4)> {
670 COMPILE_ASSERT( 703 static R DoInvoke(InvokerStorageBase* base,
671 !( is_non_const_reference<X1>::value || 704 typename internal::ParamTraits<X2>::ForwardType x2,
672 is_non_const_reference<X2>::value || 705 typename internal::ParamTraits<X3>::ForwardType x3,
673 is_non_const_reference<X3>::value || 706 typename internal::ParamTraits<X4>::ForwardType x4) {
674 is_non_const_reference<X4>::value ),
675 do_not_bind_functions_with_nonconst_ref);
676
677 static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
678 const X4& x4) {
679 StorageType* invoker = static_cast<StorageType*>(base); 707 StorageType* invoker = static_cast<StorageType*>(base);
680 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, 708 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3,
681 x4); 709 x4);
682 } 710 }
683 }; 711 };
684 712
685 // Function: Arity 6 -> 4. 713 // Function: Arity 6 -> 4.
686 template <typename StorageType, typename R,typename X1, typename X2, 714 template <typename StorageType, typename R,typename X1, typename X2,
687 typename X3, typename X4, typename X5, typename X6> 715 typename X3, typename X4, typename X5, typename X6>
688 struct Invoker2<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 716 struct Invoker2<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
689 COMPILE_ASSERT( 717 static R DoInvoke(InvokerStorageBase* base,
690 !( is_non_const_reference<X1>::value || 718 typename internal::ParamTraits<X3>::ForwardType x3,
691 is_non_const_reference<X2>::value || 719 typename internal::ParamTraits<X4>::ForwardType x4,
692 is_non_const_reference<X3>::value || 720 typename internal::ParamTraits<X5>::ForwardType x5,
693 is_non_const_reference<X4>::value || 721 typename internal::ParamTraits<X6>::ForwardType x6) {
694 is_non_const_reference<X5>::value ||
695 is_non_const_reference<X6>::value ),
696 do_not_bind_functions_with_nonconst_ref);
697
698 static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4,
699 const X5& x5, const X6& x6) {
700 StorageType* invoker = static_cast<StorageType*>(base); 722 StorageType* invoker = static_cast<StorageType*>(base);
701 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5, 723 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5,
702 x6); 724 x6);
703 } 725 }
704 }; 726 };
705 727
706 // Method: Arity 5 -> 4. 728 // Method: Arity 5 -> 4.
707 template <typename StorageType, typename R, typename T, typename X1, 729 template <typename StorageType, typename R, typename T, typename X1,
708 typename X2, typename X3, typename X4, typename X5> 730 typename X2, typename X3, typename X4, typename X5>
709 struct Invoker2<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 731 struct Invoker2<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
710 COMPILE_ASSERT( 732 static R DoInvoke(InvokerStorageBase* base,
711 !( is_non_const_reference<X1>::value || 733 typename internal::ParamTraits<X2>::ForwardType x2,
712 is_non_const_reference<X2>::value || 734 typename internal::ParamTraits<X3>::ForwardType x3,
713 is_non_const_reference<X3>::value || 735 typename internal::ParamTraits<X4>::ForwardType x4,
714 is_non_const_reference<X4>::value || 736 typename internal::ParamTraits<X5>::ForwardType x5) {
715 is_non_const_reference<X5>::value ),
716 do_not_bind_functions_with_nonconst_ref);
717
718 static R DoInvoke(InvokerStorageBase* base, const X2& x2, const X3& x3,
719 const X4& x4, const X5& x5) {
720 StorageType* invoker = static_cast<StorageType*>(base); 737 StorageType* invoker = static_cast<StorageType*>(base);
721 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, 738 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3,
722 x4, x5); 739 x4, x5);
723 } 740 }
724 }; 741 };
725 742
726 template <typename StorageType, typename NormalizedSig> 743 template <typename StorageType, typename NormalizedSig>
727 struct Invoker3; 744 struct Invoker3;
728 745
729 // Function: Arity 3 -> 0. 746 // Function: Arity 3 -> 0.
730 template <typename StorageType, typename R,typename X1, typename X2, 747 template <typename StorageType, typename R,typename X1, typename X2,
731 typename X3> 748 typename X3>
732 struct Invoker3<StorageType, R(*)(X1, X2, X3)> { 749 struct Invoker3<StorageType, R(*)(X1, X2, X3)> {
733 COMPILE_ASSERT(
734 !( is_non_const_reference<X1>::value ||
735 is_non_const_reference<X2>::value ||
736 is_non_const_reference<X3>::value ),
737 do_not_bind_functions_with_nonconst_ref);
738
739 static R DoInvoke(InvokerStorageBase* base) { 750 static R DoInvoke(InvokerStorageBase* base) {
740 StorageType* invoker = static_cast<StorageType*>(base); 751 StorageType* invoker = static_cast<StorageType*>(base);
741 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 752 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
742 Unwrap(invoker->p3_)); 753 Unwrap(invoker->p3_));
743 } 754 }
744 }; 755 };
745 756
746 // Method: Arity 2 -> 0. 757 // Method: Arity 2 -> 0.
747 template <typename StorageType, typename R, typename T, typename X1, 758 template <typename StorageType, typename R, typename T, typename X1,
748 typename X2> 759 typename X2>
749 struct Invoker3<StorageType, R(T::*)(X1, X2)> { 760 struct Invoker3<StorageType, R(T::*)(X1, X2)> {
750 COMPILE_ASSERT(
751 !( is_non_const_reference<X1>::value ||
752 is_non_const_reference<X2>::value ),
753 do_not_bind_functions_with_nonconst_ref);
754
755 static R DoInvoke(InvokerStorageBase* base) { 761 static R DoInvoke(InvokerStorageBase* base) {
756 StorageType* invoker = static_cast<StorageType*>(base); 762 StorageType* invoker = static_cast<StorageType*>(base);
757 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 763 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
758 Unwrap(invoker->p3_)); 764 Unwrap(invoker->p3_));
759 } 765 }
760 }; 766 };
761 767
762 // Function: Arity 4 -> 1. 768 // Function: Arity 4 -> 1.
763 template <typename StorageType, typename R,typename X1, typename X2, 769 template <typename StorageType, typename R,typename X1, typename X2,
764 typename X3, typename X4> 770 typename X3, typename X4>
765 struct Invoker3<StorageType, R(*)(X1, X2, X3, X4)> { 771 struct Invoker3<StorageType, R(*)(X1, X2, X3, X4)> {
766 COMPILE_ASSERT( 772 static R DoInvoke(InvokerStorageBase* base,
767 !( is_non_const_reference<X1>::value || 773 typename internal::ParamTraits<X4>::ForwardType x4) {
768 is_non_const_reference<X2>::value ||
769 is_non_const_reference<X3>::value ||
770 is_non_const_reference<X4>::value ),
771 do_not_bind_functions_with_nonconst_ref);
772
773 static R DoInvoke(InvokerStorageBase* base, const X4& x4) {
774 StorageType* invoker = static_cast<StorageType*>(base); 774 StorageType* invoker = static_cast<StorageType*>(base);
775 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 775 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
776 Unwrap(invoker->p3_), x4); 776 Unwrap(invoker->p3_), x4);
777 } 777 }
778 }; 778 };
779 779
780 // Method: Arity 3 -> 1. 780 // Method: Arity 3 -> 1.
781 template <typename StorageType, typename R, typename T, typename X1, 781 template <typename StorageType, typename R, typename T, typename X1,
782 typename X2, typename X3> 782 typename X2, typename X3>
783 struct Invoker3<StorageType, R(T::*)(X1, X2, X3)> { 783 struct Invoker3<StorageType, R(T::*)(X1, X2, X3)> {
784 COMPILE_ASSERT( 784 static R DoInvoke(InvokerStorageBase* base,
785 !( is_non_const_reference<X1>::value || 785 typename internal::ParamTraits<X3>::ForwardType x3) {
786 is_non_const_reference<X2>::value ||
787 is_non_const_reference<X3>::value ),
788 do_not_bind_functions_with_nonconst_ref);
789
790 static R DoInvoke(InvokerStorageBase* base, const X3& x3) {
791 StorageType* invoker = static_cast<StorageType*>(base); 786 StorageType* invoker = static_cast<StorageType*>(base);
792 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 787 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
793 Unwrap(invoker->p3_), x3); 788 Unwrap(invoker->p3_), x3);
794 } 789 }
795 }; 790 };
796 791
797 // Function: Arity 5 -> 2. 792 // Function: Arity 5 -> 2.
798 template <typename StorageType, typename R,typename X1, typename X2, 793 template <typename StorageType, typename R,typename X1, typename X2,
799 typename X3, typename X4, typename X5> 794 typename X3, typename X4, typename X5>
800 struct Invoker3<StorageType, R(*)(X1, X2, X3, X4, X5)> { 795 struct Invoker3<StorageType, R(*)(X1, X2, X3, X4, X5)> {
801 COMPILE_ASSERT( 796 static R DoInvoke(InvokerStorageBase* base,
802 !( is_non_const_reference<X1>::value || 797 typename internal::ParamTraits<X4>::ForwardType x4,
803 is_non_const_reference<X2>::value || 798 typename internal::ParamTraits<X5>::ForwardType x5) {
804 is_non_const_reference<X3>::value ||
805 is_non_const_reference<X4>::value ||
806 is_non_const_reference<X5>::value ),
807 do_not_bind_functions_with_nonconst_ref);
808
809 static R DoInvoke(InvokerStorageBase* base, const X4& x4, const X5& x5) {
810 StorageType* invoker = static_cast<StorageType*>(base); 799 StorageType* invoker = static_cast<StorageType*>(base);
811 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 800 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
812 Unwrap(invoker->p3_), x4, x5); 801 Unwrap(invoker->p3_), x4, x5);
813 } 802 }
814 }; 803 };
815 804
816 // Method: Arity 4 -> 2. 805 // Method: Arity 4 -> 2.
817 template <typename StorageType, typename R, typename T, typename X1, 806 template <typename StorageType, typename R, typename T, typename X1,
818 typename X2, typename X3, typename X4> 807 typename X2, typename X3, typename X4>
819 struct Invoker3<StorageType, R(T::*)(X1, X2, X3, X4)> { 808 struct Invoker3<StorageType, R(T::*)(X1, X2, X3, X4)> {
820 COMPILE_ASSERT( 809 static R DoInvoke(InvokerStorageBase* base,
821 !( is_non_const_reference<X1>::value || 810 typename internal::ParamTraits<X3>::ForwardType x3,
822 is_non_const_reference<X2>::value || 811 typename internal::ParamTraits<X4>::ForwardType x4) {
823 is_non_const_reference<X3>::value ||
824 is_non_const_reference<X4>::value ),
825 do_not_bind_functions_with_nonconst_ref);
826
827 static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4) {
828 StorageType* invoker = static_cast<StorageType*>(base); 812 StorageType* invoker = static_cast<StorageType*>(base);
829 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 813 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
830 Unwrap(invoker->p3_), x3, x4); 814 Unwrap(invoker->p3_), x3, x4);
831 } 815 }
832 }; 816 };
833 817
834 // Function: Arity 6 -> 3. 818 // Function: Arity 6 -> 3.
835 template <typename StorageType, typename R,typename X1, typename X2, 819 template <typename StorageType, typename R,typename X1, typename X2,
836 typename X3, typename X4, typename X5, typename X6> 820 typename X3, typename X4, typename X5, typename X6>
837 struct Invoker3<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 821 struct Invoker3<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
838 COMPILE_ASSERT( 822 static R DoInvoke(InvokerStorageBase* base,
839 !( is_non_const_reference<X1>::value || 823 typename internal::ParamTraits<X4>::ForwardType x4,
840 is_non_const_reference<X2>::value || 824 typename internal::ParamTraits<X5>::ForwardType x5,
841 is_non_const_reference<X3>::value || 825 typename internal::ParamTraits<X6>::ForwardType x6) {
842 is_non_const_reference<X4>::value ||
843 is_non_const_reference<X5>::value ||
844 is_non_const_reference<X6>::value ),
845 do_not_bind_functions_with_nonconst_ref);
846
847 static R DoInvoke(InvokerStorageBase* base, const X4& x4, const X5& x5,
848 const X6& x6) {
849 StorageType* invoker = static_cast<StorageType*>(base); 826 StorageType* invoker = static_cast<StorageType*>(base);
850 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 827 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
851 Unwrap(invoker->p3_), x4, x5, x6); 828 Unwrap(invoker->p3_), x4, x5, x6);
852 } 829 }
853 }; 830 };
854 831
855 // Method: Arity 5 -> 3. 832 // Method: Arity 5 -> 3.
856 template <typename StorageType, typename R, typename T, typename X1, 833 template <typename StorageType, typename R, typename T, typename X1,
857 typename X2, typename X3, typename X4, typename X5> 834 typename X2, typename X3, typename X4, typename X5>
858 struct Invoker3<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 835 struct Invoker3<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
859 COMPILE_ASSERT( 836 static R DoInvoke(InvokerStorageBase* base,
860 !( is_non_const_reference<X1>::value || 837 typename internal::ParamTraits<X3>::ForwardType x3,
861 is_non_const_reference<X2>::value || 838 typename internal::ParamTraits<X4>::ForwardType x4,
862 is_non_const_reference<X3>::value || 839 typename internal::ParamTraits<X5>::ForwardType x5) {
863 is_non_const_reference<X4>::value ||
864 is_non_const_reference<X5>::value ),
865 do_not_bind_functions_with_nonconst_ref);
866
867 static R DoInvoke(InvokerStorageBase* base, const X3& x3, const X4& x4,
868 const X5& x5) {
869 StorageType* invoker = static_cast<StorageType*>(base); 840 StorageType* invoker = static_cast<StorageType*>(base);
870 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 841 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
871 Unwrap(invoker->p3_), x3, x4, x5); 842 Unwrap(invoker->p3_), x3, x4, x5);
872 } 843 }
873 }; 844 };
874 845
875 template <typename StorageType, typename NormalizedSig> 846 template <typename StorageType, typename NormalizedSig>
876 struct Invoker4; 847 struct Invoker4;
877 848
878 // Function: Arity 4 -> 0. 849 // Function: Arity 4 -> 0.
879 template <typename StorageType, typename R,typename X1, typename X2, 850 template <typename StorageType, typename R,typename X1, typename X2,
880 typename X3, typename X4> 851 typename X3, typename X4>
881 struct Invoker4<StorageType, R(*)(X1, X2, X3, X4)> { 852 struct Invoker4<StorageType, R(*)(X1, X2, X3, X4)> {
882 COMPILE_ASSERT(
883 !( is_non_const_reference<X1>::value ||
884 is_non_const_reference<X2>::value ||
885 is_non_const_reference<X3>::value ||
886 is_non_const_reference<X4>::value ),
887 do_not_bind_functions_with_nonconst_ref);
888
889 static R DoInvoke(InvokerStorageBase* base) { 853 static R DoInvoke(InvokerStorageBase* base) {
890 StorageType* invoker = static_cast<StorageType*>(base); 854 StorageType* invoker = static_cast<StorageType*>(base);
891 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 855 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
892 Unwrap(invoker->p3_), Unwrap(invoker->p4_)); 856 Unwrap(invoker->p3_), Unwrap(invoker->p4_));
893 } 857 }
894 }; 858 };
895 859
896 // Method: Arity 3 -> 0. 860 // Method: Arity 3 -> 0.
897 template <typename StorageType, typename R, typename T, typename X1, 861 template <typename StorageType, typename R, typename T, typename X1,
898 typename X2, typename X3> 862 typename X2, typename X3>
899 struct Invoker4<StorageType, R(T::*)(X1, X2, X3)> { 863 struct Invoker4<StorageType, R(T::*)(X1, X2, X3)> {
900 COMPILE_ASSERT(
901 !( is_non_const_reference<X1>::value ||
902 is_non_const_reference<X2>::value ||
903 is_non_const_reference<X3>::value ),
904 do_not_bind_functions_with_nonconst_ref);
905
906 static R DoInvoke(InvokerStorageBase* base) { 864 static R DoInvoke(InvokerStorageBase* base) {
907 StorageType* invoker = static_cast<StorageType*>(base); 865 StorageType* invoker = static_cast<StorageType*>(base);
908 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 866 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
909 Unwrap(invoker->p3_), Unwrap(invoker->p4_)); 867 Unwrap(invoker->p3_), Unwrap(invoker->p4_));
910 } 868 }
911 }; 869 };
912 870
913 // Function: Arity 5 -> 1. 871 // Function: Arity 5 -> 1.
914 template <typename StorageType, typename R,typename X1, typename X2, 872 template <typename StorageType, typename R,typename X1, typename X2,
915 typename X3, typename X4, typename X5> 873 typename X3, typename X4, typename X5>
916 struct Invoker4<StorageType, R(*)(X1, X2, X3, X4, X5)> { 874 struct Invoker4<StorageType, R(*)(X1, X2, X3, X4, X5)> {
917 COMPILE_ASSERT( 875 static R DoInvoke(InvokerStorageBase* base,
918 !( is_non_const_reference<X1>::value || 876 typename internal::ParamTraits<X5>::ForwardType x5) {
919 is_non_const_reference<X2>::value ||
920 is_non_const_reference<X3>::value ||
921 is_non_const_reference<X4>::value ||
922 is_non_const_reference<X5>::value ),
923 do_not_bind_functions_with_nonconst_ref);
924
925 static R DoInvoke(InvokerStorageBase* base, const X5& x5) {
926 StorageType* invoker = static_cast<StorageType*>(base); 877 StorageType* invoker = static_cast<StorageType*>(base);
927 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 878 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
928 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5); 879 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5);
929 } 880 }
930 }; 881 };
931 882
932 // Method: Arity 4 -> 1. 883 // Method: Arity 4 -> 1.
933 template <typename StorageType, typename R, typename T, typename X1, 884 template <typename StorageType, typename R, typename T, typename X1,
934 typename X2, typename X3, typename X4> 885 typename X2, typename X3, typename X4>
935 struct Invoker4<StorageType, R(T::*)(X1, X2, X3, X4)> { 886 struct Invoker4<StorageType, R(T::*)(X1, X2, X3, X4)> {
936 COMPILE_ASSERT( 887 static R DoInvoke(InvokerStorageBase* base,
937 !( is_non_const_reference<X1>::value || 888 typename internal::ParamTraits<X4>::ForwardType x4) {
938 is_non_const_reference<X2>::value ||
939 is_non_const_reference<X3>::value ||
940 is_non_const_reference<X4>::value ),
941 do_not_bind_functions_with_nonconst_ref);
942
943 static R DoInvoke(InvokerStorageBase* base, const X4& x4) {
944 StorageType* invoker = static_cast<StorageType*>(base); 889 StorageType* invoker = static_cast<StorageType*>(base);
945 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 890 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
946 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4); 891 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4);
947 } 892 }
948 }; 893 };
949 894
950 // Function: Arity 6 -> 2. 895 // Function: Arity 6 -> 2.
951 template <typename StorageType, typename R,typename X1, typename X2, 896 template <typename StorageType, typename R,typename X1, typename X2,
952 typename X3, typename X4, typename X5, typename X6> 897 typename X3, typename X4, typename X5, typename X6>
953 struct Invoker4<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 898 struct Invoker4<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
954 COMPILE_ASSERT( 899 static R DoInvoke(InvokerStorageBase* base,
955 !( is_non_const_reference<X1>::value || 900 typename internal::ParamTraits<X5>::ForwardType x5,
956 is_non_const_reference<X2>::value || 901 typename internal::ParamTraits<X6>::ForwardType x6) {
957 is_non_const_reference<X3>::value ||
958 is_non_const_reference<X4>::value ||
959 is_non_const_reference<X5>::value ||
960 is_non_const_reference<X6>::value ),
961 do_not_bind_functions_with_nonconst_ref);
962
963 static R DoInvoke(InvokerStorageBase* base, const X5& x5, const X6& x6) {
964 StorageType* invoker = static_cast<StorageType*>(base); 902 StorageType* invoker = static_cast<StorageType*>(base);
965 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 903 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
966 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5, x6); 904 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5, x6);
967 } 905 }
968 }; 906 };
969 907
970 // Method: Arity 5 -> 2. 908 // Method: Arity 5 -> 2.
971 template <typename StorageType, typename R, typename T, typename X1, 909 template <typename StorageType, typename R, typename T, typename X1,
972 typename X2, typename X3, typename X4, typename X5> 910 typename X2, typename X3, typename X4, typename X5>
973 struct Invoker4<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 911 struct Invoker4<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
974 COMPILE_ASSERT( 912 static R DoInvoke(InvokerStorageBase* base,
975 !( is_non_const_reference<X1>::value || 913 typename internal::ParamTraits<X4>::ForwardType x4,
976 is_non_const_reference<X2>::value || 914 typename internal::ParamTraits<X5>::ForwardType x5) {
977 is_non_const_reference<X3>::value ||
978 is_non_const_reference<X4>::value ||
979 is_non_const_reference<X5>::value ),
980 do_not_bind_functions_with_nonconst_ref);
981
982 static R DoInvoke(InvokerStorageBase* base, const X4& x4, const X5& x5) {
983 StorageType* invoker = static_cast<StorageType*>(base); 915 StorageType* invoker = static_cast<StorageType*>(base);
984 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 916 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
985 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4, x5); 917 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4, x5);
986 } 918 }
987 }; 919 };
988 920
989 template <typename StorageType, typename NormalizedSig> 921 template <typename StorageType, typename NormalizedSig>
990 struct Invoker5; 922 struct Invoker5;
991 923
992 // Function: Arity 5 -> 0. 924 // Function: Arity 5 -> 0.
993 template <typename StorageType, typename R,typename X1, typename X2, 925 template <typename StorageType, typename R,typename X1, typename X2,
994 typename X3, typename X4, typename X5> 926 typename X3, typename X4, typename X5>
995 struct Invoker5<StorageType, R(*)(X1, X2, X3, X4, X5)> { 927 struct Invoker5<StorageType, R(*)(X1, X2, X3, X4, X5)> {
996 COMPILE_ASSERT(
997 !( is_non_const_reference<X1>::value ||
998 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 static R DoInvoke(InvokerStorageBase* base) { 928 static R DoInvoke(InvokerStorageBase* base) {
1005 StorageType* invoker = static_cast<StorageType*>(base); 929 StorageType* invoker = static_cast<StorageType*>(base);
1006 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 930 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
1007 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_)); 931 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_));
1008 } 932 }
1009 }; 933 };
1010 934
1011 // Method: Arity 4 -> 0. 935 // Method: Arity 4 -> 0.
1012 template <typename StorageType, typename R, typename T, typename X1, 936 template <typename StorageType, typename R, typename T, typename X1,
1013 typename X2, typename X3, typename X4> 937 typename X2, typename X3, typename X4>
1014 struct Invoker5<StorageType, R(T::*)(X1, X2, X3, X4)> { 938 struct Invoker5<StorageType, R(T::*)(X1, X2, X3, X4)> {
1015 COMPILE_ASSERT(
1016 !( is_non_const_reference<X1>::value ||
1017 is_non_const_reference<X2>::value ||
1018 is_non_const_reference<X3>::value ||
1019 is_non_const_reference<X4>::value ),
1020 do_not_bind_functions_with_nonconst_ref);
1021
1022 static R DoInvoke(InvokerStorageBase* base) { 939 static R DoInvoke(InvokerStorageBase* base) {
1023 StorageType* invoker = static_cast<StorageType*>(base); 940 StorageType* invoker = static_cast<StorageType*>(base);
1024 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 941 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1025 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_)); 942 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_));
1026 } 943 }
1027 }; 944 };
1028 945
1029 // Function: Arity 6 -> 1. 946 // Function: Arity 6 -> 1.
1030 template <typename StorageType, typename R,typename X1, typename X2, 947 template <typename StorageType, typename R,typename X1, typename X2,
1031 typename X3, typename X4, typename X5, typename X6> 948 typename X3, typename X4, typename X5, typename X6>
1032 struct Invoker5<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 949 struct Invoker5<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
1033 COMPILE_ASSERT( 950 static R DoInvoke(InvokerStorageBase* base,
1034 !( is_non_const_reference<X1>::value || 951 typename internal::ParamTraits<X6>::ForwardType x6) {
1035 is_non_const_reference<X2>::value ||
1036 is_non_const_reference<X3>::value ||
1037 is_non_const_reference<X4>::value ||
1038 is_non_const_reference<X5>::value ||
1039 is_non_const_reference<X6>::value ),
1040 do_not_bind_functions_with_nonconst_ref);
1041
1042 static R DoInvoke(InvokerStorageBase* base, const X6& x6) {
1043 StorageType* invoker = static_cast<StorageType*>(base); 952 StorageType* invoker = static_cast<StorageType*>(base);
1044 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 953 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
1045 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x6); 954 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x6);
1046 } 955 }
1047 }; 956 };
1048 957
1049 // Method: Arity 5 -> 1. 958 // Method: Arity 5 -> 1.
1050 template <typename StorageType, typename R, typename T, typename X1, 959 template <typename StorageType, typename R, typename T, typename X1,
1051 typename X2, typename X3, typename X4, typename X5> 960 typename X2, typename X3, typename X4, typename X5>
1052 struct Invoker5<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 961 struct Invoker5<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
1053 COMPILE_ASSERT( 962 static R DoInvoke(InvokerStorageBase* base,
1054 !( is_non_const_reference<X1>::value || 963 typename internal::ParamTraits<X5>::ForwardType x5) {
1055 is_non_const_reference<X2>::value ||
1056 is_non_const_reference<X3>::value ||
1057 is_non_const_reference<X4>::value ||
1058 is_non_const_reference<X5>::value ),
1059 do_not_bind_functions_with_nonconst_ref);
1060
1061 static R DoInvoke(InvokerStorageBase* base, const X5& x5) {
1062 StorageType* invoker = static_cast<StorageType*>(base); 964 StorageType* invoker = static_cast<StorageType*>(base);
1063 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 965 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1064 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5); 966 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5);
1065 } 967 }
1066 }; 968 };
1067 969
1068 template <typename StorageType, typename NormalizedSig> 970 template <typename StorageType, typename NormalizedSig>
1069 struct Invoker6; 971 struct Invoker6;
1070 972
1071 // Function: Arity 6 -> 0. 973 // Function: Arity 6 -> 0.
1072 template <typename StorageType, typename R,typename X1, typename X2, 974 template <typename StorageType, typename R,typename X1, typename X2,
1073 typename X3, typename X4, typename X5, typename X6> 975 typename X3, typename X4, typename X5, typename X6>
1074 struct Invoker6<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 976 struct Invoker6<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
1075 COMPILE_ASSERT(
1076 !( is_non_const_reference<X1>::value ||
1077 is_non_const_reference<X2>::value ||
1078 is_non_const_reference<X3>::value ||
1079 is_non_const_reference<X4>::value ||
1080 is_non_const_reference<X5>::value ||
1081 is_non_const_reference<X6>::value ),
1082 do_not_bind_functions_with_nonconst_ref);
1083
1084 static R DoInvoke(InvokerStorageBase* base) { 977 static R DoInvoke(InvokerStorageBase* base) {
1085 StorageType* invoker = static_cast<StorageType*>(base); 978 StorageType* invoker = static_cast<StorageType*>(base);
1086 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 979 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
1087 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), 980 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_),
1088 Unwrap(invoker->p6_)); 981 Unwrap(invoker->p6_));
1089 } 982 }
1090 }; 983 };
1091 984
1092 // Method: Arity 5 -> 0. 985 // Method: Arity 5 -> 0.
1093 template <typename StorageType, typename R, typename T, typename X1, 986 template <typename StorageType, typename R, typename T, typename X1,
1094 typename X2, typename X3, typename X4, typename X5> 987 typename X2, typename X3, typename X4, typename X5>
1095 struct Invoker6<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 988 struct Invoker6<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
1096 COMPILE_ASSERT(
1097 !( is_non_const_reference<X1>::value ||
1098 is_non_const_reference<X2>::value ||
1099 is_non_const_reference<X3>::value ||
1100 is_non_const_reference<X4>::value ||
1101 is_non_const_reference<X5>::value ),
1102 do_not_bind_functions_with_nonconst_ref);
1103
1104 static R DoInvoke(InvokerStorageBase* base) { 989 static R DoInvoke(InvokerStorageBase* base) {
1105 StorageType* invoker = static_cast<StorageType*>(base); 990 StorageType* invoker = static_cast<StorageType*>(base);
1106 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 991 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1107 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), 992 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_),
1108 Unwrap(invoker->p6_)); 993 Unwrap(invoker->p6_));
1109 } 994 }
1110 }; 995 };
1111 996
1112 997
1113 // InvokerStorageN<> 998 // InvokerStorageN<>
(...skipping 12 matching lines...) Expand all
1126 1011
1127 template <typename Sig> 1012 template <typename Sig>
1128 class InvokerStorage0 : public InvokerStorageBase { 1013 class InvokerStorage0 : public InvokerStorageBase {
1129 public: 1014 public:
1130 typedef InvokerStorage0 StorageType; 1015 typedef InvokerStorage0 StorageType;
1131 typedef FunctionTraits<Sig> TargetTraits; 1016 typedef FunctionTraits<Sig> TargetTraits;
1132 typedef Invoker0<StorageType, typename TargetTraits::NormalizedSig> Invoker; 1017 typedef Invoker0<StorageType, typename TargetTraits::NormalizedSig> Invoker;
1133 typedef typename TargetTraits::IsMethod IsMethod; 1018 typedef typename TargetTraits::IsMethod IsMethod;
1134 1019
1135 1020
1021
1136 InvokerStorage0(Sig f) 1022 InvokerStorage0(Sig f)
1137 : f_(f) { 1023 : f_(f) {
1138 } 1024 }
1139 1025
1140 virtual ~InvokerStorage0() { } 1026 virtual ~InvokerStorage0() { }
1141 1027
1142 Sig f_; 1028 Sig f_;
1143 }; 1029 };
1144 1030
1145 template <typename Sig, typename P1> 1031 template <typename Sig, typename P1>
1146 class InvokerStorage1 : public InvokerStorageBase { 1032 class InvokerStorage1 : public InvokerStorageBase {
1147 public: 1033 public:
1148 typedef InvokerStorage1 StorageType; 1034 typedef InvokerStorage1 StorageType;
1149 typedef FunctionTraits<Sig> TargetTraits; 1035 typedef FunctionTraits<Sig> TargetTraits;
1150 typedef Invoker1<StorageType, typename TargetTraits::NormalizedSig> Invoker; 1036 typedef Invoker1<StorageType, typename TargetTraits::NormalizedSig> Invoker;
1151 typedef typename TargetTraits::IsMethod IsMethod; 1037 typedef typename TargetTraits::IsMethod IsMethod;
1038
1152 // For methods, we need to be careful for parameter 1. We skip the 1039 // For methods, we need to be careful for parameter 1. We skip the
1153 // scoped_refptr check because the binder itself takes care of this. We also 1040 // scoped_refptr check because the binder itself takes care of this. We also
1154 // disallow binding of an array as the method's target object. 1041 // disallow binding of an array as the method's target object.
1155 COMPILE_ASSERT(IsMethod::value || 1042 COMPILE_ASSERT(IsMethod::value ||
1156 !internal::UnsafeBindtoRefCountedArg<P1>::value, 1043 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1157 p1_is_refcounted_type_and_needs_scoped_refptr); 1044 p1_is_refcounted_type_and_needs_scoped_refptr);
1158 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, 1045 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1159 first_bound_argument_to_method_cannot_be_array); 1046 first_bound_argument_to_method_cannot_be_array);
1160 1047
1048 // Do not allow binding a non-const reference parameter. Non-const reference
1049 // parameters are disallowed by the Google style guide. Also, binding a
1050 // non-const reference parameter can make for subtle bugs because the
1051 // invoked function will receive a reference to the stored copy of the
1052 // argument and not the original.
1053 COMPILE_ASSERT(
1054 !( is_non_const_reference<typename TargetTraits::B1>::value ),
1055 do_not_bind_functions_with_nonconst_ref);
1056
1161 1057
1162 InvokerStorage1(Sig f, const P1& p1) 1058 InvokerStorage1(Sig f, const P1& p1)
1163 : f_(f), p1_(static_cast<typename BindType<P1>::StorageType>(p1)) { 1059 : f_(f), p1_(static_cast<typename ParamTraits<P1>::StorageType>(p1)) {
1164 MaybeRefcount<IsMethod, P1>::AddRef(p1_); 1060 MaybeRefcount<IsMethod, P1>::AddRef(p1_);
1165 } 1061 }
1166 1062
1167 virtual ~InvokerStorage1() { 1063 virtual ~InvokerStorage1() {
1168 MaybeRefcount<IsMethod, P1>::Release(p1_); 1064 MaybeRefcount<IsMethod, P1>::Release(p1_);
1169 } 1065 }
1170 1066
1171 Sig f_; 1067 Sig f_;
1172 typename BindType<P1>::StorageType p1_; 1068 typename ParamTraits<P1>::StorageType p1_;
1173 }; 1069 };
1174 1070
1175 template <typename Sig, typename P1, typename P2> 1071 template <typename Sig, typename P1, typename P2>
1176 class InvokerStorage2 : public InvokerStorageBase { 1072 class InvokerStorage2 : public InvokerStorageBase {
1177 public: 1073 public:
1178 typedef InvokerStorage2 StorageType; 1074 typedef InvokerStorage2 StorageType;
1179 typedef FunctionTraits<Sig> TargetTraits; 1075 typedef FunctionTraits<Sig> TargetTraits;
1180 typedef Invoker2<StorageType, typename TargetTraits::NormalizedSig> Invoker; 1076 typedef Invoker2<StorageType, typename TargetTraits::NormalizedSig> Invoker;
1181 typedef typename TargetTraits::IsMethod IsMethod; 1077 typedef typename TargetTraits::IsMethod IsMethod;
1078
1182 // For methods, we need to be careful for parameter 1. We skip the 1079 // For methods, we need to be careful for parameter 1. We skip the
1183 // scoped_refptr check because the binder itself takes care of this. We also 1080 // scoped_refptr check because the binder itself takes care of this. We also
1184 // disallow binding of an array as the method's target object. 1081 // disallow binding of an array as the method's target object.
1185 COMPILE_ASSERT(IsMethod::value || 1082 COMPILE_ASSERT(IsMethod::value ||
1186 !internal::UnsafeBindtoRefCountedArg<P1>::value, 1083 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1187 p1_is_refcounted_type_and_needs_scoped_refptr); 1084 p1_is_refcounted_type_and_needs_scoped_refptr);
1188 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, 1085 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1189 first_bound_argument_to_method_cannot_be_array); 1086 first_bound_argument_to_method_cannot_be_array);
1190 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, 1087 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value,
1191 p2_is_refcounted_type_and_needs_scoped_refptr); 1088 p2_is_refcounted_type_and_needs_scoped_refptr);
1192 1089
1090 // Do not allow binding a non-const reference parameter. Non-const reference
1091 // parameters are disallowed by the Google style guide. Also, binding a
1092 // non-const reference parameter can make for subtle bugs because the
1093 // invoked function will receive a reference to the stored copy of the
1094 // argument and not the original.
1095 COMPILE_ASSERT(
1096 !( is_non_const_reference<typename TargetTraits::B1>::value ||
1097 is_non_const_reference<typename TargetTraits::B2>::value ),
1098 do_not_bind_functions_with_nonconst_ref);
1099
1193 1100
1194 InvokerStorage2(Sig f, const P1& p1, const P2& p2) 1101 InvokerStorage2(Sig f, const P1& p1, const P2& p2)
1195 : f_(f), p1_(static_cast<typename BindType<P1>::StorageType>(p1)), 1102 : f_(f), p1_(static_cast<typename ParamTraits<P1>::StorageType>(p1)),
1196 p2_(static_cast<typename BindType<P2>::StorageType>(p2)) { 1103 p2_(static_cast<typename ParamTraits<P2>::StorageType>(p2)) {
1197 MaybeRefcount<IsMethod, P1>::AddRef(p1_); 1104 MaybeRefcount<IsMethod, P1>::AddRef(p1_);
1198 } 1105 }
1199 1106
1200 virtual ~InvokerStorage2() { 1107 virtual ~InvokerStorage2() {
1201 MaybeRefcount<IsMethod, P1>::Release(p1_); 1108 MaybeRefcount<IsMethod, P1>::Release(p1_);
1202 } 1109 }
1203 1110
1204 Sig f_; 1111 Sig f_;
1205 typename BindType<P1>::StorageType p1_; 1112 typename ParamTraits<P1>::StorageType p1_;
1206 typename BindType<P2>::StorageType p2_; 1113 typename ParamTraits<P2>::StorageType p2_;
1207 }; 1114 };
1208 1115
1209 template <typename Sig, typename P1, typename P2, typename P3> 1116 template <typename Sig, typename P1, typename P2, typename P3>
1210 class InvokerStorage3 : public InvokerStorageBase { 1117 class InvokerStorage3 : public InvokerStorageBase {
1211 public: 1118 public:
1212 typedef InvokerStorage3 StorageType; 1119 typedef InvokerStorage3 StorageType;
1213 typedef FunctionTraits<Sig> TargetTraits; 1120 typedef FunctionTraits<Sig> TargetTraits;
1214 typedef Invoker3<StorageType, typename TargetTraits::NormalizedSig> Invoker; 1121 typedef Invoker3<StorageType, typename TargetTraits::NormalizedSig> Invoker;
1215 typedef typename TargetTraits::IsMethod IsMethod; 1122 typedef typename TargetTraits::IsMethod IsMethod;
1123
1216 // For methods, we need to be careful for parameter 1. We skip the 1124 // For methods, we need to be careful for parameter 1. We skip the
1217 // scoped_refptr check because the binder itself takes care of this. We also 1125 // scoped_refptr check because the binder itself takes care of this. We also
1218 // disallow binding of an array as the method's target object. 1126 // disallow binding of an array as the method's target object.
1219 COMPILE_ASSERT(IsMethod::value || 1127 COMPILE_ASSERT(IsMethod::value ||
1220 !internal::UnsafeBindtoRefCountedArg<P1>::value, 1128 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1221 p1_is_refcounted_type_and_needs_scoped_refptr); 1129 p1_is_refcounted_type_and_needs_scoped_refptr);
1222 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, 1130 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1223 first_bound_argument_to_method_cannot_be_array); 1131 first_bound_argument_to_method_cannot_be_array);
1224 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, 1132 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value,
1225 p2_is_refcounted_type_and_needs_scoped_refptr); 1133 p2_is_refcounted_type_and_needs_scoped_refptr);
1226 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P3>::value, 1134 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P3>::value,
1227 p3_is_refcounted_type_and_needs_scoped_refptr); 1135 p3_is_refcounted_type_and_needs_scoped_refptr);
1228 1136
1137 // Do not allow binding a non-const reference parameter. Non-const reference
1138 // parameters are disallowed by the Google style guide. Also, binding a
1139 // non-const reference parameter can make for subtle bugs because the
1140 // invoked function will receive a reference to the stored copy of the
1141 // argument and not the original.
1142 COMPILE_ASSERT(
1143 !( is_non_const_reference<typename TargetTraits::B1>::value ||
1144 is_non_const_reference<typename TargetTraits::B2>::value ||
1145 is_non_const_reference<typename TargetTraits::B3>::value ),
1146 do_not_bind_functions_with_nonconst_ref);
1147
1229 1148
1230 InvokerStorage3(Sig f, const P1& p1, const P2& p2, const P3& p3) 1149 InvokerStorage3(Sig f, const P1& p1, const P2& p2, const P3& p3)
1231 : f_(f), p1_(static_cast<typename BindType<P1>::StorageType>(p1)), 1150 : f_(f), p1_(static_cast<typename ParamTraits<P1>::StorageType>(p1)),
1232 p2_(static_cast<typename BindType<P2>::StorageType>(p2)), 1151 p2_(static_cast<typename ParamTraits<P2>::StorageType>(p2)),
1233 p3_(static_cast<typename BindType<P3>::StorageType>(p3)) { 1152 p3_(static_cast<typename ParamTraits<P3>::StorageType>(p3)) {
1234 MaybeRefcount<IsMethod, P1>::AddRef(p1_); 1153 MaybeRefcount<IsMethod, P1>::AddRef(p1_);
1235 } 1154 }
1236 1155
1237 virtual ~InvokerStorage3() { 1156 virtual ~InvokerStorage3() {
1238 MaybeRefcount<IsMethod, P1>::Release(p1_); 1157 MaybeRefcount<IsMethod, P1>::Release(p1_);
1239 } 1158 }
1240 1159
1241 Sig f_; 1160 Sig f_;
1242 typename BindType<P1>::StorageType p1_; 1161 typename ParamTraits<P1>::StorageType p1_;
1243 typename BindType<P2>::StorageType p2_; 1162 typename ParamTraits<P2>::StorageType p2_;
1244 typename BindType<P3>::StorageType p3_; 1163 typename ParamTraits<P3>::StorageType p3_;
1245 }; 1164 };
1246 1165
1247 template <typename Sig, typename P1, typename P2, typename P3, typename P4> 1166 template <typename Sig, typename P1, typename P2, typename P3, typename P4>
1248 class InvokerStorage4 : public InvokerStorageBase { 1167 class InvokerStorage4 : public InvokerStorageBase {
1249 public: 1168 public:
1250 typedef InvokerStorage4 StorageType; 1169 typedef InvokerStorage4 StorageType;
1251 typedef FunctionTraits<Sig> TargetTraits; 1170 typedef FunctionTraits<Sig> TargetTraits;
1252 typedef Invoker4<StorageType, typename TargetTraits::NormalizedSig> Invoker; 1171 typedef Invoker4<StorageType, typename TargetTraits::NormalizedSig> Invoker;
1253 typedef typename TargetTraits::IsMethod IsMethod; 1172 typedef typename TargetTraits::IsMethod IsMethod;
1173
1254 // For methods, we need to be careful for parameter 1. We skip the 1174 // For methods, we need to be careful for parameter 1. We skip the
1255 // scoped_refptr check because the binder itself takes care of this. We also 1175 // scoped_refptr check because the binder itself takes care of this. We also
1256 // disallow binding of an array as the method's target object. 1176 // disallow binding of an array as the method's target object.
1257 COMPILE_ASSERT(IsMethod::value || 1177 COMPILE_ASSERT(IsMethod::value ||
1258 !internal::UnsafeBindtoRefCountedArg<P1>::value, 1178 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1259 p1_is_refcounted_type_and_needs_scoped_refptr); 1179 p1_is_refcounted_type_and_needs_scoped_refptr);
1260 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, 1180 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1261 first_bound_argument_to_method_cannot_be_array); 1181 first_bound_argument_to_method_cannot_be_array);
1262 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, 1182 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value,
1263 p2_is_refcounted_type_and_needs_scoped_refptr); 1183 p2_is_refcounted_type_and_needs_scoped_refptr);
1264 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P3>::value, 1184 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P3>::value,
1265 p3_is_refcounted_type_and_needs_scoped_refptr); 1185 p3_is_refcounted_type_and_needs_scoped_refptr);
1266 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P4>::value, 1186 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P4>::value,
1267 p4_is_refcounted_type_and_needs_scoped_refptr); 1187 p4_is_refcounted_type_and_needs_scoped_refptr);
1268 1188
1189 // Do not allow binding a non-const reference parameter. Non-const reference
1190 // parameters are disallowed by the Google style guide. Also, binding a
1191 // non-const reference parameter can make for subtle bugs because the
1192 // invoked function will receive a reference to the stored copy of the
1193 // argument and not the original.
1194 COMPILE_ASSERT(
1195 !( is_non_const_reference<typename TargetTraits::B1>::value ||
1196 is_non_const_reference<typename TargetTraits::B2>::value ||
1197 is_non_const_reference<typename TargetTraits::B3>::value ||
1198 is_non_const_reference<typename TargetTraits::B4>::value ),
1199 do_not_bind_functions_with_nonconst_ref);
1200
1269 1201
1270 InvokerStorage4(Sig f, const P1& p1, const P2& p2, const P3& p3, const P4& p4) 1202 InvokerStorage4(Sig f, const P1& p1, const P2& p2, const P3& p3, const P4& p4)
1271 : f_(f), p1_(static_cast<typename BindType<P1>::StorageType>(p1)), 1203 : f_(f), p1_(static_cast<typename ParamTraits<P1>::StorageType>(p1)),
1272 p2_(static_cast<typename BindType<P2>::StorageType>(p2)), 1204 p2_(static_cast<typename ParamTraits<P2>::StorageType>(p2)),
1273 p3_(static_cast<typename BindType<P3>::StorageType>(p3)), 1205 p3_(static_cast<typename ParamTraits<P3>::StorageType>(p3)),
1274 p4_(static_cast<typename BindType<P4>::StorageType>(p4)) { 1206 p4_(static_cast<typename ParamTraits<P4>::StorageType>(p4)) {
1275 MaybeRefcount<IsMethod, P1>::AddRef(p1_); 1207 MaybeRefcount<IsMethod, P1>::AddRef(p1_);
1276 } 1208 }
1277 1209
1278 virtual ~InvokerStorage4() { 1210 virtual ~InvokerStorage4() {
1279 MaybeRefcount<IsMethod, P1>::Release(p1_); 1211 MaybeRefcount<IsMethod, P1>::Release(p1_);
1280 } 1212 }
1281 1213
1282 Sig f_; 1214 Sig f_;
1283 typename BindType<P1>::StorageType p1_; 1215 typename ParamTraits<P1>::StorageType p1_;
1284 typename BindType<P2>::StorageType p2_; 1216 typename ParamTraits<P2>::StorageType p2_;
1285 typename BindType<P3>::StorageType p3_; 1217 typename ParamTraits<P3>::StorageType p3_;
1286 typename BindType<P4>::StorageType p4_; 1218 typename ParamTraits<P4>::StorageType p4_;
1287 }; 1219 };
1288 1220
1289 template <typename Sig, typename P1, typename P2, typename P3, typename P4, 1221 template <typename Sig, typename P1, typename P2, typename P3, typename P4,
1290 typename P5> 1222 typename P5>
1291 class InvokerStorage5 : public InvokerStorageBase { 1223 class InvokerStorage5 : public InvokerStorageBase {
1292 public: 1224 public:
1293 typedef InvokerStorage5 StorageType; 1225 typedef InvokerStorage5 StorageType;
1294 typedef FunctionTraits<Sig> TargetTraits; 1226 typedef FunctionTraits<Sig> TargetTraits;
1295 typedef Invoker5<StorageType, typename TargetTraits::NormalizedSig> Invoker; 1227 typedef Invoker5<StorageType, typename TargetTraits::NormalizedSig> Invoker;
1296 typedef typename TargetTraits::IsMethod IsMethod; 1228 typedef typename TargetTraits::IsMethod IsMethod;
1229
1297 // For methods, we need to be careful for parameter 1. We skip the 1230 // For methods, we need to be careful for parameter 1. We skip the
1298 // scoped_refptr check because the binder itself takes care of this. We also 1231 // scoped_refptr check because the binder itself takes care of this. We also
1299 // disallow binding of an array as the method's target object. 1232 // disallow binding of an array as the method's target object.
1300 COMPILE_ASSERT(IsMethod::value || 1233 COMPILE_ASSERT(IsMethod::value ||
1301 !internal::UnsafeBindtoRefCountedArg<P1>::value, 1234 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1302 p1_is_refcounted_type_and_needs_scoped_refptr); 1235 p1_is_refcounted_type_and_needs_scoped_refptr);
1303 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, 1236 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1304 first_bound_argument_to_method_cannot_be_array); 1237 first_bound_argument_to_method_cannot_be_array);
1305 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, 1238 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value,
1306 p2_is_refcounted_type_and_needs_scoped_refptr); 1239 p2_is_refcounted_type_and_needs_scoped_refptr);
1307 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P3>::value, 1240 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P3>::value,
1308 p3_is_refcounted_type_and_needs_scoped_refptr); 1241 p3_is_refcounted_type_and_needs_scoped_refptr);
1309 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P4>::value, 1242 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P4>::value,
1310 p4_is_refcounted_type_and_needs_scoped_refptr); 1243 p4_is_refcounted_type_and_needs_scoped_refptr);
1311 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P5>::value, 1244 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P5>::value,
1312 p5_is_refcounted_type_and_needs_scoped_refptr); 1245 p5_is_refcounted_type_and_needs_scoped_refptr);
1313 1246
1247 // Do not allow binding a non-const reference parameter. Non-const reference
1248 // parameters are disallowed by the Google style guide. Also, binding a
1249 // non-const reference parameter can make for subtle bugs because the
1250 // invoked function will receive a reference to the stored copy of the
1251 // argument and not the original.
1252 COMPILE_ASSERT(
1253 !( is_non_const_reference<typename TargetTraits::B1>::value ||
1254 is_non_const_reference<typename TargetTraits::B2>::value ||
1255 is_non_const_reference<typename TargetTraits::B3>::value ||
1256 is_non_const_reference<typename TargetTraits::B4>::value ||
1257 is_non_const_reference<typename TargetTraits::B5>::value ),
1258 do_not_bind_functions_with_nonconst_ref);
1259
1314 1260
1315 InvokerStorage5(Sig f, const P1& p1, const P2& p2, const P3& p3, 1261 InvokerStorage5(Sig f, const P1& p1, const P2& p2, const P3& p3,
1316 const P4& p4, const P5& p5) 1262 const P4& p4, const P5& p5)
1317 : f_(f), p1_(static_cast<typename BindType<P1>::StorageType>(p1)), 1263 : f_(f), p1_(static_cast<typename ParamTraits<P1>::StorageType>(p1)),
1318 p2_(static_cast<typename BindType<P2>::StorageType>(p2)), 1264 p2_(static_cast<typename ParamTraits<P2>::StorageType>(p2)),
1319 p3_(static_cast<typename BindType<P3>::StorageType>(p3)), 1265 p3_(static_cast<typename ParamTraits<P3>::StorageType>(p3)),
1320 p4_(static_cast<typename BindType<P4>::StorageType>(p4)), 1266 p4_(static_cast<typename ParamTraits<P4>::StorageType>(p4)),
1321 p5_(static_cast<typename BindType<P5>::StorageType>(p5)) { 1267 p5_(static_cast<typename ParamTraits<P5>::StorageType>(p5)) {
1322 MaybeRefcount<IsMethod, P1>::AddRef(p1_); 1268 MaybeRefcount<IsMethod, P1>::AddRef(p1_);
1323 } 1269 }
1324 1270
1325 virtual ~InvokerStorage5() { 1271 virtual ~InvokerStorage5() {
1326 MaybeRefcount<IsMethod, P1>::Release(p1_); 1272 MaybeRefcount<IsMethod, P1>::Release(p1_);
1327 } 1273 }
1328 1274
1329 Sig f_; 1275 Sig f_;
1330 typename BindType<P1>::StorageType p1_; 1276 typename ParamTraits<P1>::StorageType p1_;
1331 typename BindType<P2>::StorageType p2_; 1277 typename ParamTraits<P2>::StorageType p2_;
1332 typename BindType<P3>::StorageType p3_; 1278 typename ParamTraits<P3>::StorageType p3_;
1333 typename BindType<P4>::StorageType p4_; 1279 typename ParamTraits<P4>::StorageType p4_;
1334 typename BindType<P5>::StorageType p5_; 1280 typename ParamTraits<P5>::StorageType p5_;
1335 }; 1281 };
1336 1282
1337 template <typename Sig, typename P1, typename P2, typename P3, typename P4, 1283 template <typename Sig, typename P1, typename P2, typename P3, typename P4,
1338 typename P5, typename P6> 1284 typename P5, typename P6>
1339 class InvokerStorage6 : public InvokerStorageBase { 1285 class InvokerStorage6 : public InvokerStorageBase {
1340 public: 1286 public:
1341 typedef InvokerStorage6 StorageType; 1287 typedef InvokerStorage6 StorageType;
1342 typedef FunctionTraits<Sig> TargetTraits; 1288 typedef FunctionTraits<Sig> TargetTraits;
1343 typedef Invoker6<StorageType, typename TargetTraits::NormalizedSig> Invoker; 1289 typedef Invoker6<StorageType, typename TargetTraits::NormalizedSig> Invoker;
1344 typedef typename TargetTraits::IsMethod IsMethod; 1290 typedef typename TargetTraits::IsMethod IsMethod;
1291
1345 // For methods, we need to be careful for parameter 1. We skip the 1292 // For methods, we need to be careful for parameter 1. We skip the
1346 // scoped_refptr check because the binder itself takes care of this. We also 1293 // scoped_refptr check because the binder itself takes care of this. We also
1347 // disallow binding of an array as the method's target object. 1294 // disallow binding of an array as the method's target object.
1348 COMPILE_ASSERT(IsMethod::value || 1295 COMPILE_ASSERT(IsMethod::value ||
1349 !internal::UnsafeBindtoRefCountedArg<P1>::value, 1296 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1350 p1_is_refcounted_type_and_needs_scoped_refptr); 1297 p1_is_refcounted_type_and_needs_scoped_refptr);
1351 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, 1298 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1352 first_bound_argument_to_method_cannot_be_array); 1299 first_bound_argument_to_method_cannot_be_array);
1353 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, 1300 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value,
1354 p2_is_refcounted_type_and_needs_scoped_refptr); 1301 p2_is_refcounted_type_and_needs_scoped_refptr);
1355 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P3>::value, 1302 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P3>::value,
1356 p3_is_refcounted_type_and_needs_scoped_refptr); 1303 p3_is_refcounted_type_and_needs_scoped_refptr);
1357 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P4>::value, 1304 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P4>::value,
1358 p4_is_refcounted_type_and_needs_scoped_refptr); 1305 p4_is_refcounted_type_and_needs_scoped_refptr);
1359 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P5>::value, 1306 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P5>::value,
1360 p5_is_refcounted_type_and_needs_scoped_refptr); 1307 p5_is_refcounted_type_and_needs_scoped_refptr);
1361 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P6>::value, 1308 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P6>::value,
1362 p6_is_refcounted_type_and_needs_scoped_refptr); 1309 p6_is_refcounted_type_and_needs_scoped_refptr);
1363 1310
1311 // Do not allow binding a non-const reference parameter. Non-const reference
1312 // parameters are disallowed by the Google style guide. Also, binding a
1313 // non-const reference parameter can make for subtle bugs because the
1314 // invoked function will receive a reference to the stored copy of the
1315 // argument and not the original.
1316 COMPILE_ASSERT(
1317 !( is_non_const_reference<typename TargetTraits::B1>::value ||
1318 is_non_const_reference<typename TargetTraits::B2>::value ||
1319 is_non_const_reference<typename TargetTraits::B3>::value ||
1320 is_non_const_reference<typename TargetTraits::B4>::value ||
1321 is_non_const_reference<typename TargetTraits::B5>::value ||
1322 is_non_const_reference<typename TargetTraits::B6>::value ),
1323 do_not_bind_functions_with_nonconst_ref);
1324
1364 1325
1365 InvokerStorage6(Sig f, const P1& p1, const P2& p2, const P3& p3, 1326 InvokerStorage6(Sig f, const P1& p1, const P2& p2, const P3& p3,
1366 const P4& p4, const P5& p5, const P6& p6) 1327 const P4& p4, const P5& p5, const P6& p6)
1367 : f_(f), p1_(static_cast<typename BindType<P1>::StorageType>(p1)), 1328 : f_(f), p1_(static_cast<typename ParamTraits<P1>::StorageType>(p1)),
1368 p2_(static_cast<typename BindType<P2>::StorageType>(p2)), 1329 p2_(static_cast<typename ParamTraits<P2>::StorageType>(p2)),
1369 p3_(static_cast<typename BindType<P3>::StorageType>(p3)), 1330 p3_(static_cast<typename ParamTraits<P3>::StorageType>(p3)),
1370 p4_(static_cast<typename BindType<P4>::StorageType>(p4)), 1331 p4_(static_cast<typename ParamTraits<P4>::StorageType>(p4)),
1371 p5_(static_cast<typename BindType<P5>::StorageType>(p5)), 1332 p5_(static_cast<typename ParamTraits<P5>::StorageType>(p5)),
1372 p6_(static_cast<typename BindType<P6>::StorageType>(p6)) { 1333 p6_(static_cast<typename ParamTraits<P6>::StorageType>(p6)) {
1373 MaybeRefcount<IsMethod, P1>::AddRef(p1_); 1334 MaybeRefcount<IsMethod, P1>::AddRef(p1_);
1374 } 1335 }
1375 1336
1376 virtual ~InvokerStorage6() { 1337 virtual ~InvokerStorage6() {
1377 MaybeRefcount<IsMethod, P1>::Release(p1_); 1338 MaybeRefcount<IsMethod, P1>::Release(p1_);
1378 } 1339 }
1379 1340
1380 Sig f_; 1341 Sig f_;
1381 typename BindType<P1>::StorageType p1_; 1342 typename ParamTraits<P1>::StorageType p1_;
1382 typename BindType<P2>::StorageType p2_; 1343 typename ParamTraits<P2>::StorageType p2_;
1383 typename BindType<P3>::StorageType p3_; 1344 typename ParamTraits<P3>::StorageType p3_;
1384 typename BindType<P4>::StorageType p4_; 1345 typename ParamTraits<P4>::StorageType p4_;
1385 typename BindType<P5>::StorageType p5_; 1346 typename ParamTraits<P5>::StorageType p5_;
1386 typename BindType<P6>::StorageType p6_; 1347 typename ParamTraits<P6>::StorageType p6_;
1387 }; 1348 };
1388 1349
1389 } // namespace internal 1350 } // namespace internal
1390 } // namespace base 1351 } // namespace base
1391 1352
1392 #endif // BASE_BIND_INTERNAL_H_ 1353 #endif // BASE_BIND_INTERNAL_H_
OLDNEW
« no previous file with comments | « base/bind_helpers.h ('k') | base/bind_internal.h.pump » ('j') | base/callback_internal.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698