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

Side by Side Diff: base/bind_internal.h

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

Powered by Google App Engine
This is Rietveld 408576698