OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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_ |
OLD | NEW |