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

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 copyright 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
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/template_util.h" 17 #include "base/template_util.h"
18 #include "build/build_config.h" 18 #include "build/build_config.h"
19 #include "base/memory/weak_ptr.h"
willchan no longer on Chromium 2011/05/14 01:25:10 Again, sort alphabetically :)
awong 2011/05/16 20:01:27 Done.
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 if (!invoker->p1_.get()) {
willchan no longer on Chromium 2011/05/14 01:25:10 It's non-obvious from reading the code that this i
awong 2011/05/16 20:01:27 Made a stab at it. I need to take another pass th
willchan no longer on Chromium 2011/05/16 22:01:26 OK.
557 return;
558 }
559 (invoker->p1_->*invoker->f_)();
560 }
561 };
562
491 // Function: Arity 2 -> 1. 563 // Function: Arity 2 -> 1.
492 template <typename StorageType, typename R,typename X1, typename X2> 564 template <typename StorageType, typename R,typename X1, typename X2>
493 struct Invoker1<StorageType, R(*)(X1, X2)> { 565 struct Invoker1<false, StorageType, R(*)(X1, X2)> {
494 static R DoInvoke(InvokerStorageBase* base, 566 static R DoInvoke(InvokerStorageBase* base,
495 typename internal::ParamTraits<X2>::ForwardType x2) { 567 typename internal::ParamTraits<X2>::ForwardType x2) {
496 StorageType* invoker = static_cast<StorageType*>(base); 568 StorageType* invoker = static_cast<StorageType*>(base);
497 return invoker->f_(Unwrap(invoker->p1_), x2); 569 return invoker->f_(Unwrap(invoker->p1_), x2);
498 } 570 }
499 }; 571 };
500 572
501 // Method: Arity 1 -> 1. 573 // Method: Arity 1 -> 1.
502 template <typename StorageType, typename R, typename T, typename X1> 574 template <typename StorageType, typename R, typename T, typename X1>
503 struct Invoker1<StorageType, R(T::*)(X1)> { 575 struct Invoker1<false, StorageType, R(T::*)(X1)> {
504 static R DoInvoke(InvokerStorageBase* base, 576 static R DoInvoke(InvokerStorageBase* base,
505 typename internal::ParamTraits<X1>::ForwardType x1) { 577 typename internal::ParamTraits<X1>::ForwardType x1) {
506 StorageType* invoker = static_cast<StorageType*>(base); 578 StorageType* invoker = static_cast<StorageType*>(base);
507 return (Unwrap(invoker->p1_)->*invoker->f_)(x1); 579 return (Unwrap(invoker->p1_)->*invoker->f_)(x1);
508 } 580 }
509 }; 581 };
510 582
583 // WeakPtr Method: Arity 1 -> 1.
584 template <typename StorageType, typename T, typename X1>
585 struct Invoker1<true, StorageType, void(T::*)(X1)> {
586 static void DoInvoke(InvokerStorageBase* base,
587 typename internal::ParamTraits<X1>::ForwardType x1) {
588 StorageType* invoker = static_cast<StorageType*>(base);
589 if (!invoker->p1_.get()) {
590 return;
591 }
592 (invoker->p1_->*invoker->f_)(x1);
593 }
594 };
595
511 // Function: Arity 3 -> 2. 596 // Function: Arity 3 -> 2.
512 template <typename StorageType, typename R,typename X1, typename X2, 597 template <typename StorageType, typename R,typename X1, typename X2,
513 typename X3> 598 typename X3>
514 struct Invoker1<StorageType, R(*)(X1, X2, X3)> { 599 struct Invoker1<false, StorageType, R(*)(X1, X2, X3)> {
515 static R DoInvoke(InvokerStorageBase* base, 600 static R DoInvoke(InvokerStorageBase* base,
516 typename internal::ParamTraits<X2>::ForwardType x2, 601 typename internal::ParamTraits<X2>::ForwardType x2,
517 typename internal::ParamTraits<X3>::ForwardType x3) { 602 typename internal::ParamTraits<X3>::ForwardType x3) {
518 StorageType* invoker = static_cast<StorageType*>(base); 603 StorageType* invoker = static_cast<StorageType*>(base);
519 return invoker->f_(Unwrap(invoker->p1_), x2, x3); 604 return invoker->f_(Unwrap(invoker->p1_), x2, x3);
520 } 605 }
521 }; 606 };
522 607
523 // Method: Arity 2 -> 2. 608 // Method: Arity 2 -> 2.
524 template <typename StorageType, typename R, typename T, typename X1, 609 template <typename StorageType, typename R, typename T, typename X1,
525 typename X2> 610 typename X2>
526 struct Invoker1<StorageType, R(T::*)(X1, X2)> { 611 struct Invoker1<false, StorageType, R(T::*)(X1, X2)> {
527 static R DoInvoke(InvokerStorageBase* base, 612 static R DoInvoke(InvokerStorageBase* base,
528 typename internal::ParamTraits<X1>::ForwardType x1, 613 typename internal::ParamTraits<X1>::ForwardType x1,
529 typename internal::ParamTraits<X2>::ForwardType x2) { 614 typename internal::ParamTraits<X2>::ForwardType x2) {
530 StorageType* invoker = static_cast<StorageType*>(base); 615 StorageType* invoker = static_cast<StorageType*>(base);
531 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2); 616 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2);
532 } 617 }
533 }; 618 };
534 619
620 // WeakPtr Method: Arity 2 -> 2.
621 template <typename StorageType, typename T, typename X1, typename X2>
622 struct Invoker1<true, StorageType, void(T::*)(X1, X2)> {
623 static void DoInvoke(InvokerStorageBase* base,
624 typename internal::ParamTraits<X1>::ForwardType x1,
625 typename internal::ParamTraits<X2>::ForwardType x2) {
626 StorageType* invoker = static_cast<StorageType*>(base);
627 if (!invoker->p1_.get()) {
628 return;
629 }
630 (invoker->p1_->*invoker->f_)(x1, x2);
631 }
632 };
633
535 // Function: Arity 4 -> 3. 634 // Function: Arity 4 -> 3.
536 template <typename StorageType, typename R,typename X1, typename X2, 635 template <typename StorageType, typename R,typename X1, typename X2,
537 typename X3, typename X4> 636 typename X3, typename X4>
538 struct Invoker1<StorageType, R(*)(X1, X2, X3, X4)> { 637 struct Invoker1<false, StorageType, R(*)(X1, X2, X3, X4)> {
539 static R DoInvoke(InvokerStorageBase* base, 638 static R DoInvoke(InvokerStorageBase* base,
540 typename internal::ParamTraits<X2>::ForwardType x2, 639 typename internal::ParamTraits<X2>::ForwardType x2,
541 typename internal::ParamTraits<X3>::ForwardType x3, 640 typename internal::ParamTraits<X3>::ForwardType x3,
542 typename internal::ParamTraits<X4>::ForwardType x4) { 641 typename internal::ParamTraits<X4>::ForwardType x4) {
543 StorageType* invoker = static_cast<StorageType*>(base); 642 StorageType* invoker = static_cast<StorageType*>(base);
544 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4); 643 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4);
545 } 644 }
546 }; 645 };
547 646
548 // Method: Arity 3 -> 3. 647 // Method: Arity 3 -> 3.
549 template <typename StorageType, typename R, typename T, typename X1, 648 template <typename StorageType, typename R, typename T, typename X1,
550 typename X2, typename X3> 649 typename X2, typename X3>
551 struct Invoker1<StorageType, R(T::*)(X1, X2, X3)> { 650 struct Invoker1<false, StorageType, R(T::*)(X1, X2, X3)> {
552 static R DoInvoke(InvokerStorageBase* base, 651 static R DoInvoke(InvokerStorageBase* base,
553 typename internal::ParamTraits<X1>::ForwardType x1, 652 typename internal::ParamTraits<X1>::ForwardType x1,
554 typename internal::ParamTraits<X2>::ForwardType x2, 653 typename internal::ParamTraits<X2>::ForwardType x2,
555 typename internal::ParamTraits<X3>::ForwardType x3) { 654 typename internal::ParamTraits<X3>::ForwardType x3) {
556 StorageType* invoker = static_cast<StorageType*>(base); 655 StorageType* invoker = static_cast<StorageType*>(base);
557 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3); 656 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3);
558 } 657 }
559 }; 658 };
560 659
660 // WeakPtr Method: Arity 3 -> 3.
661 template <typename StorageType, typename T, typename X1, typename X2,
662 typename X3>
663 struct Invoker1<true, StorageType, void(T::*)(X1, X2, X3)> {
664 static void DoInvoke(InvokerStorageBase* base,
665 typename internal::ParamTraits<X1>::ForwardType x1,
666 typename internal::ParamTraits<X2>::ForwardType x2,
667 typename internal::ParamTraits<X3>::ForwardType x3) {
668 StorageType* invoker = static_cast<StorageType*>(base);
669 if (!invoker->p1_.get()) {
670 return;
671 }
672 (invoker->p1_->*invoker->f_)(x1, x2, x3);
673 }
674 };
675
561 // Function: Arity 5 -> 4. 676 // Function: Arity 5 -> 4.
562 template <typename StorageType, typename R,typename X1, typename X2, 677 template <typename StorageType, typename R,typename X1, typename X2,
563 typename X3, typename X4, typename X5> 678 typename X3, typename X4, typename X5>
564 struct Invoker1<StorageType, R(*)(X1, X2, X3, X4, X5)> { 679 struct Invoker1<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
565 static R DoInvoke(InvokerStorageBase* base, 680 static R DoInvoke(InvokerStorageBase* base,
566 typename internal::ParamTraits<X2>::ForwardType x2, 681 typename internal::ParamTraits<X2>::ForwardType x2,
567 typename internal::ParamTraits<X3>::ForwardType x3, 682 typename internal::ParamTraits<X3>::ForwardType x3,
568 typename internal::ParamTraits<X4>::ForwardType x4, 683 typename internal::ParamTraits<X4>::ForwardType x4,
569 typename internal::ParamTraits<X5>::ForwardType x5) { 684 typename internal::ParamTraits<X5>::ForwardType x5) {
570 StorageType* invoker = static_cast<StorageType*>(base); 685 StorageType* invoker = static_cast<StorageType*>(base);
571 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5); 686 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5);
572 } 687 }
573 }; 688 };
574 689
575 // Method: Arity 4 -> 4. 690 // Method: Arity 4 -> 4.
576 template <typename StorageType, typename R, typename T, typename X1, 691 template <typename StorageType, typename R, typename T, typename X1,
577 typename X2, typename X3, typename X4> 692 typename X2, typename X3, typename X4>
578 struct Invoker1<StorageType, R(T::*)(X1, X2, X3, X4)> { 693 struct Invoker1<false, StorageType, R(T::*)(X1, X2, X3, X4)> {
579 static R DoInvoke(InvokerStorageBase* base, 694 static R DoInvoke(InvokerStorageBase* base,
580 typename internal::ParamTraits<X1>::ForwardType x1, 695 typename internal::ParamTraits<X1>::ForwardType x1,
581 typename internal::ParamTraits<X2>::ForwardType x2, 696 typename internal::ParamTraits<X2>::ForwardType x2,
582 typename internal::ParamTraits<X3>::ForwardType x3, 697 typename internal::ParamTraits<X3>::ForwardType x3,
583 typename internal::ParamTraits<X4>::ForwardType x4) { 698 typename internal::ParamTraits<X4>::ForwardType x4) {
584 StorageType* invoker = static_cast<StorageType*>(base); 699 StorageType* invoker = static_cast<StorageType*>(base);
585 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4); 700 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4);
586 } 701 }
587 }; 702 };
588 703
704 // WeakPtr Method: Arity 4 -> 4.
705 template <typename StorageType, typename T, typename X1, typename X2,
706 typename X3, typename X4>
707 struct Invoker1<true, StorageType, void(T::*)(X1, X2, X3, X4)> {
708 static void DoInvoke(InvokerStorageBase* base,
709 typename internal::ParamTraits<X1>::ForwardType x1,
710 typename internal::ParamTraits<X2>::ForwardType x2,
711 typename internal::ParamTraits<X3>::ForwardType x3,
712 typename internal::ParamTraits<X4>::ForwardType x4) {
713 StorageType* invoker = static_cast<StorageType*>(base);
714 if (!invoker->p1_.get()) {
715 return;
716 }
717 (invoker->p1_->*invoker->f_)(x1, x2, x3, x4);
718 }
719 };
720
589 // Function: Arity 6 -> 5. 721 // Function: Arity 6 -> 5.
590 template <typename StorageType, typename R,typename X1, typename X2, 722 template <typename StorageType, typename R,typename X1, typename X2,
591 typename X3, typename X4, typename X5, typename X6> 723 typename X3, typename X4, typename X5, typename X6>
592 struct Invoker1<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 724 struct Invoker1<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
593 static R DoInvoke(InvokerStorageBase* base, 725 static R DoInvoke(InvokerStorageBase* base,
594 typename internal::ParamTraits<X2>::ForwardType x2, 726 typename internal::ParamTraits<X2>::ForwardType x2,
595 typename internal::ParamTraits<X3>::ForwardType x3, 727 typename internal::ParamTraits<X3>::ForwardType x3,
596 typename internal::ParamTraits<X4>::ForwardType x4, 728 typename internal::ParamTraits<X4>::ForwardType x4,
597 typename internal::ParamTraits<X5>::ForwardType x5, 729 typename internal::ParamTraits<X5>::ForwardType x5,
598 typename internal::ParamTraits<X6>::ForwardType x6) { 730 typename internal::ParamTraits<X6>::ForwardType x6) {
599 StorageType* invoker = static_cast<StorageType*>(base); 731 StorageType* invoker = static_cast<StorageType*>(base);
600 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5, x6); 732 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5, x6);
601 } 733 }
602 }; 734 };
603 735
604 // Method: Arity 5 -> 5. 736 // Method: Arity 5 -> 5.
605 template <typename StorageType, typename R, typename T, typename X1, 737 template <typename StorageType, typename R, typename T, typename X1,
606 typename X2, typename X3, typename X4, typename X5> 738 typename X2, typename X3, typename X4, typename X5>
607 struct Invoker1<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 739 struct Invoker1<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
608 static R DoInvoke(InvokerStorageBase* base, 740 static R DoInvoke(InvokerStorageBase* base,
609 typename internal::ParamTraits<X1>::ForwardType x1, 741 typename internal::ParamTraits<X1>::ForwardType x1,
610 typename internal::ParamTraits<X2>::ForwardType x2, 742 typename internal::ParamTraits<X2>::ForwardType x2,
611 typename internal::ParamTraits<X3>::ForwardType x3, 743 typename internal::ParamTraits<X3>::ForwardType x3,
612 typename internal::ParamTraits<X4>::ForwardType x4, 744 typename internal::ParamTraits<X4>::ForwardType x4,
613 typename internal::ParamTraits<X5>::ForwardType x5) { 745 typename internal::ParamTraits<X5>::ForwardType x5) {
614 StorageType* invoker = static_cast<StorageType*>(base); 746 StorageType* invoker = static_cast<StorageType*>(base);
615 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4, x5); 747 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4, x5);
616 } 748 }
617 }; 749 };
618 750
619 template <typename StorageType, typename NormalizedSig> 751 // WeakPtr Method: Arity 5 -> 5.
752 template <typename StorageType, typename T, typename X1, typename X2,
753 typename X3, typename X4, typename X5>
754 struct Invoker1<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> {
755 static void DoInvoke(InvokerStorageBase* base,
756 typename internal::ParamTraits<X1>::ForwardType x1,
757 typename internal::ParamTraits<X2>::ForwardType x2,
758 typename internal::ParamTraits<X3>::ForwardType x3,
759 typename internal::ParamTraits<X4>::ForwardType x4,
760 typename internal::ParamTraits<X5>::ForwardType x5) {
761 StorageType* invoker = static_cast<StorageType*>(base);
762 if (!invoker->p1_.get()) {
763 return;
764 }
765 (invoker->p1_->*invoker->f_)(x1, x2, x3, x4, x5);
766 }
767 };
768
769 template <bool IsWeak, typename StorageType, typename NormalizedSig>
620 struct Invoker2; 770 struct Invoker2;
621 771
622 // Function: Arity 2 -> 0. 772 // Function: Arity 2 -> 0.
623 template <typename StorageType, typename R,typename X1, typename X2> 773 template <typename StorageType, typename R,typename X1, typename X2>
624 struct Invoker2<StorageType, R(*)(X1, X2)> { 774 struct Invoker2<false, StorageType, R(*)(X1, X2)> {
625 static R DoInvoke(InvokerStorageBase* base) { 775 static R DoInvoke(InvokerStorageBase* base) {
626 StorageType* invoker = static_cast<StorageType*>(base); 776 StorageType* invoker = static_cast<StorageType*>(base);
627 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_)); 777 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_));
628 } 778 }
629 }; 779 };
630 780
631 // Method: Arity 1 -> 0. 781 // Method: Arity 1 -> 0.
632 template <typename StorageType, typename R, typename T, typename X1> 782 template <typename StorageType, typename R, typename T, typename X1>
633 struct Invoker2<StorageType, R(T::*)(X1)> { 783 struct Invoker2<false, StorageType, R(T::*)(X1)> {
634 static R DoInvoke(InvokerStorageBase* base) { 784 static R DoInvoke(InvokerStorageBase* base) {
635 StorageType* invoker = static_cast<StorageType*>(base); 785 StorageType* invoker = static_cast<StorageType*>(base);
636 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_)); 786 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_));
637 } 787 }
638 }; 788 };
639 789
790 // WeakPtr Method: Arity 1 -> 0.
791 template <typename StorageType, typename T, typename X1>
792 struct Invoker2<true, StorageType, void(T::*)(X1)> {
793 static void DoInvoke(InvokerStorageBase* base) {
794 StorageType* invoker = static_cast<StorageType*>(base);
795 if (!invoker->p1_.get()) {
796 return;
797 }
798 (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_));
799 }
800 };
801
640 // Function: Arity 3 -> 1. 802 // Function: Arity 3 -> 1.
641 template <typename StorageType, typename R,typename X1, typename X2, 803 template <typename StorageType, typename R,typename X1, typename X2,
642 typename X3> 804 typename X3>
643 struct Invoker2<StorageType, R(*)(X1, X2, X3)> { 805 struct Invoker2<false, StorageType, R(*)(X1, X2, X3)> {
644 static R DoInvoke(InvokerStorageBase* base, 806 static R DoInvoke(InvokerStorageBase* base,
645 typename internal::ParamTraits<X3>::ForwardType x3) { 807 typename internal::ParamTraits<X3>::ForwardType x3) {
646 StorageType* invoker = static_cast<StorageType*>(base); 808 StorageType* invoker = static_cast<StorageType*>(base);
647 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3); 809 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3);
648 } 810 }
649 }; 811 };
650 812
651 // Method: Arity 2 -> 1. 813 // Method: Arity 2 -> 1.
652 template <typename StorageType, typename R, typename T, typename X1, 814 template <typename StorageType, typename R, typename T, typename X1,
653 typename X2> 815 typename X2>
654 struct Invoker2<StorageType, R(T::*)(X1, X2)> { 816 struct Invoker2<false, StorageType, R(T::*)(X1, X2)> {
655 static R DoInvoke(InvokerStorageBase* base, 817 static R DoInvoke(InvokerStorageBase* base,
656 typename internal::ParamTraits<X2>::ForwardType x2) { 818 typename internal::ParamTraits<X2>::ForwardType x2) {
657 StorageType* invoker = static_cast<StorageType*>(base); 819 StorageType* invoker = static_cast<StorageType*>(base);
658 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2); 820 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2);
659 } 821 }
660 }; 822 };
661 823
824 // WeakPtr Method: Arity 2 -> 1.
825 template <typename StorageType, typename T, typename X1, typename X2>
826 struct Invoker2<true, StorageType, void(T::*)(X1, X2)> {
827 static void DoInvoke(InvokerStorageBase* base,
828 typename internal::ParamTraits<X2>::ForwardType x2) {
829 StorageType* invoker = static_cast<StorageType*>(base);
830 if (!invoker->p1_.get()) {
831 return;
832 }
833 (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), x2);
834 }
835 };
836
662 // Function: Arity 4 -> 2. 837 // Function: Arity 4 -> 2.
663 template <typename StorageType, typename R,typename X1, typename X2, 838 template <typename StorageType, typename R,typename X1, typename X2,
664 typename X3, typename X4> 839 typename X3, typename X4>
665 struct Invoker2<StorageType, R(*)(X1, X2, X3, X4)> { 840 struct Invoker2<false, StorageType, R(*)(X1, X2, X3, X4)> {
666 static R DoInvoke(InvokerStorageBase* base, 841 static R DoInvoke(InvokerStorageBase* base,
667 typename internal::ParamTraits<X3>::ForwardType x3, 842 typename internal::ParamTraits<X3>::ForwardType x3,
668 typename internal::ParamTraits<X4>::ForwardType x4) { 843 typename internal::ParamTraits<X4>::ForwardType x4) {
669 StorageType* invoker = static_cast<StorageType*>(base); 844 StorageType* invoker = static_cast<StorageType*>(base);
670 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4); 845 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4);
671 } 846 }
672 }; 847 };
673 848
674 // Method: Arity 3 -> 2. 849 // Method: Arity 3 -> 2.
675 template <typename StorageType, typename R, typename T, typename X1, 850 template <typename StorageType, typename R, typename T, typename X1,
676 typename X2, typename X3> 851 typename X2, typename X3>
677 struct Invoker2<StorageType, R(T::*)(X1, X2, X3)> { 852 struct Invoker2<false, StorageType, R(T::*)(X1, X2, X3)> {
678 static R DoInvoke(InvokerStorageBase* base, 853 static R DoInvoke(InvokerStorageBase* base,
679 typename internal::ParamTraits<X2>::ForwardType x2, 854 typename internal::ParamTraits<X2>::ForwardType x2,
680 typename internal::ParamTraits<X3>::ForwardType x3) { 855 typename internal::ParamTraits<X3>::ForwardType x3) {
681 StorageType* invoker = static_cast<StorageType*>(base); 856 StorageType* invoker = static_cast<StorageType*>(base);
682 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3); 857 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3);
683 } 858 }
684 }; 859 };
685 860
861 // WeakPtr Method: Arity 3 -> 2.
862 template <typename StorageType, typename T, typename X1, typename X2,
863 typename X3>
864 struct Invoker2<true, StorageType, void(T::*)(X1, X2, X3)> {
865 static void DoInvoke(InvokerStorageBase* base,
866 typename internal::ParamTraits<X2>::ForwardType x2,
867 typename internal::ParamTraits<X3>::ForwardType x3) {
868 StorageType* invoker = static_cast<StorageType*>(base);
869 if (!invoker->p1_.get()) {
870 return;
871 }
872 (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), x2, x3);
873 }
874 };
875
686 // Function: Arity 5 -> 3. 876 // Function: Arity 5 -> 3.
687 template <typename StorageType, typename R,typename X1, typename X2, 877 template <typename StorageType, typename R,typename X1, typename X2,
688 typename X3, typename X4, typename X5> 878 typename X3, typename X4, typename X5>
689 struct Invoker2<StorageType, R(*)(X1, X2, X3, X4, X5)> { 879 struct Invoker2<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
690 static R DoInvoke(InvokerStorageBase* base, 880 static R DoInvoke(InvokerStorageBase* base,
691 typename internal::ParamTraits<X3>::ForwardType x3, 881 typename internal::ParamTraits<X3>::ForwardType x3,
692 typename internal::ParamTraits<X4>::ForwardType x4, 882 typename internal::ParamTraits<X4>::ForwardType x4,
693 typename internal::ParamTraits<X5>::ForwardType x5) { 883 typename internal::ParamTraits<X5>::ForwardType x5) {
694 StorageType* invoker = static_cast<StorageType*>(base); 884 StorageType* invoker = static_cast<StorageType*>(base);
695 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5); 885 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5);
696 } 886 }
697 }; 887 };
698 888
699 // Method: Arity 4 -> 3. 889 // Method: Arity 4 -> 3.
700 template <typename StorageType, typename R, typename T, typename X1, 890 template <typename StorageType, typename R, typename T, typename X1,
701 typename X2, typename X3, typename X4> 891 typename X2, typename X3, typename X4>
702 struct Invoker2<StorageType, R(T::*)(X1, X2, X3, X4)> { 892 struct Invoker2<false, StorageType, R(T::*)(X1, X2, X3, X4)> {
703 static R DoInvoke(InvokerStorageBase* base, 893 static R DoInvoke(InvokerStorageBase* base,
704 typename internal::ParamTraits<X2>::ForwardType x2, 894 typename internal::ParamTraits<X2>::ForwardType x2,
705 typename internal::ParamTraits<X3>::ForwardType x3, 895 typename internal::ParamTraits<X3>::ForwardType x3,
706 typename internal::ParamTraits<X4>::ForwardType x4) { 896 typename internal::ParamTraits<X4>::ForwardType x4) {
707 StorageType* invoker = static_cast<StorageType*>(base); 897 StorageType* invoker = static_cast<StorageType*>(base);
708 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, 898 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3,
709 x4); 899 x4);
710 } 900 }
711 }; 901 };
712 902
903 // WeakPtr Method: Arity 4 -> 3.
904 template <typename StorageType, typename T, typename X1, typename X2,
905 typename X3, typename X4>
906 struct Invoker2<true, StorageType, void(T::*)(X1, X2, X3, X4)> {
907 static void DoInvoke(InvokerStorageBase* base,
908 typename internal::ParamTraits<X2>::ForwardType x2,
909 typename internal::ParamTraits<X3>::ForwardType x3,
910 typename internal::ParamTraits<X4>::ForwardType x4) {
911 StorageType* invoker = static_cast<StorageType*>(base);
912 if (!invoker->p1_.get()) {
913 return;
914 }
915 (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, x4);
916 }
917 };
918
713 // Function: Arity 6 -> 4. 919 // Function: Arity 6 -> 4.
714 template <typename StorageType, typename R,typename X1, typename X2, 920 template <typename StorageType, typename R,typename X1, typename X2,
715 typename X3, typename X4, typename X5, typename X6> 921 typename X3, typename X4, typename X5, typename X6>
716 struct Invoker2<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 922 struct Invoker2<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
717 static R DoInvoke(InvokerStorageBase* base, 923 static R DoInvoke(InvokerStorageBase* base,
718 typename internal::ParamTraits<X3>::ForwardType x3, 924 typename internal::ParamTraits<X3>::ForwardType x3,
719 typename internal::ParamTraits<X4>::ForwardType x4, 925 typename internal::ParamTraits<X4>::ForwardType x4,
720 typename internal::ParamTraits<X5>::ForwardType x5, 926 typename internal::ParamTraits<X5>::ForwardType x5,
721 typename internal::ParamTraits<X6>::ForwardType x6) { 927 typename internal::ParamTraits<X6>::ForwardType x6) {
722 StorageType* invoker = static_cast<StorageType*>(base); 928 StorageType* invoker = static_cast<StorageType*>(base);
723 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5, 929 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5,
724 x6); 930 x6);
725 } 931 }
726 }; 932 };
727 933
728 // Method: Arity 5 -> 4. 934 // Method: Arity 5 -> 4.
729 template <typename StorageType, typename R, typename T, typename X1, 935 template <typename StorageType, typename R, typename T, typename X1,
730 typename X2, typename X3, typename X4, typename X5> 936 typename X2, typename X3, typename X4, typename X5>
731 struct Invoker2<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 937 struct Invoker2<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
732 static R DoInvoke(InvokerStorageBase* base, 938 static R DoInvoke(InvokerStorageBase* base,
733 typename internal::ParamTraits<X2>::ForwardType x2, 939 typename internal::ParamTraits<X2>::ForwardType x2,
734 typename internal::ParamTraits<X3>::ForwardType x3, 940 typename internal::ParamTraits<X3>::ForwardType x3,
735 typename internal::ParamTraits<X4>::ForwardType x4, 941 typename internal::ParamTraits<X4>::ForwardType x4,
736 typename internal::ParamTraits<X5>::ForwardType x5) { 942 typename internal::ParamTraits<X5>::ForwardType x5) {
737 StorageType* invoker = static_cast<StorageType*>(base); 943 StorageType* invoker = static_cast<StorageType*>(base);
738 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, 944 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3,
739 x4, x5); 945 x4, x5);
740 } 946 }
741 }; 947 };
742 948
743 template <typename StorageType, typename NormalizedSig> 949 // WeakPtr Method: Arity 5 -> 4.
950 template <typename StorageType, typename T, typename X1, typename X2,
951 typename X3, typename X4, typename X5>
952 struct Invoker2<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> {
953 static void DoInvoke(InvokerStorageBase* base,
954 typename internal::ParamTraits<X2>::ForwardType x2,
955 typename internal::ParamTraits<X3>::ForwardType x3,
956 typename internal::ParamTraits<X4>::ForwardType x4,
957 typename internal::ParamTraits<X5>::ForwardType x5) {
958 StorageType* invoker = static_cast<StorageType*>(base);
959 if (!invoker->p1_.get()) {
960 return;
961 }
962 (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, x4, x5);
963 }
964 };
965
966 template <bool IsWeak, typename StorageType, typename NormalizedSig>
744 struct Invoker3; 967 struct Invoker3;
745 968
746 // Function: Arity 3 -> 0. 969 // Function: Arity 3 -> 0.
747 template <typename StorageType, typename R,typename X1, typename X2, 970 template <typename StorageType, typename R,typename X1, typename X2,
748 typename X3> 971 typename X3>
749 struct Invoker3<StorageType, R(*)(X1, X2, X3)> { 972 struct Invoker3<false, StorageType, R(*)(X1, X2, X3)> {
750 static R DoInvoke(InvokerStorageBase* base) { 973 static R DoInvoke(InvokerStorageBase* base) {
751 StorageType* invoker = static_cast<StorageType*>(base); 974 StorageType* invoker = static_cast<StorageType*>(base);
752 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 975 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
753 Unwrap(invoker->p3_)); 976 Unwrap(invoker->p3_));
754 } 977 }
755 }; 978 };
756 979
757 // Method: Arity 2 -> 0. 980 // Method: Arity 2 -> 0.
758 template <typename StorageType, typename R, typename T, typename X1, 981 template <typename StorageType, typename R, typename T, typename X1,
759 typename X2> 982 typename X2>
760 struct Invoker3<StorageType, R(T::*)(X1, X2)> { 983 struct Invoker3<false, StorageType, R(T::*)(X1, X2)> {
761 static R DoInvoke(InvokerStorageBase* base) { 984 static R DoInvoke(InvokerStorageBase* base) {
762 StorageType* invoker = static_cast<StorageType*>(base); 985 StorageType* invoker = static_cast<StorageType*>(base);
763 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 986 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
764 Unwrap(invoker->p3_)); 987 Unwrap(invoker->p3_));
765 } 988 }
766 }; 989 };
767 990
991 // WeakPtr Method: Arity 2 -> 0.
992 template <typename StorageType, typename T, typename X1, typename X2>
993 struct Invoker3<true, StorageType, void(T::*)(X1, X2)> {
994 static void DoInvoke(InvokerStorageBase* base) {
995 StorageType* invoker = static_cast<StorageType*>(base);
996 if (!invoker->p1_.get()) {
997 return;
998 }
999 (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_));
1000 }
1001 };
1002
768 // Function: Arity 4 -> 1. 1003 // Function: Arity 4 -> 1.
769 template <typename StorageType, typename R,typename X1, typename X2, 1004 template <typename StorageType, typename R,typename X1, typename X2,
770 typename X3, typename X4> 1005 typename X3, typename X4>
771 struct Invoker3<StorageType, R(*)(X1, X2, X3, X4)> { 1006 struct Invoker3<false, StorageType, R(*)(X1, X2, X3, X4)> {
772 static R DoInvoke(InvokerStorageBase* base, 1007 static R DoInvoke(InvokerStorageBase* base,
773 typename internal::ParamTraits<X4>::ForwardType x4) { 1008 typename internal::ParamTraits<X4>::ForwardType x4) {
774 StorageType* invoker = static_cast<StorageType*>(base); 1009 StorageType* invoker = static_cast<StorageType*>(base);
775 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 1010 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
776 Unwrap(invoker->p3_), x4); 1011 Unwrap(invoker->p3_), x4);
777 } 1012 }
778 }; 1013 };
779 1014
780 // Method: Arity 3 -> 1. 1015 // Method: Arity 3 -> 1.
781 template <typename StorageType, typename R, typename T, typename X1, 1016 template <typename StorageType, typename R, typename T, typename X1,
782 typename X2, typename X3> 1017 typename X2, typename X3>
783 struct Invoker3<StorageType, R(T::*)(X1, X2, X3)> { 1018 struct Invoker3<false, StorageType, R(T::*)(X1, X2, X3)> {
784 static R DoInvoke(InvokerStorageBase* base, 1019 static R DoInvoke(InvokerStorageBase* base,
785 typename internal::ParamTraits<X3>::ForwardType x3) { 1020 typename internal::ParamTraits<X3>::ForwardType x3) {
786 StorageType* invoker = static_cast<StorageType*>(base); 1021 StorageType* invoker = static_cast<StorageType*>(base);
787 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 1022 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
788 Unwrap(invoker->p3_), x3); 1023 Unwrap(invoker->p3_), x3);
789 } 1024 }
790 }; 1025 };
791 1026
1027 // WeakPtr Method: Arity 3 -> 1.
1028 template <typename StorageType, typename T, typename X1, typename X2,
1029 typename X3>
1030 struct Invoker3<true, StorageType, void(T::*)(X1, X2, X3)> {
1031 static void DoInvoke(InvokerStorageBase* base,
1032 typename internal::ParamTraits<X3>::ForwardType x3) {
1033 StorageType* invoker = static_cast<StorageType*>(base);
1034 if (!invoker->p1_.get()) {
1035 return;
1036 }
1037 (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
1038 x3);
1039 }
1040 };
1041
792 // Function: Arity 5 -> 2. 1042 // Function: Arity 5 -> 2.
793 template <typename StorageType, typename R,typename X1, typename X2, 1043 template <typename StorageType, typename R,typename X1, typename X2,
794 typename X3, typename X4, typename X5> 1044 typename X3, typename X4, typename X5>
795 struct Invoker3<StorageType, R(*)(X1, X2, X3, X4, X5)> { 1045 struct Invoker3<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
796 static R DoInvoke(InvokerStorageBase* base, 1046 static R DoInvoke(InvokerStorageBase* base,
797 typename internal::ParamTraits<X4>::ForwardType x4, 1047 typename internal::ParamTraits<X4>::ForwardType x4,
798 typename internal::ParamTraits<X5>::ForwardType x5) { 1048 typename internal::ParamTraits<X5>::ForwardType x5) {
799 StorageType* invoker = static_cast<StorageType*>(base); 1049 StorageType* invoker = static_cast<StorageType*>(base);
800 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 1050 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
801 Unwrap(invoker->p3_), x4, x5); 1051 Unwrap(invoker->p3_), x4, x5);
802 } 1052 }
803 }; 1053 };
804 1054
805 // Method: Arity 4 -> 2. 1055 // Method: Arity 4 -> 2.
806 template <typename StorageType, typename R, typename T, typename X1, 1056 template <typename StorageType, typename R, typename T, typename X1,
807 typename X2, typename X3, typename X4> 1057 typename X2, typename X3, typename X4>
808 struct Invoker3<StorageType, R(T::*)(X1, X2, X3, X4)> { 1058 struct Invoker3<false, StorageType, R(T::*)(X1, X2, X3, X4)> {
809 static R DoInvoke(InvokerStorageBase* base, 1059 static R DoInvoke(InvokerStorageBase* base,
810 typename internal::ParamTraits<X3>::ForwardType x3, 1060 typename internal::ParamTraits<X3>::ForwardType x3,
811 typename internal::ParamTraits<X4>::ForwardType x4) { 1061 typename internal::ParamTraits<X4>::ForwardType x4) {
812 StorageType* invoker = static_cast<StorageType*>(base); 1062 StorageType* invoker = static_cast<StorageType*>(base);
813 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 1063 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
814 Unwrap(invoker->p3_), x3, x4); 1064 Unwrap(invoker->p3_), x3, x4);
815 } 1065 }
816 }; 1066 };
817 1067
1068 // WeakPtr Method: Arity 4 -> 2.
1069 template <typename StorageType, typename T, typename X1, typename X2,
1070 typename X3, typename X4>
1071 struct Invoker3<true, StorageType, void(T::*)(X1, X2, X3, X4)> {
1072 static void DoInvoke(InvokerStorageBase* base,
1073 typename internal::ParamTraits<X3>::ForwardType x3,
1074 typename internal::ParamTraits<X4>::ForwardType x4) {
1075 StorageType* invoker = static_cast<StorageType*>(base);
1076 if (!invoker->p1_.get()) {
1077 return;
1078 }
1079 (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
1080 x3, x4);
1081 }
1082 };
1083
818 // Function: Arity 6 -> 3. 1084 // Function: Arity 6 -> 3.
819 template <typename StorageType, typename R,typename X1, typename X2, 1085 template <typename StorageType, typename R,typename X1, typename X2,
820 typename X3, typename X4, typename X5, typename X6> 1086 typename X3, typename X4, typename X5, typename X6>
821 struct Invoker3<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 1087 struct Invoker3<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
822 static R DoInvoke(InvokerStorageBase* base, 1088 static R DoInvoke(InvokerStorageBase* base,
823 typename internal::ParamTraits<X4>::ForwardType x4, 1089 typename internal::ParamTraits<X4>::ForwardType x4,
824 typename internal::ParamTraits<X5>::ForwardType x5, 1090 typename internal::ParamTraits<X5>::ForwardType x5,
825 typename internal::ParamTraits<X6>::ForwardType x6) { 1091 typename internal::ParamTraits<X6>::ForwardType x6) {
826 StorageType* invoker = static_cast<StorageType*>(base); 1092 StorageType* invoker = static_cast<StorageType*>(base);
827 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 1093 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
828 Unwrap(invoker->p3_), x4, x5, x6); 1094 Unwrap(invoker->p3_), x4, x5, x6);
829 } 1095 }
830 }; 1096 };
831 1097
832 // Method: Arity 5 -> 3. 1098 // Method: Arity 5 -> 3.
833 template <typename StorageType, typename R, typename T, typename X1, 1099 template <typename StorageType, typename R, typename T, typename X1,
834 typename X2, typename X3, typename X4, typename X5> 1100 typename X2, typename X3, typename X4, typename X5>
835 struct Invoker3<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 1101 struct Invoker3<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
836 static R DoInvoke(InvokerStorageBase* base, 1102 static R DoInvoke(InvokerStorageBase* base,
837 typename internal::ParamTraits<X3>::ForwardType x3, 1103 typename internal::ParamTraits<X3>::ForwardType x3,
838 typename internal::ParamTraits<X4>::ForwardType x4, 1104 typename internal::ParamTraits<X4>::ForwardType x4,
839 typename internal::ParamTraits<X5>::ForwardType x5) { 1105 typename internal::ParamTraits<X5>::ForwardType x5) {
840 StorageType* invoker = static_cast<StorageType*>(base); 1106 StorageType* invoker = static_cast<StorageType*>(base);
841 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 1107 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
842 Unwrap(invoker->p3_), x3, x4, x5); 1108 Unwrap(invoker->p3_), x3, x4, x5);
843 } 1109 }
844 }; 1110 };
845 1111
846 template <typename StorageType, typename NormalizedSig> 1112 // WeakPtr Method: Arity 5 -> 3.
1113 template <typename StorageType, typename T, typename X1, typename X2,
1114 typename X3, typename X4, typename X5>
1115 struct Invoker3<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> {
1116 static void DoInvoke(InvokerStorageBase* base,
1117 typename internal::ParamTraits<X3>::ForwardType x3,
1118 typename internal::ParamTraits<X4>::ForwardType x4,
1119 typename internal::ParamTraits<X5>::ForwardType x5) {
1120 StorageType* invoker = static_cast<StorageType*>(base);
1121 if (!invoker->p1_.get()) {
1122 return;
1123 }
1124 (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
1125 x3, x4, x5);
1126 }
1127 };
1128
1129 template <bool IsWeak, typename StorageType, typename NormalizedSig>
847 struct Invoker4; 1130 struct Invoker4;
848 1131
849 // Function: Arity 4 -> 0. 1132 // Function: Arity 4 -> 0.
850 template <typename StorageType, typename R,typename X1, typename X2, 1133 template <typename StorageType, typename R,typename X1, typename X2,
851 typename X3, typename X4> 1134 typename X3, typename X4>
852 struct Invoker4<StorageType, R(*)(X1, X2, X3, X4)> { 1135 struct Invoker4<false, StorageType, R(*)(X1, X2, X3, X4)> {
853 static R DoInvoke(InvokerStorageBase* base) { 1136 static R DoInvoke(InvokerStorageBase* base) {
854 StorageType* invoker = static_cast<StorageType*>(base); 1137 StorageType* invoker = static_cast<StorageType*>(base);
855 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 1138 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
856 Unwrap(invoker->p3_), Unwrap(invoker->p4_)); 1139 Unwrap(invoker->p3_), Unwrap(invoker->p4_));
857 } 1140 }
858 }; 1141 };
859 1142
860 // Method: Arity 3 -> 0. 1143 // Method: Arity 3 -> 0.
861 template <typename StorageType, typename R, typename T, typename X1, 1144 template <typename StorageType, typename R, typename T, typename X1,
862 typename X2, typename X3> 1145 typename X2, typename X3>
863 struct Invoker4<StorageType, R(T::*)(X1, X2, X3)> { 1146 struct Invoker4<false, StorageType, R(T::*)(X1, X2, X3)> {
864 static R DoInvoke(InvokerStorageBase* base) { 1147 static R DoInvoke(InvokerStorageBase* base) {
865 StorageType* invoker = static_cast<StorageType*>(base); 1148 StorageType* invoker = static_cast<StorageType*>(base);
866 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 1149 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
867 Unwrap(invoker->p3_), Unwrap(invoker->p4_)); 1150 Unwrap(invoker->p3_), Unwrap(invoker->p4_));
868 } 1151 }
869 }; 1152 };
870 1153
1154 // WeakPtr Method: Arity 3 -> 0.
1155 template <typename StorageType, typename T, typename X1, typename X2,
1156 typename X3>
1157 struct Invoker4<true, StorageType, void(T::*)(X1, X2, X3)> {
1158 static void DoInvoke(InvokerStorageBase* base) {
1159 StorageType* invoker = static_cast<StorageType*>(base);
1160 if (!invoker->p1_.get()) {
1161 return;
1162 }
1163 (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
1164 Unwrap(invoker->p4_));
1165 }
1166 };
1167
871 // Function: Arity 5 -> 1. 1168 // Function: Arity 5 -> 1.
872 template <typename StorageType, typename R,typename X1, typename X2, 1169 template <typename StorageType, typename R,typename X1, typename X2,
873 typename X3, typename X4, typename X5> 1170 typename X3, typename X4, typename X5>
874 struct Invoker4<StorageType, R(*)(X1, X2, X3, X4, X5)> { 1171 struct Invoker4<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
875 static R DoInvoke(InvokerStorageBase* base, 1172 static R DoInvoke(InvokerStorageBase* base,
876 typename internal::ParamTraits<X5>::ForwardType x5) { 1173 typename internal::ParamTraits<X5>::ForwardType x5) {
877 StorageType* invoker = static_cast<StorageType*>(base); 1174 StorageType* invoker = static_cast<StorageType*>(base);
878 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 1175 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
879 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5); 1176 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5);
880 } 1177 }
881 }; 1178 };
882 1179
883 // Method: Arity 4 -> 1. 1180 // Method: Arity 4 -> 1.
884 template <typename StorageType, typename R, typename T, typename X1, 1181 template <typename StorageType, typename R, typename T, typename X1,
885 typename X2, typename X3, typename X4> 1182 typename X2, typename X3, typename X4>
886 struct Invoker4<StorageType, R(T::*)(X1, X2, X3, X4)> { 1183 struct Invoker4<false, StorageType, R(T::*)(X1, X2, X3, X4)> {
887 static R DoInvoke(InvokerStorageBase* base, 1184 static R DoInvoke(InvokerStorageBase* base,
888 typename internal::ParamTraits<X4>::ForwardType x4) { 1185 typename internal::ParamTraits<X4>::ForwardType x4) {
889 StorageType* invoker = static_cast<StorageType*>(base); 1186 StorageType* invoker = static_cast<StorageType*>(base);
890 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 1187 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
891 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4); 1188 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4);
892 } 1189 }
893 }; 1190 };
894 1191
1192 // WeakPtr Method: Arity 4 -> 1.
1193 template <typename StorageType, typename T, typename X1, typename X2,
1194 typename X3, typename X4>
1195 struct Invoker4<true, StorageType, void(T::*)(X1, X2, X3, X4)> {
1196 static void DoInvoke(InvokerStorageBase* base,
1197 typename internal::ParamTraits<X4>::ForwardType x4) {
1198 StorageType* invoker = static_cast<StorageType*>(base);
1199 if (!invoker->p1_.get()) {
1200 return;
1201 }
1202 (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
1203 Unwrap(invoker->p4_), x4);
1204 }
1205 };
1206
895 // Function: Arity 6 -> 2. 1207 // Function: Arity 6 -> 2.
896 template <typename StorageType, typename R,typename X1, typename X2, 1208 template <typename StorageType, typename R,typename X1, typename X2,
897 typename X3, typename X4, typename X5, typename X6> 1209 typename X3, typename X4, typename X5, typename X6>
898 struct Invoker4<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 1210 struct Invoker4<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
899 static R DoInvoke(InvokerStorageBase* base, 1211 static R DoInvoke(InvokerStorageBase* base,
900 typename internal::ParamTraits<X5>::ForwardType x5, 1212 typename internal::ParamTraits<X5>::ForwardType x5,
901 typename internal::ParamTraits<X6>::ForwardType x6) { 1213 typename internal::ParamTraits<X6>::ForwardType x6) {
902 StorageType* invoker = static_cast<StorageType*>(base); 1214 StorageType* invoker = static_cast<StorageType*>(base);
903 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 1215 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
904 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5, x6); 1216 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5, x6);
905 } 1217 }
906 }; 1218 };
907 1219
908 // Method: Arity 5 -> 2. 1220 // Method: Arity 5 -> 2.
909 template <typename StorageType, typename R, typename T, typename X1, 1221 template <typename StorageType, typename R, typename T, typename X1,
910 typename X2, typename X3, typename X4, typename X5> 1222 typename X2, typename X3, typename X4, typename X5>
911 struct Invoker4<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 1223 struct Invoker4<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
912 static R DoInvoke(InvokerStorageBase* base, 1224 static R DoInvoke(InvokerStorageBase* base,
913 typename internal::ParamTraits<X4>::ForwardType x4, 1225 typename internal::ParamTraits<X4>::ForwardType x4,
914 typename internal::ParamTraits<X5>::ForwardType x5) { 1226 typename internal::ParamTraits<X5>::ForwardType x5) {
915 StorageType* invoker = static_cast<StorageType*>(base); 1227 StorageType* invoker = static_cast<StorageType*>(base);
916 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 1228 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
917 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4, x5); 1229 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4, x5);
918 } 1230 }
919 }; 1231 };
920 1232
921 template <typename StorageType, typename NormalizedSig> 1233 // WeakPtr Method: Arity 5 -> 2.
1234 template <typename StorageType, typename T, typename X1, typename X2,
1235 typename X3, typename X4, typename X5>
1236 struct Invoker4<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> {
1237 static void DoInvoke(InvokerStorageBase* base,
1238 typename internal::ParamTraits<X4>::ForwardType x4,
1239 typename internal::ParamTraits<X5>::ForwardType x5) {
1240 StorageType* invoker = static_cast<StorageType*>(base);
1241 if (!invoker->p1_.get()) {
1242 return;
1243 }
1244 (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
1245 Unwrap(invoker->p4_), x4, x5);
1246 }
1247 };
1248
1249 template <bool IsWeak, typename StorageType, typename NormalizedSig>
922 struct Invoker5; 1250 struct Invoker5;
923 1251
924 // Function: Arity 5 -> 0. 1252 // Function: Arity 5 -> 0.
925 template <typename StorageType, typename R,typename X1, typename X2, 1253 template <typename StorageType, typename R,typename X1, typename X2,
926 typename X3, typename X4, typename X5> 1254 typename X3, typename X4, typename X5>
927 struct Invoker5<StorageType, R(*)(X1, X2, X3, X4, X5)> { 1255 struct Invoker5<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
928 static R DoInvoke(InvokerStorageBase* base) { 1256 static R DoInvoke(InvokerStorageBase* base) {
929 StorageType* invoker = static_cast<StorageType*>(base); 1257 StorageType* invoker = static_cast<StorageType*>(base);
930 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 1258 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
931 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_)); 1259 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_));
932 } 1260 }
933 }; 1261 };
934 1262
935 // Method: Arity 4 -> 0. 1263 // Method: Arity 4 -> 0.
936 template <typename StorageType, typename R, typename T, typename X1, 1264 template <typename StorageType, typename R, typename T, typename X1,
937 typename X2, typename X3, typename X4> 1265 typename X2, typename X3, typename X4>
938 struct Invoker5<StorageType, R(T::*)(X1, X2, X3, X4)> { 1266 struct Invoker5<false, StorageType, R(T::*)(X1, X2, X3, X4)> {
939 static R DoInvoke(InvokerStorageBase* base) { 1267 static R DoInvoke(InvokerStorageBase* base) {
940 StorageType* invoker = static_cast<StorageType*>(base); 1268 StorageType* invoker = static_cast<StorageType*>(base);
941 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 1269 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
942 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_)); 1270 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_));
943 } 1271 }
944 }; 1272 };
945 1273
1274 // WeakPtr Method: Arity 4 -> 0.
1275 template <typename StorageType, typename T, typename X1, typename X2,
1276 typename X3, typename X4>
1277 struct Invoker5<true, StorageType, void(T::*)(X1, X2, X3, X4)> {
1278 static void DoInvoke(InvokerStorageBase* base) {
1279 StorageType* invoker = static_cast<StorageType*>(base);
1280 if (!invoker->p1_.get()) {
1281 return;
1282 }
1283 (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
1284 Unwrap(invoker->p4_), Unwrap(invoker->p5_));
1285 }
1286 };
1287
946 // Function: Arity 6 -> 1. 1288 // Function: Arity 6 -> 1.
947 template <typename StorageType, typename R,typename X1, typename X2, 1289 template <typename StorageType, typename R,typename X1, typename X2,
948 typename X3, typename X4, typename X5, typename X6> 1290 typename X3, typename X4, typename X5, typename X6>
949 struct Invoker5<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 1291 struct Invoker5<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
950 static R DoInvoke(InvokerStorageBase* base, 1292 static R DoInvoke(InvokerStorageBase* base,
951 typename internal::ParamTraits<X6>::ForwardType x6) { 1293 typename internal::ParamTraits<X6>::ForwardType x6) {
952 StorageType* invoker = static_cast<StorageType*>(base); 1294 StorageType* invoker = static_cast<StorageType*>(base);
953 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 1295 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
954 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x6); 1296 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x6);
955 } 1297 }
956 }; 1298 };
957 1299
958 // Method: Arity 5 -> 1. 1300 // Method: Arity 5 -> 1.
959 template <typename StorageType, typename R, typename T, typename X1, 1301 template <typename StorageType, typename R, typename T, typename X1,
960 typename X2, typename X3, typename X4, typename X5> 1302 typename X2, typename X3, typename X4, typename X5>
961 struct Invoker5<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 1303 struct Invoker5<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
962 static R DoInvoke(InvokerStorageBase* base, 1304 static R DoInvoke(InvokerStorageBase* base,
963 typename internal::ParamTraits<X5>::ForwardType x5) { 1305 typename internal::ParamTraits<X5>::ForwardType x5) {
964 StorageType* invoker = static_cast<StorageType*>(base); 1306 StorageType* invoker = static_cast<StorageType*>(base);
965 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 1307 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
966 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5); 1308 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5);
967 } 1309 }
968 }; 1310 };
969 1311
970 template <typename StorageType, typename NormalizedSig> 1312 // WeakPtr Method: Arity 5 -> 1.
1313 template <typename StorageType, typename T, typename X1, typename X2,
1314 typename X3, typename X4, typename X5>
1315 struct Invoker5<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> {
1316 static void DoInvoke(InvokerStorageBase* base,
1317 typename internal::ParamTraits<X5>::ForwardType x5) {
1318 StorageType* invoker = static_cast<StorageType*>(base);
1319 if (!invoker->p1_.get()) {
1320 return;
1321 }
1322 (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
1323 Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5);
1324 }
1325 };
1326
1327 template <bool IsWeak, typename StorageType, typename NormalizedSig>
971 struct Invoker6; 1328 struct Invoker6;
972 1329
973 // Function: Arity 6 -> 0. 1330 // Function: Arity 6 -> 0.
974 template <typename StorageType, typename R,typename X1, typename X2, 1331 template <typename StorageType, typename R,typename X1, typename X2,
975 typename X3, typename X4, typename X5, typename X6> 1332 typename X3, typename X4, typename X5, typename X6>
976 struct Invoker6<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 1333 struct Invoker6<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
977 static R DoInvoke(InvokerStorageBase* base) { 1334 static R DoInvoke(InvokerStorageBase* base) {
978 StorageType* invoker = static_cast<StorageType*>(base); 1335 StorageType* invoker = static_cast<StorageType*>(base);
979 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 1336 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
980 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), 1337 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_),
981 Unwrap(invoker->p6_)); 1338 Unwrap(invoker->p6_));
982 } 1339 }
983 }; 1340 };
984 1341
985 // Method: Arity 5 -> 0. 1342 // Method: Arity 5 -> 0.
986 template <typename StorageType, typename R, typename T, typename X1, 1343 template <typename StorageType, typename R, typename T, typename X1,
987 typename X2, typename X3, typename X4, typename X5> 1344 typename X2, typename X3, typename X4, typename X5>
988 struct Invoker6<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 1345 struct Invoker6<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
989 static R DoInvoke(InvokerStorageBase* base) { 1346 static R DoInvoke(InvokerStorageBase* base) {
990 StorageType* invoker = static_cast<StorageType*>(base); 1347 StorageType* invoker = static_cast<StorageType*>(base);
991 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 1348 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
992 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), 1349 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_),
993 Unwrap(invoker->p6_)); 1350 Unwrap(invoker->p6_));
994 } 1351 }
995 }; 1352 };
996 1353
1354 // WeakPtr Method: Arity 5 -> 0.
1355 template <typename StorageType, typename T, typename X1, typename X2,
1356 typename X3, typename X4, typename X5>
1357 struct Invoker6<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> {
1358 static void DoInvoke(InvokerStorageBase* base) {
1359 StorageType* invoker = static_cast<StorageType*>(base);
1360 if (!invoker->p1_.get()) {
1361 return;
1362 }
1363 (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
1364 Unwrap(invoker->p4_), Unwrap(invoker->p5_), Unwrap(invoker->p6_));
1365 }
1366 };
997 1367
998 // InvokerStorageN<> 1368 // InvokerStorageN<>
999 // 1369 //
1000 // These are the actual storage classes for the Invokers. 1370 // These are the actual storage classes for the Invokers.
1001 // 1371 //
1002 // Though these types are "classes", they are being used as structs with 1372 // 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 1373 // 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 1374 // 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 1375 // 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 1376 // Sig type like in InvokerN above to know the return type, and the arity
1007 // of Run(). 1377 // of Run().
1008 // 1378 //
1009 // An alternate solution would be to merge InvokerN and InvokerStorageN, 1379 // An alternate solution would be to merge InvokerN and InvokerStorageN,
1010 // but the generated code seemed harder to read. 1380 // but the generated code seemed harder to read.
1011 1381
1012 template <typename Sig> 1382 template <typename Sig>
1013 class InvokerStorage0 : public InvokerStorageBase { 1383 class InvokerStorage0 : public InvokerStorageBase {
1014 public: 1384 public:
1015 typedef InvokerStorage0 StorageType; 1385 typedef InvokerStorage0 StorageType;
1016 typedef FunctionTraits<Sig> TargetTraits; 1386 typedef FunctionTraits<Sig> TargetTraits;
1017 typedef Invoker0<StorageType, typename TargetTraits::NormalizedSig> Invoker;
1018 typedef typename TargetTraits::IsMethod IsMethod; 1387 typedef typename TargetTraits::IsMethod IsMethod;
1388 typedef Invoker0<false, StorageType,
1389 typename TargetTraits::NormalizedSig> Invoker;
1019 1390
1020 1391
1021 1392
1022 InvokerStorage0(Sig f) 1393 InvokerStorage0(Sig f)
1023 : f_(f) { 1394 : f_(f) {
1024 } 1395 }
1025 1396
1026 virtual ~InvokerStorage0() { } 1397 virtual ~InvokerStorage0() { }
1027 1398
1028 Sig f_; 1399 Sig f_;
1029 }; 1400 };
1030 1401
1031 template <typename Sig, typename P1> 1402 template <typename Sig, typename P1>
1032 class InvokerStorage1 : public InvokerStorageBase { 1403 class InvokerStorage1 : public InvokerStorageBase {
1033 public: 1404 public:
1034 typedef InvokerStorage1 StorageType; 1405 typedef InvokerStorage1 StorageType;
1035 typedef FunctionTraits<Sig> TargetTraits; 1406 typedef FunctionTraits<Sig> TargetTraits;
1036 typedef Invoker1<StorageType, typename TargetTraits::NormalizedSig> Invoker;
1037 typedef typename TargetTraits::IsMethod IsMethod; 1407 typedef typename TargetTraits::IsMethod IsMethod;
1408 typedef Invoker1<IsWeakMethod<IsMethod::value, P1>::value, StorageType,
1409 typename TargetTraits::NormalizedSig> Invoker;
1410 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) ||
1411 is_void<typename TargetTraits::Return>::value,
1412 weak_ptrs_can_only_bind_to_methods_without_return_values);
1038 1413
1039 // For methods, we need to be careful for parameter 1. We skip the 1414 // 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 1415 // 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. 1416 // disallow binding of an array as the method's target object.
1042 COMPILE_ASSERT(IsMethod::value || 1417 COMPILE_ASSERT(IsMethod::value ||
1043 !internal::UnsafeBindtoRefCountedArg<P1>::value, 1418 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1044 p1_is_refcounted_type_and_needs_scoped_refptr); 1419 p1_is_refcounted_type_and_needs_scoped_refptr);
1045 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, 1420 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1046 first_bound_argument_to_method_cannot_be_array); 1421 first_bound_argument_to_method_cannot_be_array);
1047 1422
(...skipping 18 matching lines...) Expand all
1066 1441
1067 Sig f_; 1442 Sig f_;
1068 typename ParamTraits<P1>::StorageType p1_; 1443 typename ParamTraits<P1>::StorageType p1_;
1069 }; 1444 };
1070 1445
1071 template <typename Sig, typename P1, typename P2> 1446 template <typename Sig, typename P1, typename P2>
1072 class InvokerStorage2 : public InvokerStorageBase { 1447 class InvokerStorage2 : public InvokerStorageBase {
1073 public: 1448 public:
1074 typedef InvokerStorage2 StorageType; 1449 typedef InvokerStorage2 StorageType;
1075 typedef FunctionTraits<Sig> TargetTraits; 1450 typedef FunctionTraits<Sig> TargetTraits;
1076 typedef Invoker2<StorageType, typename TargetTraits::NormalizedSig> Invoker;
1077 typedef typename TargetTraits::IsMethod IsMethod; 1451 typedef typename TargetTraits::IsMethod IsMethod;
1452 typedef Invoker2<IsWeakMethod<IsMethod::value, P1>::value, StorageType,
1453 typename TargetTraits::NormalizedSig> Invoker;
1454 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) ||
1455 is_void<typename TargetTraits::Return>::value,
1456 weak_ptrs_can_only_bind_to_methods_without_return_values);
1078 1457
1079 // For methods, we need to be careful for parameter 1. We skip the 1458 // 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 1459 // 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. 1460 // disallow binding of an array as the method's target object.
1082 COMPILE_ASSERT(IsMethod::value || 1461 COMPILE_ASSERT(IsMethod::value ||
1083 !internal::UnsafeBindtoRefCountedArg<P1>::value, 1462 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1084 p1_is_refcounted_type_and_needs_scoped_refptr); 1463 p1_is_refcounted_type_and_needs_scoped_refptr);
1085 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, 1464 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1086 first_bound_argument_to_method_cannot_be_array); 1465 first_bound_argument_to_method_cannot_be_array);
1087 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, 1466 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value,
(...skipping 23 matching lines...) Expand all
1111 Sig f_; 1490 Sig f_;
1112 typename ParamTraits<P1>::StorageType p1_; 1491 typename ParamTraits<P1>::StorageType p1_;
1113 typename ParamTraits<P2>::StorageType p2_; 1492 typename ParamTraits<P2>::StorageType p2_;
1114 }; 1493 };
1115 1494
1116 template <typename Sig, typename P1, typename P2, typename P3> 1495 template <typename Sig, typename P1, typename P2, typename P3>
1117 class InvokerStorage3 : public InvokerStorageBase { 1496 class InvokerStorage3 : public InvokerStorageBase {
1118 public: 1497 public:
1119 typedef InvokerStorage3 StorageType; 1498 typedef InvokerStorage3 StorageType;
1120 typedef FunctionTraits<Sig> TargetTraits; 1499 typedef FunctionTraits<Sig> TargetTraits;
1121 typedef Invoker3<StorageType, typename TargetTraits::NormalizedSig> Invoker;
1122 typedef typename TargetTraits::IsMethod IsMethod; 1500 typedef typename TargetTraits::IsMethod IsMethod;
1501 typedef Invoker3<IsWeakMethod<IsMethod::value, P1>::value, StorageType,
1502 typename TargetTraits::NormalizedSig> Invoker;
1503 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) ||
1504 is_void<typename TargetTraits::Return>::value,
1505 weak_ptrs_can_only_bind_to_methods_without_return_values);
1123 1506
1124 // For methods, we need to be careful for parameter 1. We skip the 1507 // 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 1508 // 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. 1509 // disallow binding of an array as the method's target object.
1127 COMPILE_ASSERT(IsMethod::value || 1510 COMPILE_ASSERT(IsMethod::value ||
1128 !internal::UnsafeBindtoRefCountedArg<P1>::value, 1511 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1129 p1_is_refcounted_type_and_needs_scoped_refptr); 1512 p1_is_refcounted_type_and_needs_scoped_refptr);
1130 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, 1513 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1131 first_bound_argument_to_method_cannot_be_array); 1514 first_bound_argument_to_method_cannot_be_array);
1132 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, 1515 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value,
(...skipping 28 matching lines...) Expand all
1161 typename ParamTraits<P1>::StorageType p1_; 1544 typename ParamTraits<P1>::StorageType p1_;
1162 typename ParamTraits<P2>::StorageType p2_; 1545 typename ParamTraits<P2>::StorageType p2_;
1163 typename ParamTraits<P3>::StorageType p3_; 1546 typename ParamTraits<P3>::StorageType p3_;
1164 }; 1547 };
1165 1548
1166 template <typename Sig, typename P1, typename P2, typename P3, typename P4> 1549 template <typename Sig, typename P1, typename P2, typename P3, typename P4>
1167 class InvokerStorage4 : public InvokerStorageBase { 1550 class InvokerStorage4 : public InvokerStorageBase {
1168 public: 1551 public:
1169 typedef InvokerStorage4 StorageType; 1552 typedef InvokerStorage4 StorageType;
1170 typedef FunctionTraits<Sig> TargetTraits; 1553 typedef FunctionTraits<Sig> TargetTraits;
1171 typedef Invoker4<StorageType, typename TargetTraits::NormalizedSig> Invoker;
1172 typedef typename TargetTraits::IsMethod IsMethod; 1554 typedef typename TargetTraits::IsMethod IsMethod;
1555 typedef Invoker4<IsWeakMethod<IsMethod::value, P1>::value, StorageType,
1556 typename TargetTraits::NormalizedSig> Invoker;
1557 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) ||
1558 is_void<typename TargetTraits::Return>::value,
1559 weak_ptrs_can_only_bind_to_methods_without_return_values);
1173 1560
1174 // For methods, we need to be careful for parameter 1. We skip the 1561 // 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 1562 // 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. 1563 // disallow binding of an array as the method's target object.
1177 COMPILE_ASSERT(IsMethod::value || 1564 COMPILE_ASSERT(IsMethod::value ||
1178 !internal::UnsafeBindtoRefCountedArg<P1>::value, 1565 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1179 p1_is_refcounted_type_and_needs_scoped_refptr); 1566 p1_is_refcounted_type_and_needs_scoped_refptr);
1180 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, 1567 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1181 first_bound_argument_to_method_cannot_be_array); 1568 first_bound_argument_to_method_cannot_be_array);
1182 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, 1569 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1217 typename ParamTraits<P3>::StorageType p3_; 1604 typename ParamTraits<P3>::StorageType p3_;
1218 typename ParamTraits<P4>::StorageType p4_; 1605 typename ParamTraits<P4>::StorageType p4_;
1219 }; 1606 };
1220 1607
1221 template <typename Sig, typename P1, typename P2, typename P3, typename P4, 1608 template <typename Sig, typename P1, typename P2, typename P3, typename P4,
1222 typename P5> 1609 typename P5>
1223 class InvokerStorage5 : public InvokerStorageBase { 1610 class InvokerStorage5 : public InvokerStorageBase {
1224 public: 1611 public:
1225 typedef InvokerStorage5 StorageType; 1612 typedef InvokerStorage5 StorageType;
1226 typedef FunctionTraits<Sig> TargetTraits; 1613 typedef FunctionTraits<Sig> TargetTraits;
1227 typedef Invoker5<StorageType, typename TargetTraits::NormalizedSig> Invoker;
1228 typedef typename TargetTraits::IsMethod IsMethod; 1614 typedef typename TargetTraits::IsMethod IsMethod;
1615 typedef Invoker5<IsWeakMethod<IsMethod::value, P1>::value, StorageType,
1616 typename TargetTraits::NormalizedSig> Invoker;
1617 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) ||
1618 is_void<typename TargetTraits::Return>::value,
1619 weak_ptrs_can_only_bind_to_methods_without_return_values);
1229 1620
1230 // For methods, we need to be careful for parameter 1. We skip the 1621 // 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 1622 // 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. 1623 // disallow binding of an array as the method's target object.
1233 COMPILE_ASSERT(IsMethod::value || 1624 COMPILE_ASSERT(IsMethod::value ||
1234 !internal::UnsafeBindtoRefCountedArg<P1>::value, 1625 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1235 p1_is_refcounted_type_and_needs_scoped_refptr); 1626 p1_is_refcounted_type_and_needs_scoped_refptr);
1236 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, 1627 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1237 first_bound_argument_to_method_cannot_be_array); 1628 first_bound_argument_to_method_cannot_be_array);
1238 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, 1629 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value,
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1279 typename ParamTraits<P4>::StorageType p4_; 1670 typename ParamTraits<P4>::StorageType p4_;
1280 typename ParamTraits<P5>::StorageType p5_; 1671 typename ParamTraits<P5>::StorageType p5_;
1281 }; 1672 };
1282 1673
1283 template <typename Sig, typename P1, typename P2, typename P3, typename P4, 1674 template <typename Sig, typename P1, typename P2, typename P3, typename P4,
1284 typename P5, typename P6> 1675 typename P5, typename P6>
1285 class InvokerStorage6 : public InvokerStorageBase { 1676 class InvokerStorage6 : public InvokerStorageBase {
1286 public: 1677 public:
1287 typedef InvokerStorage6 StorageType; 1678 typedef InvokerStorage6 StorageType;
1288 typedef FunctionTraits<Sig> TargetTraits; 1679 typedef FunctionTraits<Sig> TargetTraits;
1289 typedef Invoker6<StorageType, typename TargetTraits::NormalizedSig> Invoker;
1290 typedef typename TargetTraits::IsMethod IsMethod; 1680 typedef typename TargetTraits::IsMethod IsMethod;
1681 typedef Invoker6<IsWeakMethod<IsMethod::value, P1>::value, StorageType,
1682 typename TargetTraits::NormalizedSig> Invoker;
1683 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) ||
1684 is_void<typename TargetTraits::Return>::value,
1685 weak_ptrs_can_only_bind_to_methods_without_return_values);
1291 1686
1292 // For methods, we need to be careful for parameter 1. We skip the 1687 // 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 1688 // 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. 1689 // disallow binding of an array as the method's target object.
1295 COMPILE_ASSERT(IsMethod::value || 1690 COMPILE_ASSERT(IsMethod::value ||
1296 !internal::UnsafeBindtoRefCountedArg<P1>::value, 1691 !internal::UnsafeBindtoRefCountedArg<P1>::value,
1297 p1_is_refcounted_type_and_needs_scoped_refptr); 1692 p1_is_refcounted_type_and_needs_scoped_refptr);
1298 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, 1693 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1299 first_bound_argument_to_method_cannot_be_array); 1694 first_bound_argument_to_method_cannot_be_array);
1300 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, 1695 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value,
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1344 typename ParamTraits<P3>::StorageType p3_; 1739 typename ParamTraits<P3>::StorageType p3_;
1345 typename ParamTraits<P4>::StorageType p4_; 1740 typename ParamTraits<P4>::StorageType p4_;
1346 typename ParamTraits<P5>::StorageType p5_; 1741 typename ParamTraits<P5>::StorageType p5_;
1347 typename ParamTraits<P6>::StorageType p6_; 1742 typename ParamTraits<P6>::StorageType p6_;
1348 }; 1743 };
1349 1744
1350 } // namespace internal 1745 } // namespace internal
1351 } // namespace base 1746 } // namespace base
1352 1747
1353 #endif // BASE_BIND_INTERNAL_H_ 1748 #endif // BASE_BIND_INTERNAL_H_
OLDNEW
« base/bind_helpers.h ('K') | « 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