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/memory/weak_ptr.h" |
17 #include "base/template_util.h" | 18 #include "base/template_util.h" |
18 #include "build/build_config.h" | 19 #include "build/build_config.h" |
19 | 20 |
20 #if defined(OS_WIN) | 21 #if defined(OS_WIN) |
21 #include "base/bind_internal_win.h" | 22 #include "base/bind_internal_win.h" |
22 #endif | 23 #endif |
23 | 24 |
24 namespace base { | 25 namespace base { |
25 namespace internal { | 26 namespace internal { |
26 | 27 |
27 // The method by which a function is invoked is determined by 3 different | 28 // The method by which a function is invoked is determined by 3 different |
28 // dimensions: | 29 // dimensions: |
29 // | 30 // |
30 // 1) The type of function (normal or method). | 31 // 1) The type of function (normal or method). |
31 // 2) The arity of the function. | 32 // 2) The arity of the function. |
32 // 3) The number of bound parameters. | 33 // 3) The number of bound parameters. |
33 // | 34 // |
34 // The templates below handle the determination of each of these dimensions. | 35 // The templates below handle the determination of each of these dimensions. |
35 // In brief: | 36 // In brief: |
36 // | 37 // |
37 // FunctionTraits<> -- Provides a normalied signature, and other traits. | 38 // FunctionTraits<> -- Provides a normalied signature, and other traits. |
38 // InvokerN<> -- Provides a DoInvoke() function that actually executes | 39 // InvokerN<> -- Provides a DoInvoke() function that actually executes |
39 // a calback. | 40 // a calback. |
40 // InvokerStorageN<> -- Provides storage for the bound parameters, and | 41 // InvokerStorageN<> -- Provides storage for the bound parameters, and |
41 // typedefs to the above. | 42 // typedefs to the above. |
| 43 // IsWeakMethod<> -- Determines if we are binding a method to a WeakPtr<>. |
42 // | 44 // |
43 // More details about the design of each class is included in a comment closer | 45 // More details about the design of each class is included in a comment closer |
44 // to their defition. | 46 // to their defition. |
45 | 47 |
| 48 |
| 49 // IsWeakMethod determines if we are binding a method to a WeakPtr<> for an |
| 50 // object. It is used to select an InvokerN that will no-op itself in the |
| 51 // event the WeakPtr<> for the target object is invalidated. |
| 52 template <bool IsMethod, typename T> |
| 53 struct IsWeakMethod : public false_type {}; |
| 54 |
| 55 template <typename T> |
| 56 struct IsWeakMethod<true, WeakPtr<T> > : public true_type {}; |
| 57 |
46 // FunctionTraits<> | 58 // FunctionTraits<> |
47 // | 59 // |
48 // The FunctionTraits<> template determines the type of function, and also | 60 // The FunctionTraits<> template determines the type of function, and also |
49 // creates a NormalizedType used to select the InvokerN classes. It turns out | 61 // creates a NormalizedType used to select the InvokerN classes. It turns out |
50 // that syntactically, you only really have 2 variations when invoking a | 62 // that syntactically, you only really have 2 variations when invoking a |
51 // funciton pointer: normal, and method. One is invoked func_ptr(arg1). The | 63 // funciton pointer: normal, and method. One is invoked func_ptr(arg1). The |
52 // other is invoked (*obj_->method_ptr(arg1)). | 64 // other is invoked (*obj_->method_ptr(arg1)). |
53 // | 65 // |
54 // However, in the type system, there are many more distinctions. In standard | 66 // However, in the type system, there are many more distinctions. In standard |
55 // C++, there's all variations of const, and volatile on the function pointer. | 67 // C++, there's all variations of const, and volatile on the function pointer. |
(...skipping 12 matching lines...) Expand all 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 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 557 if (!weak_ptr.get()) { |
| 558 return; |
| 559 } |
| 560 (weak_ptr->*invoker->f_)(); |
| 561 } |
| 562 }; |
| 563 |
491 // Function: Arity 2 -> 1. | 564 // Function: Arity 2 -> 1. |
492 template <typename StorageType, typename R,typename X1, typename X2> | 565 template <typename StorageType, typename R,typename X1, typename X2> |
493 struct Invoker1<StorageType, R(*)(X1, X2)> { | 566 struct Invoker1<false, StorageType, R(*)(X1, X2)> { |
494 static R DoInvoke(InvokerStorageBase* base, | 567 static R DoInvoke(InvokerStorageBase* base, |
495 typename internal::ParamTraits<X2>::ForwardType x2) { | 568 typename internal::ParamTraits<X2>::ForwardType x2) { |
496 StorageType* invoker = static_cast<StorageType*>(base); | 569 StorageType* invoker = static_cast<StorageType*>(base); |
497 return invoker->f_(Unwrap(invoker->p1_), x2); | 570 return invoker->f_(Unwrap(invoker->p1_), x2); |
498 } | 571 } |
499 }; | 572 }; |
500 | 573 |
501 // Method: Arity 1 -> 1. | 574 // Method: Arity 1 -> 1. |
502 template <typename StorageType, typename R, typename T, typename X1> | 575 template <typename StorageType, typename R, typename T, typename X1> |
503 struct Invoker1<StorageType, R(T::*)(X1)> { | 576 struct Invoker1<false, StorageType, R(T::*)(X1)> { |
504 static R DoInvoke(InvokerStorageBase* base, | 577 static R DoInvoke(InvokerStorageBase* base, |
505 typename internal::ParamTraits<X1>::ForwardType x1) { | 578 typename internal::ParamTraits<X1>::ForwardType x1) { |
506 StorageType* invoker = static_cast<StorageType*>(base); | 579 StorageType* invoker = static_cast<StorageType*>(base); |
507 return (Unwrap(invoker->p1_)->*invoker->f_)(x1); | 580 return (Unwrap(invoker->p1_)->*invoker->f_)(x1); |
508 } | 581 } |
509 }; | 582 }; |
510 | 583 |
| 584 // WeakPtr Method: Arity 1 -> 1. |
| 585 template <typename StorageType, typename T, typename X1> |
| 586 struct Invoker1<true, StorageType, void(T::*)(X1)> { |
| 587 static void DoInvoke(InvokerStorageBase* base, |
| 588 typename internal::ParamTraits<X1>::ForwardType x1) { |
| 589 StorageType* invoker = static_cast<StorageType*>(base); |
| 590 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 591 if (!weak_ptr.get()) { |
| 592 return; |
| 593 } |
| 594 (weak_ptr->*invoker->f_)(x1); |
| 595 } |
| 596 }; |
| 597 |
511 // Function: Arity 3 -> 2. | 598 // Function: Arity 3 -> 2. |
512 template <typename StorageType, typename R,typename X1, typename X2, | 599 template <typename StorageType, typename R,typename X1, typename X2, |
513 typename X3> | 600 typename X3> |
514 struct Invoker1<StorageType, R(*)(X1, X2, X3)> { | 601 struct Invoker1<false, StorageType, R(*)(X1, X2, X3)> { |
515 static R DoInvoke(InvokerStorageBase* base, | 602 static R DoInvoke(InvokerStorageBase* base, |
516 typename internal::ParamTraits<X2>::ForwardType x2, | 603 typename internal::ParamTraits<X2>::ForwardType x2, |
517 typename internal::ParamTraits<X3>::ForwardType x3) { | 604 typename internal::ParamTraits<X3>::ForwardType x3) { |
518 StorageType* invoker = static_cast<StorageType*>(base); | 605 StorageType* invoker = static_cast<StorageType*>(base); |
519 return invoker->f_(Unwrap(invoker->p1_), x2, x3); | 606 return invoker->f_(Unwrap(invoker->p1_), x2, x3); |
520 } | 607 } |
521 }; | 608 }; |
522 | 609 |
523 // Method: Arity 2 -> 2. | 610 // Method: Arity 2 -> 2. |
524 template <typename StorageType, typename R, typename T, typename X1, | 611 template <typename StorageType, typename R, typename T, typename X1, |
525 typename X2> | 612 typename X2> |
526 struct Invoker1<StorageType, R(T::*)(X1, X2)> { | 613 struct Invoker1<false, StorageType, R(T::*)(X1, X2)> { |
527 static R DoInvoke(InvokerStorageBase* base, | 614 static R DoInvoke(InvokerStorageBase* base, |
528 typename internal::ParamTraits<X1>::ForwardType x1, | 615 typename internal::ParamTraits<X1>::ForwardType x1, |
529 typename internal::ParamTraits<X2>::ForwardType x2) { | 616 typename internal::ParamTraits<X2>::ForwardType x2) { |
530 StorageType* invoker = static_cast<StorageType*>(base); | 617 StorageType* invoker = static_cast<StorageType*>(base); |
531 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2); | 618 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2); |
532 } | 619 } |
533 }; | 620 }; |
534 | 621 |
| 622 // WeakPtr Method: Arity 2 -> 2. |
| 623 template <typename StorageType, typename T, typename X1, typename X2> |
| 624 struct Invoker1<true, StorageType, void(T::*)(X1, X2)> { |
| 625 static void DoInvoke(InvokerStorageBase* base, |
| 626 typename internal::ParamTraits<X1>::ForwardType x1, |
| 627 typename internal::ParamTraits<X2>::ForwardType x2) { |
| 628 StorageType* invoker = static_cast<StorageType*>(base); |
| 629 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 630 if (!weak_ptr.get()) { |
| 631 return; |
| 632 } |
| 633 (weak_ptr->*invoker->f_)(x1, x2); |
| 634 } |
| 635 }; |
| 636 |
535 // Function: Arity 4 -> 3. | 637 // Function: Arity 4 -> 3. |
536 template <typename StorageType, typename R,typename X1, typename X2, | 638 template <typename StorageType, typename R,typename X1, typename X2, |
537 typename X3, typename X4> | 639 typename X3, typename X4> |
538 struct Invoker1<StorageType, R(*)(X1, X2, X3, X4)> { | 640 struct Invoker1<false, StorageType, R(*)(X1, X2, X3, X4)> { |
539 static R DoInvoke(InvokerStorageBase* base, | 641 static R DoInvoke(InvokerStorageBase* base, |
540 typename internal::ParamTraits<X2>::ForwardType x2, | 642 typename internal::ParamTraits<X2>::ForwardType x2, |
541 typename internal::ParamTraits<X3>::ForwardType x3, | 643 typename internal::ParamTraits<X3>::ForwardType x3, |
542 typename internal::ParamTraits<X4>::ForwardType x4) { | 644 typename internal::ParamTraits<X4>::ForwardType x4) { |
543 StorageType* invoker = static_cast<StorageType*>(base); | 645 StorageType* invoker = static_cast<StorageType*>(base); |
544 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4); | 646 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4); |
545 } | 647 } |
546 }; | 648 }; |
547 | 649 |
548 // Method: Arity 3 -> 3. | 650 // Method: Arity 3 -> 3. |
549 template <typename StorageType, typename R, typename T, typename X1, | 651 template <typename StorageType, typename R, typename T, typename X1, |
550 typename X2, typename X3> | 652 typename X2, typename X3> |
551 struct Invoker1<StorageType, R(T::*)(X1, X2, X3)> { | 653 struct Invoker1<false, StorageType, R(T::*)(X1, X2, X3)> { |
552 static R DoInvoke(InvokerStorageBase* base, | 654 static R DoInvoke(InvokerStorageBase* base, |
553 typename internal::ParamTraits<X1>::ForwardType x1, | 655 typename internal::ParamTraits<X1>::ForwardType x1, |
554 typename internal::ParamTraits<X2>::ForwardType x2, | 656 typename internal::ParamTraits<X2>::ForwardType x2, |
555 typename internal::ParamTraits<X3>::ForwardType x3) { | 657 typename internal::ParamTraits<X3>::ForwardType x3) { |
556 StorageType* invoker = static_cast<StorageType*>(base); | 658 StorageType* invoker = static_cast<StorageType*>(base); |
557 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3); | 659 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3); |
558 } | 660 } |
559 }; | 661 }; |
560 | 662 |
| 663 // WeakPtr Method: Arity 3 -> 3. |
| 664 template <typename StorageType, typename T, typename X1, typename X2, |
| 665 typename X3> |
| 666 struct Invoker1<true, StorageType, void(T::*)(X1, X2, X3)> { |
| 667 static void DoInvoke(InvokerStorageBase* base, |
| 668 typename internal::ParamTraits<X1>::ForwardType x1, |
| 669 typename internal::ParamTraits<X2>::ForwardType x2, |
| 670 typename internal::ParamTraits<X3>::ForwardType x3) { |
| 671 StorageType* invoker = static_cast<StorageType*>(base); |
| 672 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 673 if (!weak_ptr.get()) { |
| 674 return; |
| 675 } |
| 676 (weak_ptr->*invoker->f_)(x1, x2, x3); |
| 677 } |
| 678 }; |
| 679 |
561 // Function: Arity 5 -> 4. | 680 // Function: Arity 5 -> 4. |
562 template <typename StorageType, typename R,typename X1, typename X2, | 681 template <typename StorageType, typename R,typename X1, typename X2, |
563 typename X3, typename X4, typename X5> | 682 typename X3, typename X4, typename X5> |
564 struct Invoker1<StorageType, R(*)(X1, X2, X3, X4, X5)> { | 683 struct Invoker1<false, StorageType, R(*)(X1, X2, X3, X4, X5)> { |
565 static R DoInvoke(InvokerStorageBase* base, | 684 static R DoInvoke(InvokerStorageBase* base, |
566 typename internal::ParamTraits<X2>::ForwardType x2, | 685 typename internal::ParamTraits<X2>::ForwardType x2, |
567 typename internal::ParamTraits<X3>::ForwardType x3, | 686 typename internal::ParamTraits<X3>::ForwardType x3, |
568 typename internal::ParamTraits<X4>::ForwardType x4, | 687 typename internal::ParamTraits<X4>::ForwardType x4, |
569 typename internal::ParamTraits<X5>::ForwardType x5) { | 688 typename internal::ParamTraits<X5>::ForwardType x5) { |
570 StorageType* invoker = static_cast<StorageType*>(base); | 689 StorageType* invoker = static_cast<StorageType*>(base); |
571 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5); | 690 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5); |
572 } | 691 } |
573 }; | 692 }; |
574 | 693 |
575 // Method: Arity 4 -> 4. | 694 // Method: Arity 4 -> 4. |
576 template <typename StorageType, typename R, typename T, typename X1, | 695 template <typename StorageType, typename R, typename T, typename X1, |
577 typename X2, typename X3, typename X4> | 696 typename X2, typename X3, typename X4> |
578 struct Invoker1<StorageType, R(T::*)(X1, X2, X3, X4)> { | 697 struct Invoker1<false, StorageType, R(T::*)(X1, X2, X3, X4)> { |
579 static R DoInvoke(InvokerStorageBase* base, | 698 static R DoInvoke(InvokerStorageBase* base, |
580 typename internal::ParamTraits<X1>::ForwardType x1, | 699 typename internal::ParamTraits<X1>::ForwardType x1, |
581 typename internal::ParamTraits<X2>::ForwardType x2, | 700 typename internal::ParamTraits<X2>::ForwardType x2, |
582 typename internal::ParamTraits<X3>::ForwardType x3, | 701 typename internal::ParamTraits<X3>::ForwardType x3, |
583 typename internal::ParamTraits<X4>::ForwardType x4) { | 702 typename internal::ParamTraits<X4>::ForwardType x4) { |
584 StorageType* invoker = static_cast<StorageType*>(base); | 703 StorageType* invoker = static_cast<StorageType*>(base); |
585 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4); | 704 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4); |
586 } | 705 } |
587 }; | 706 }; |
588 | 707 |
| 708 // WeakPtr Method: Arity 4 -> 4. |
| 709 template <typename StorageType, typename T, typename X1, typename X2, |
| 710 typename X3, typename X4> |
| 711 struct Invoker1<true, StorageType, void(T::*)(X1, X2, X3, X4)> { |
| 712 static void DoInvoke(InvokerStorageBase* base, |
| 713 typename internal::ParamTraits<X1>::ForwardType x1, |
| 714 typename internal::ParamTraits<X2>::ForwardType x2, |
| 715 typename internal::ParamTraits<X3>::ForwardType x3, |
| 716 typename internal::ParamTraits<X4>::ForwardType x4) { |
| 717 StorageType* invoker = static_cast<StorageType*>(base); |
| 718 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 719 if (!weak_ptr.get()) { |
| 720 return; |
| 721 } |
| 722 (weak_ptr->*invoker->f_)(x1, x2, x3, x4); |
| 723 } |
| 724 }; |
| 725 |
589 // Function: Arity 6 -> 5. | 726 // Function: Arity 6 -> 5. |
590 template <typename StorageType, typename R,typename X1, typename X2, | 727 template <typename StorageType, typename R,typename X1, typename X2, |
591 typename X3, typename X4, typename X5, typename X6> | 728 typename X3, typename X4, typename X5, typename X6> |
592 struct Invoker1<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { | 729 struct Invoker1<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { |
593 static R DoInvoke(InvokerStorageBase* base, | 730 static R DoInvoke(InvokerStorageBase* base, |
594 typename internal::ParamTraits<X2>::ForwardType x2, | 731 typename internal::ParamTraits<X2>::ForwardType x2, |
595 typename internal::ParamTraits<X3>::ForwardType x3, | 732 typename internal::ParamTraits<X3>::ForwardType x3, |
596 typename internal::ParamTraits<X4>::ForwardType x4, | 733 typename internal::ParamTraits<X4>::ForwardType x4, |
597 typename internal::ParamTraits<X5>::ForwardType x5, | 734 typename internal::ParamTraits<X5>::ForwardType x5, |
598 typename internal::ParamTraits<X6>::ForwardType x6) { | 735 typename internal::ParamTraits<X6>::ForwardType x6) { |
599 StorageType* invoker = static_cast<StorageType*>(base); | 736 StorageType* invoker = static_cast<StorageType*>(base); |
600 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5, x6); | 737 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5, x6); |
601 } | 738 } |
602 }; | 739 }; |
603 | 740 |
604 // Method: Arity 5 -> 5. | 741 // Method: Arity 5 -> 5. |
605 template <typename StorageType, typename R, typename T, typename X1, | 742 template <typename StorageType, typename R, typename T, typename X1, |
606 typename X2, typename X3, typename X4, typename X5> | 743 typename X2, typename X3, typename X4, typename X5> |
607 struct Invoker1<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { | 744 struct Invoker1<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> { |
608 static R DoInvoke(InvokerStorageBase* base, | 745 static R DoInvoke(InvokerStorageBase* base, |
609 typename internal::ParamTraits<X1>::ForwardType x1, | 746 typename internal::ParamTraits<X1>::ForwardType x1, |
610 typename internal::ParamTraits<X2>::ForwardType x2, | 747 typename internal::ParamTraits<X2>::ForwardType x2, |
611 typename internal::ParamTraits<X3>::ForwardType x3, | 748 typename internal::ParamTraits<X3>::ForwardType x3, |
612 typename internal::ParamTraits<X4>::ForwardType x4, | 749 typename internal::ParamTraits<X4>::ForwardType x4, |
613 typename internal::ParamTraits<X5>::ForwardType x5) { | 750 typename internal::ParamTraits<X5>::ForwardType x5) { |
614 StorageType* invoker = static_cast<StorageType*>(base); | 751 StorageType* invoker = static_cast<StorageType*>(base); |
615 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4, x5); | 752 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4, x5); |
616 } | 753 } |
617 }; | 754 }; |
618 | 755 |
619 template <typename StorageType, typename NormalizedSig> | 756 // WeakPtr Method: Arity 5 -> 5. |
| 757 template <typename StorageType, typename T, typename X1, typename X2, |
| 758 typename X3, typename X4, typename X5> |
| 759 struct Invoker1<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> { |
| 760 static void DoInvoke(InvokerStorageBase* base, |
| 761 typename internal::ParamTraits<X1>::ForwardType x1, |
| 762 typename internal::ParamTraits<X2>::ForwardType x2, |
| 763 typename internal::ParamTraits<X3>::ForwardType x3, |
| 764 typename internal::ParamTraits<X4>::ForwardType x4, |
| 765 typename internal::ParamTraits<X5>::ForwardType x5) { |
| 766 StorageType* invoker = static_cast<StorageType*>(base); |
| 767 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 768 if (!weak_ptr.get()) { |
| 769 return; |
| 770 } |
| 771 (weak_ptr->*invoker->f_)(x1, x2, x3, x4, x5); |
| 772 } |
| 773 }; |
| 774 |
| 775 template <bool IsWeak, typename StorageType, typename NormalizedSig> |
620 struct Invoker2; | 776 struct Invoker2; |
621 | 777 |
622 // Function: Arity 2 -> 0. | 778 // Function: Arity 2 -> 0. |
623 template <typename StorageType, typename R,typename X1, typename X2> | 779 template <typename StorageType, typename R,typename X1, typename X2> |
624 struct Invoker2<StorageType, R(*)(X1, X2)> { | 780 struct Invoker2<false, StorageType, R(*)(X1, X2)> { |
625 static R DoInvoke(InvokerStorageBase* base) { | 781 static R DoInvoke(InvokerStorageBase* base) { |
626 StorageType* invoker = static_cast<StorageType*>(base); | 782 StorageType* invoker = static_cast<StorageType*>(base); |
627 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_)); | 783 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_)); |
628 } | 784 } |
629 }; | 785 }; |
630 | 786 |
631 // Method: Arity 1 -> 0. | 787 // Method: Arity 1 -> 0. |
632 template <typename StorageType, typename R, typename T, typename X1> | 788 template <typename StorageType, typename R, typename T, typename X1> |
633 struct Invoker2<StorageType, R(T::*)(X1)> { | 789 struct Invoker2<false, StorageType, R(T::*)(X1)> { |
634 static R DoInvoke(InvokerStorageBase* base) { | 790 static R DoInvoke(InvokerStorageBase* base) { |
635 StorageType* invoker = static_cast<StorageType*>(base); | 791 StorageType* invoker = static_cast<StorageType*>(base); |
636 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_)); | 792 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_)); |
637 } | 793 } |
638 }; | 794 }; |
639 | 795 |
| 796 // WeakPtr Method: Arity 1 -> 0. |
| 797 template <typename StorageType, typename T, typename X1> |
| 798 struct Invoker2<true, StorageType, void(T::*)(X1)> { |
| 799 static void DoInvoke(InvokerStorageBase* base) { |
| 800 StorageType* invoker = static_cast<StorageType*>(base); |
| 801 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 802 if (!weak_ptr.get()) { |
| 803 return; |
| 804 } |
| 805 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_)); |
| 806 } |
| 807 }; |
| 808 |
640 // Function: Arity 3 -> 1. | 809 // Function: Arity 3 -> 1. |
641 template <typename StorageType, typename R,typename X1, typename X2, | 810 template <typename StorageType, typename R,typename X1, typename X2, |
642 typename X3> | 811 typename X3> |
643 struct Invoker2<StorageType, R(*)(X1, X2, X3)> { | 812 struct Invoker2<false, StorageType, R(*)(X1, X2, X3)> { |
644 static R DoInvoke(InvokerStorageBase* base, | 813 static R DoInvoke(InvokerStorageBase* base, |
645 typename internal::ParamTraits<X3>::ForwardType x3) { | 814 typename internal::ParamTraits<X3>::ForwardType x3) { |
646 StorageType* invoker = static_cast<StorageType*>(base); | 815 StorageType* invoker = static_cast<StorageType*>(base); |
647 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3); | 816 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3); |
648 } | 817 } |
649 }; | 818 }; |
650 | 819 |
651 // Method: Arity 2 -> 1. | 820 // Method: Arity 2 -> 1. |
652 template <typename StorageType, typename R, typename T, typename X1, | 821 template <typename StorageType, typename R, typename T, typename X1, |
653 typename X2> | 822 typename X2> |
654 struct Invoker2<StorageType, R(T::*)(X1, X2)> { | 823 struct Invoker2<false, StorageType, R(T::*)(X1, X2)> { |
655 static R DoInvoke(InvokerStorageBase* base, | 824 static R DoInvoke(InvokerStorageBase* base, |
656 typename internal::ParamTraits<X2>::ForwardType x2) { | 825 typename internal::ParamTraits<X2>::ForwardType x2) { |
657 StorageType* invoker = static_cast<StorageType*>(base); | 826 StorageType* invoker = static_cast<StorageType*>(base); |
658 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2); | 827 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2); |
659 } | 828 } |
660 }; | 829 }; |
661 | 830 |
| 831 // WeakPtr Method: Arity 2 -> 1. |
| 832 template <typename StorageType, typename T, typename X1, typename X2> |
| 833 struct Invoker2<true, StorageType, void(T::*)(X1, X2)> { |
| 834 static void DoInvoke(InvokerStorageBase* base, |
| 835 typename internal::ParamTraits<X2>::ForwardType x2) { |
| 836 StorageType* invoker = static_cast<StorageType*>(base); |
| 837 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 838 if (!weak_ptr.get()) { |
| 839 return; |
| 840 } |
| 841 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), x2); |
| 842 } |
| 843 }; |
| 844 |
662 // Function: Arity 4 -> 2. | 845 // Function: Arity 4 -> 2. |
663 template <typename StorageType, typename R,typename X1, typename X2, | 846 template <typename StorageType, typename R,typename X1, typename X2, |
664 typename X3, typename X4> | 847 typename X3, typename X4> |
665 struct Invoker2<StorageType, R(*)(X1, X2, X3, X4)> { | 848 struct Invoker2<false, StorageType, R(*)(X1, X2, X3, X4)> { |
666 static R DoInvoke(InvokerStorageBase* base, | 849 static R DoInvoke(InvokerStorageBase* base, |
667 typename internal::ParamTraits<X3>::ForwardType x3, | 850 typename internal::ParamTraits<X3>::ForwardType x3, |
668 typename internal::ParamTraits<X4>::ForwardType x4) { | 851 typename internal::ParamTraits<X4>::ForwardType x4) { |
669 StorageType* invoker = static_cast<StorageType*>(base); | 852 StorageType* invoker = static_cast<StorageType*>(base); |
670 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4); | 853 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4); |
671 } | 854 } |
672 }; | 855 }; |
673 | 856 |
674 // Method: Arity 3 -> 2. | 857 // Method: Arity 3 -> 2. |
675 template <typename StorageType, typename R, typename T, typename X1, | 858 template <typename StorageType, typename R, typename T, typename X1, |
676 typename X2, typename X3> | 859 typename X2, typename X3> |
677 struct Invoker2<StorageType, R(T::*)(X1, X2, X3)> { | 860 struct Invoker2<false, StorageType, R(T::*)(X1, X2, X3)> { |
678 static R DoInvoke(InvokerStorageBase* base, | 861 static R DoInvoke(InvokerStorageBase* base, |
679 typename internal::ParamTraits<X2>::ForwardType x2, | 862 typename internal::ParamTraits<X2>::ForwardType x2, |
680 typename internal::ParamTraits<X3>::ForwardType x3) { | 863 typename internal::ParamTraits<X3>::ForwardType x3) { |
681 StorageType* invoker = static_cast<StorageType*>(base); | 864 StorageType* invoker = static_cast<StorageType*>(base); |
682 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3); | 865 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3); |
683 } | 866 } |
684 }; | 867 }; |
685 | 868 |
| 869 // WeakPtr Method: Arity 3 -> 2. |
| 870 template <typename StorageType, typename T, typename X1, typename X2, |
| 871 typename X3> |
| 872 struct Invoker2<true, StorageType, void(T::*)(X1, X2, X3)> { |
| 873 static void DoInvoke(InvokerStorageBase* base, |
| 874 typename internal::ParamTraits<X2>::ForwardType x2, |
| 875 typename internal::ParamTraits<X3>::ForwardType x3) { |
| 876 StorageType* invoker = static_cast<StorageType*>(base); |
| 877 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 878 if (!weak_ptr.get()) { |
| 879 return; |
| 880 } |
| 881 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), x2, x3); |
| 882 } |
| 883 }; |
| 884 |
686 // Function: Arity 5 -> 3. | 885 // Function: Arity 5 -> 3. |
687 template <typename StorageType, typename R,typename X1, typename X2, | 886 template <typename StorageType, typename R,typename X1, typename X2, |
688 typename X3, typename X4, typename X5> | 887 typename X3, typename X4, typename X5> |
689 struct Invoker2<StorageType, R(*)(X1, X2, X3, X4, X5)> { | 888 struct Invoker2<false, StorageType, R(*)(X1, X2, X3, X4, X5)> { |
690 static R DoInvoke(InvokerStorageBase* base, | 889 static R DoInvoke(InvokerStorageBase* base, |
691 typename internal::ParamTraits<X3>::ForwardType x3, | 890 typename internal::ParamTraits<X3>::ForwardType x3, |
692 typename internal::ParamTraits<X4>::ForwardType x4, | 891 typename internal::ParamTraits<X4>::ForwardType x4, |
693 typename internal::ParamTraits<X5>::ForwardType x5) { | 892 typename internal::ParamTraits<X5>::ForwardType x5) { |
694 StorageType* invoker = static_cast<StorageType*>(base); | 893 StorageType* invoker = static_cast<StorageType*>(base); |
695 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5); | 894 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5); |
696 } | 895 } |
697 }; | 896 }; |
698 | 897 |
699 // Method: Arity 4 -> 3. | 898 // Method: Arity 4 -> 3. |
700 template <typename StorageType, typename R, typename T, typename X1, | 899 template <typename StorageType, typename R, typename T, typename X1, |
701 typename X2, typename X3, typename X4> | 900 typename X2, typename X3, typename X4> |
702 struct Invoker2<StorageType, R(T::*)(X1, X2, X3, X4)> { | 901 struct Invoker2<false, StorageType, R(T::*)(X1, X2, X3, X4)> { |
703 static R DoInvoke(InvokerStorageBase* base, | 902 static R DoInvoke(InvokerStorageBase* base, |
704 typename internal::ParamTraits<X2>::ForwardType x2, | 903 typename internal::ParamTraits<X2>::ForwardType x2, |
705 typename internal::ParamTraits<X3>::ForwardType x3, | 904 typename internal::ParamTraits<X3>::ForwardType x3, |
706 typename internal::ParamTraits<X4>::ForwardType x4) { | 905 typename internal::ParamTraits<X4>::ForwardType x4) { |
707 StorageType* invoker = static_cast<StorageType*>(base); | 906 StorageType* invoker = static_cast<StorageType*>(base); |
708 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, | 907 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, |
709 x4); | 908 x4); |
710 } | 909 } |
711 }; | 910 }; |
712 | 911 |
| 912 // WeakPtr Method: Arity 4 -> 3. |
| 913 template <typename StorageType, typename T, typename X1, typename X2, |
| 914 typename X3, typename X4> |
| 915 struct Invoker2<true, StorageType, void(T::*)(X1, X2, X3, X4)> { |
| 916 static void DoInvoke(InvokerStorageBase* base, |
| 917 typename internal::ParamTraits<X2>::ForwardType x2, |
| 918 typename internal::ParamTraits<X3>::ForwardType x3, |
| 919 typename internal::ParamTraits<X4>::ForwardType x4) { |
| 920 StorageType* invoker = static_cast<StorageType*>(base); |
| 921 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 922 if (!weak_ptr.get()) { |
| 923 return; |
| 924 } |
| 925 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, x4); |
| 926 } |
| 927 }; |
| 928 |
713 // Function: Arity 6 -> 4. | 929 // Function: Arity 6 -> 4. |
714 template <typename StorageType, typename R,typename X1, typename X2, | 930 template <typename StorageType, typename R,typename X1, typename X2, |
715 typename X3, typename X4, typename X5, typename X6> | 931 typename X3, typename X4, typename X5, typename X6> |
716 struct Invoker2<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { | 932 struct Invoker2<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { |
717 static R DoInvoke(InvokerStorageBase* base, | 933 static R DoInvoke(InvokerStorageBase* base, |
718 typename internal::ParamTraits<X3>::ForwardType x3, | 934 typename internal::ParamTraits<X3>::ForwardType x3, |
719 typename internal::ParamTraits<X4>::ForwardType x4, | 935 typename internal::ParamTraits<X4>::ForwardType x4, |
720 typename internal::ParamTraits<X5>::ForwardType x5, | 936 typename internal::ParamTraits<X5>::ForwardType x5, |
721 typename internal::ParamTraits<X6>::ForwardType x6) { | 937 typename internal::ParamTraits<X6>::ForwardType x6) { |
722 StorageType* invoker = static_cast<StorageType*>(base); | 938 StorageType* invoker = static_cast<StorageType*>(base); |
723 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5, | 939 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5, |
724 x6); | 940 x6); |
725 } | 941 } |
726 }; | 942 }; |
727 | 943 |
728 // Method: Arity 5 -> 4. | 944 // Method: Arity 5 -> 4. |
729 template <typename StorageType, typename R, typename T, typename X1, | 945 template <typename StorageType, typename R, typename T, typename X1, |
730 typename X2, typename X3, typename X4, typename X5> | 946 typename X2, typename X3, typename X4, typename X5> |
731 struct Invoker2<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { | 947 struct Invoker2<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> { |
732 static R DoInvoke(InvokerStorageBase* base, | 948 static R DoInvoke(InvokerStorageBase* base, |
733 typename internal::ParamTraits<X2>::ForwardType x2, | 949 typename internal::ParamTraits<X2>::ForwardType x2, |
734 typename internal::ParamTraits<X3>::ForwardType x3, | 950 typename internal::ParamTraits<X3>::ForwardType x3, |
735 typename internal::ParamTraits<X4>::ForwardType x4, | 951 typename internal::ParamTraits<X4>::ForwardType x4, |
736 typename internal::ParamTraits<X5>::ForwardType x5) { | 952 typename internal::ParamTraits<X5>::ForwardType x5) { |
737 StorageType* invoker = static_cast<StorageType*>(base); | 953 StorageType* invoker = static_cast<StorageType*>(base); |
738 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, | 954 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, |
739 x4, x5); | 955 x4, x5); |
740 } | 956 } |
741 }; | 957 }; |
742 | 958 |
743 template <typename StorageType, typename NormalizedSig> | 959 // WeakPtr Method: Arity 5 -> 4. |
| 960 template <typename StorageType, typename T, typename X1, typename X2, |
| 961 typename X3, typename X4, typename X5> |
| 962 struct Invoker2<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> { |
| 963 static void DoInvoke(InvokerStorageBase* base, |
| 964 typename internal::ParamTraits<X2>::ForwardType x2, |
| 965 typename internal::ParamTraits<X3>::ForwardType x3, |
| 966 typename internal::ParamTraits<X4>::ForwardType x4, |
| 967 typename internal::ParamTraits<X5>::ForwardType x5) { |
| 968 StorageType* invoker = static_cast<StorageType*>(base); |
| 969 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 970 if (!weak_ptr.get()) { |
| 971 return; |
| 972 } |
| 973 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, x4, x5); |
| 974 } |
| 975 }; |
| 976 |
| 977 template <bool IsWeak, typename StorageType, typename NormalizedSig> |
744 struct Invoker3; | 978 struct Invoker3; |
745 | 979 |
746 // Function: Arity 3 -> 0. | 980 // Function: Arity 3 -> 0. |
747 template <typename StorageType, typename R,typename X1, typename X2, | 981 template <typename StorageType, typename R,typename X1, typename X2, |
748 typename X3> | 982 typename X3> |
749 struct Invoker3<StorageType, R(*)(X1, X2, X3)> { | 983 struct Invoker3<false, StorageType, R(*)(X1, X2, X3)> { |
750 static R DoInvoke(InvokerStorageBase* base) { | 984 static R DoInvoke(InvokerStorageBase* base) { |
751 StorageType* invoker = static_cast<StorageType*>(base); | 985 StorageType* invoker = static_cast<StorageType*>(base); |
752 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), | 986 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
753 Unwrap(invoker->p3_)); | 987 Unwrap(invoker->p3_)); |
754 } | 988 } |
755 }; | 989 }; |
756 | 990 |
757 // Method: Arity 2 -> 0. | 991 // Method: Arity 2 -> 0. |
758 template <typename StorageType, typename R, typename T, typename X1, | 992 template <typename StorageType, typename R, typename T, typename X1, |
759 typename X2> | 993 typename X2> |
760 struct Invoker3<StorageType, R(T::*)(X1, X2)> { | 994 struct Invoker3<false, StorageType, R(T::*)(X1, X2)> { |
761 static R DoInvoke(InvokerStorageBase* base) { | 995 static R DoInvoke(InvokerStorageBase* base) { |
762 StorageType* invoker = static_cast<StorageType*>(base); | 996 StorageType* invoker = static_cast<StorageType*>(base); |
763 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), | 997 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
764 Unwrap(invoker->p3_)); | 998 Unwrap(invoker->p3_)); |
765 } | 999 } |
766 }; | 1000 }; |
767 | 1001 |
| 1002 // WeakPtr Method: Arity 2 -> 0. |
| 1003 template <typename StorageType, typename T, typename X1, typename X2> |
| 1004 struct Invoker3<true, StorageType, void(T::*)(X1, X2)> { |
| 1005 static void DoInvoke(InvokerStorageBase* base) { |
| 1006 StorageType* invoker = static_cast<StorageType*>(base); |
| 1007 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 1008 if (!weak_ptr.get()) { |
| 1009 return; |
| 1010 } |
| 1011 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_)); |
| 1012 } |
| 1013 }; |
| 1014 |
768 // Function: Arity 4 -> 1. | 1015 // Function: Arity 4 -> 1. |
769 template <typename StorageType, typename R,typename X1, typename X2, | 1016 template <typename StorageType, typename R,typename X1, typename X2, |
770 typename X3, typename X4> | 1017 typename X3, typename X4> |
771 struct Invoker3<StorageType, R(*)(X1, X2, X3, X4)> { | 1018 struct Invoker3<false, StorageType, R(*)(X1, X2, X3, X4)> { |
772 static R DoInvoke(InvokerStorageBase* base, | 1019 static R DoInvoke(InvokerStorageBase* base, |
773 typename internal::ParamTraits<X4>::ForwardType x4) { | 1020 typename internal::ParamTraits<X4>::ForwardType x4) { |
774 StorageType* invoker = static_cast<StorageType*>(base); | 1021 StorageType* invoker = static_cast<StorageType*>(base); |
775 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), | 1022 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
776 Unwrap(invoker->p3_), x4); | 1023 Unwrap(invoker->p3_), x4); |
777 } | 1024 } |
778 }; | 1025 }; |
779 | 1026 |
780 // Method: Arity 3 -> 1. | 1027 // Method: Arity 3 -> 1. |
781 template <typename StorageType, typename R, typename T, typename X1, | 1028 template <typename StorageType, typename R, typename T, typename X1, |
782 typename X2, typename X3> | 1029 typename X2, typename X3> |
783 struct Invoker3<StorageType, R(T::*)(X1, X2, X3)> { | 1030 struct Invoker3<false, StorageType, R(T::*)(X1, X2, X3)> { |
784 static R DoInvoke(InvokerStorageBase* base, | 1031 static R DoInvoke(InvokerStorageBase* base, |
785 typename internal::ParamTraits<X3>::ForwardType x3) { | 1032 typename internal::ParamTraits<X3>::ForwardType x3) { |
786 StorageType* invoker = static_cast<StorageType*>(base); | 1033 StorageType* invoker = static_cast<StorageType*>(base); |
787 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), | 1034 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
788 Unwrap(invoker->p3_), x3); | 1035 Unwrap(invoker->p3_), x3); |
789 } | 1036 } |
790 }; | 1037 }; |
791 | 1038 |
| 1039 // WeakPtr Method: Arity 3 -> 1. |
| 1040 template <typename StorageType, typename T, typename X1, typename X2, |
| 1041 typename X3> |
| 1042 struct Invoker3<true, StorageType, void(T::*)(X1, X2, X3)> { |
| 1043 static void DoInvoke(InvokerStorageBase* base, |
| 1044 typename internal::ParamTraits<X3>::ForwardType x3) { |
| 1045 StorageType* invoker = static_cast<StorageType*>(base); |
| 1046 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 1047 if (!weak_ptr.get()) { |
| 1048 return; |
| 1049 } |
| 1050 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), x3); |
| 1051 } |
| 1052 }; |
| 1053 |
792 // Function: Arity 5 -> 2. | 1054 // Function: Arity 5 -> 2. |
793 template <typename StorageType, typename R,typename X1, typename X2, | 1055 template <typename StorageType, typename R,typename X1, typename X2, |
794 typename X3, typename X4, typename X5> | 1056 typename X3, typename X4, typename X5> |
795 struct Invoker3<StorageType, R(*)(X1, X2, X3, X4, X5)> { | 1057 struct Invoker3<false, StorageType, R(*)(X1, X2, X3, X4, X5)> { |
796 static R DoInvoke(InvokerStorageBase* base, | 1058 static R DoInvoke(InvokerStorageBase* base, |
797 typename internal::ParamTraits<X4>::ForwardType x4, | 1059 typename internal::ParamTraits<X4>::ForwardType x4, |
798 typename internal::ParamTraits<X5>::ForwardType x5) { | 1060 typename internal::ParamTraits<X5>::ForwardType x5) { |
799 StorageType* invoker = static_cast<StorageType*>(base); | 1061 StorageType* invoker = static_cast<StorageType*>(base); |
800 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), | 1062 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
801 Unwrap(invoker->p3_), x4, x5); | 1063 Unwrap(invoker->p3_), x4, x5); |
802 } | 1064 } |
803 }; | 1065 }; |
804 | 1066 |
805 // Method: Arity 4 -> 2. | 1067 // Method: Arity 4 -> 2. |
806 template <typename StorageType, typename R, typename T, typename X1, | 1068 template <typename StorageType, typename R, typename T, typename X1, |
807 typename X2, typename X3, typename X4> | 1069 typename X2, typename X3, typename X4> |
808 struct Invoker3<StorageType, R(T::*)(X1, X2, X3, X4)> { | 1070 struct Invoker3<false, StorageType, R(T::*)(X1, X2, X3, X4)> { |
809 static R DoInvoke(InvokerStorageBase* base, | 1071 static R DoInvoke(InvokerStorageBase* base, |
810 typename internal::ParamTraits<X3>::ForwardType x3, | 1072 typename internal::ParamTraits<X3>::ForwardType x3, |
811 typename internal::ParamTraits<X4>::ForwardType x4) { | 1073 typename internal::ParamTraits<X4>::ForwardType x4) { |
812 StorageType* invoker = static_cast<StorageType*>(base); | 1074 StorageType* invoker = static_cast<StorageType*>(base); |
813 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), | 1075 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
814 Unwrap(invoker->p3_), x3, x4); | 1076 Unwrap(invoker->p3_), x3, x4); |
815 } | 1077 } |
816 }; | 1078 }; |
817 | 1079 |
| 1080 // WeakPtr Method: Arity 4 -> 2. |
| 1081 template <typename StorageType, typename T, typename X1, typename X2, |
| 1082 typename X3, typename X4> |
| 1083 struct Invoker3<true, StorageType, void(T::*)(X1, X2, X3, X4)> { |
| 1084 static void DoInvoke(InvokerStorageBase* base, |
| 1085 typename internal::ParamTraits<X3>::ForwardType x3, |
| 1086 typename internal::ParamTraits<X4>::ForwardType x4) { |
| 1087 StorageType* invoker = static_cast<StorageType*>(base); |
| 1088 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 1089 if (!weak_ptr.get()) { |
| 1090 return; |
| 1091 } |
| 1092 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), x3, |
| 1093 x4); |
| 1094 } |
| 1095 }; |
| 1096 |
818 // Function: Arity 6 -> 3. | 1097 // Function: Arity 6 -> 3. |
819 template <typename StorageType, typename R,typename X1, typename X2, | 1098 template <typename StorageType, typename R,typename X1, typename X2, |
820 typename X3, typename X4, typename X5, typename X6> | 1099 typename X3, typename X4, typename X5, typename X6> |
821 struct Invoker3<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { | 1100 struct Invoker3<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { |
822 static R DoInvoke(InvokerStorageBase* base, | 1101 static R DoInvoke(InvokerStorageBase* base, |
823 typename internal::ParamTraits<X4>::ForwardType x4, | 1102 typename internal::ParamTraits<X4>::ForwardType x4, |
824 typename internal::ParamTraits<X5>::ForwardType x5, | 1103 typename internal::ParamTraits<X5>::ForwardType x5, |
825 typename internal::ParamTraits<X6>::ForwardType x6) { | 1104 typename internal::ParamTraits<X6>::ForwardType x6) { |
826 StorageType* invoker = static_cast<StorageType*>(base); | 1105 StorageType* invoker = static_cast<StorageType*>(base); |
827 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), | 1106 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
828 Unwrap(invoker->p3_), x4, x5, x6); | 1107 Unwrap(invoker->p3_), x4, x5, x6); |
829 } | 1108 } |
830 }; | 1109 }; |
831 | 1110 |
832 // Method: Arity 5 -> 3. | 1111 // Method: Arity 5 -> 3. |
833 template <typename StorageType, typename R, typename T, typename X1, | 1112 template <typename StorageType, typename R, typename T, typename X1, |
834 typename X2, typename X3, typename X4, typename X5> | 1113 typename X2, typename X3, typename X4, typename X5> |
835 struct Invoker3<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { | 1114 struct Invoker3<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> { |
836 static R DoInvoke(InvokerStorageBase* base, | 1115 static R DoInvoke(InvokerStorageBase* base, |
837 typename internal::ParamTraits<X3>::ForwardType x3, | 1116 typename internal::ParamTraits<X3>::ForwardType x3, |
838 typename internal::ParamTraits<X4>::ForwardType x4, | 1117 typename internal::ParamTraits<X4>::ForwardType x4, |
839 typename internal::ParamTraits<X5>::ForwardType x5) { | 1118 typename internal::ParamTraits<X5>::ForwardType x5) { |
840 StorageType* invoker = static_cast<StorageType*>(base); | 1119 StorageType* invoker = static_cast<StorageType*>(base); |
841 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), | 1120 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
842 Unwrap(invoker->p3_), x3, x4, x5); | 1121 Unwrap(invoker->p3_), x3, x4, x5); |
843 } | 1122 } |
844 }; | 1123 }; |
845 | 1124 |
846 template <typename StorageType, typename NormalizedSig> | 1125 // WeakPtr Method: Arity 5 -> 3. |
| 1126 template <typename StorageType, typename T, typename X1, typename X2, |
| 1127 typename X3, typename X4, typename X5> |
| 1128 struct Invoker3<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> { |
| 1129 static void DoInvoke(InvokerStorageBase* base, |
| 1130 typename internal::ParamTraits<X3>::ForwardType x3, |
| 1131 typename internal::ParamTraits<X4>::ForwardType x4, |
| 1132 typename internal::ParamTraits<X5>::ForwardType x5) { |
| 1133 StorageType* invoker = static_cast<StorageType*>(base); |
| 1134 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 1135 if (!weak_ptr.get()) { |
| 1136 return; |
| 1137 } |
| 1138 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), x3, |
| 1139 x4, x5); |
| 1140 } |
| 1141 }; |
| 1142 |
| 1143 template <bool IsWeak, typename StorageType, typename NormalizedSig> |
847 struct Invoker4; | 1144 struct Invoker4; |
848 | 1145 |
849 // Function: Arity 4 -> 0. | 1146 // Function: Arity 4 -> 0. |
850 template <typename StorageType, typename R,typename X1, typename X2, | 1147 template <typename StorageType, typename R,typename X1, typename X2, |
851 typename X3, typename X4> | 1148 typename X3, typename X4> |
852 struct Invoker4<StorageType, R(*)(X1, X2, X3, X4)> { | 1149 struct Invoker4<false, StorageType, R(*)(X1, X2, X3, X4)> { |
853 static R DoInvoke(InvokerStorageBase* base) { | 1150 static R DoInvoke(InvokerStorageBase* base) { |
854 StorageType* invoker = static_cast<StorageType*>(base); | 1151 StorageType* invoker = static_cast<StorageType*>(base); |
855 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), | 1152 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
856 Unwrap(invoker->p3_), Unwrap(invoker->p4_)); | 1153 Unwrap(invoker->p3_), Unwrap(invoker->p4_)); |
857 } | 1154 } |
858 }; | 1155 }; |
859 | 1156 |
860 // Method: Arity 3 -> 0. | 1157 // Method: Arity 3 -> 0. |
861 template <typename StorageType, typename R, typename T, typename X1, | 1158 template <typename StorageType, typename R, typename T, typename X1, |
862 typename X2, typename X3> | 1159 typename X2, typename X3> |
863 struct Invoker4<StorageType, R(T::*)(X1, X2, X3)> { | 1160 struct Invoker4<false, StorageType, R(T::*)(X1, X2, X3)> { |
864 static R DoInvoke(InvokerStorageBase* base) { | 1161 static R DoInvoke(InvokerStorageBase* base) { |
865 StorageType* invoker = static_cast<StorageType*>(base); | 1162 StorageType* invoker = static_cast<StorageType*>(base); |
866 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), | 1163 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
867 Unwrap(invoker->p3_), Unwrap(invoker->p4_)); | 1164 Unwrap(invoker->p3_), Unwrap(invoker->p4_)); |
868 } | 1165 } |
869 }; | 1166 }; |
870 | 1167 |
| 1168 // WeakPtr Method: Arity 3 -> 0. |
| 1169 template <typename StorageType, typename T, typename X1, typename X2, |
| 1170 typename X3> |
| 1171 struct Invoker4<true, StorageType, void(T::*)(X1, X2, X3)> { |
| 1172 static void DoInvoke(InvokerStorageBase* base) { |
| 1173 StorageType* invoker = static_cast<StorageType*>(base); |
| 1174 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 1175 if (!weak_ptr.get()) { |
| 1176 return; |
| 1177 } |
| 1178 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), |
| 1179 Unwrap(invoker->p4_)); |
| 1180 } |
| 1181 }; |
| 1182 |
871 // Function: Arity 5 -> 1. | 1183 // Function: Arity 5 -> 1. |
872 template <typename StorageType, typename R,typename X1, typename X2, | 1184 template <typename StorageType, typename R,typename X1, typename X2, |
873 typename X3, typename X4, typename X5> | 1185 typename X3, typename X4, typename X5> |
874 struct Invoker4<StorageType, R(*)(X1, X2, X3, X4, X5)> { | 1186 struct Invoker4<false, StorageType, R(*)(X1, X2, X3, X4, X5)> { |
875 static R DoInvoke(InvokerStorageBase* base, | 1187 static R DoInvoke(InvokerStorageBase* base, |
876 typename internal::ParamTraits<X5>::ForwardType x5) { | 1188 typename internal::ParamTraits<X5>::ForwardType x5) { |
877 StorageType* invoker = static_cast<StorageType*>(base); | 1189 StorageType* invoker = static_cast<StorageType*>(base); |
878 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), | 1190 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
879 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5); | 1191 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5); |
880 } | 1192 } |
881 }; | 1193 }; |
882 | 1194 |
883 // Method: Arity 4 -> 1. | 1195 // Method: Arity 4 -> 1. |
884 template <typename StorageType, typename R, typename T, typename X1, | 1196 template <typename StorageType, typename R, typename T, typename X1, |
885 typename X2, typename X3, typename X4> | 1197 typename X2, typename X3, typename X4> |
886 struct Invoker4<StorageType, R(T::*)(X1, X2, X3, X4)> { | 1198 struct Invoker4<false, StorageType, R(T::*)(X1, X2, X3, X4)> { |
887 static R DoInvoke(InvokerStorageBase* base, | 1199 static R DoInvoke(InvokerStorageBase* base, |
888 typename internal::ParamTraits<X4>::ForwardType x4) { | 1200 typename internal::ParamTraits<X4>::ForwardType x4) { |
889 StorageType* invoker = static_cast<StorageType*>(base); | 1201 StorageType* invoker = static_cast<StorageType*>(base); |
890 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), | 1202 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
891 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4); | 1203 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4); |
892 } | 1204 } |
893 }; | 1205 }; |
894 | 1206 |
| 1207 // WeakPtr Method: Arity 4 -> 1. |
| 1208 template <typename StorageType, typename T, typename X1, typename X2, |
| 1209 typename X3, typename X4> |
| 1210 struct Invoker4<true, StorageType, void(T::*)(X1, X2, X3, X4)> { |
| 1211 static void DoInvoke(InvokerStorageBase* base, |
| 1212 typename internal::ParamTraits<X4>::ForwardType x4) { |
| 1213 StorageType* invoker = static_cast<StorageType*>(base); |
| 1214 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 1215 if (!weak_ptr.get()) { |
| 1216 return; |
| 1217 } |
| 1218 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), |
| 1219 Unwrap(invoker->p4_), x4); |
| 1220 } |
| 1221 }; |
| 1222 |
895 // Function: Arity 6 -> 2. | 1223 // Function: Arity 6 -> 2. |
896 template <typename StorageType, typename R,typename X1, typename X2, | 1224 template <typename StorageType, typename R,typename X1, typename X2, |
897 typename X3, typename X4, typename X5, typename X6> | 1225 typename X3, typename X4, typename X5, typename X6> |
898 struct Invoker4<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { | 1226 struct Invoker4<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { |
899 static R DoInvoke(InvokerStorageBase* base, | 1227 static R DoInvoke(InvokerStorageBase* base, |
900 typename internal::ParamTraits<X5>::ForwardType x5, | 1228 typename internal::ParamTraits<X5>::ForwardType x5, |
901 typename internal::ParamTraits<X6>::ForwardType x6) { | 1229 typename internal::ParamTraits<X6>::ForwardType x6) { |
902 StorageType* invoker = static_cast<StorageType*>(base); | 1230 StorageType* invoker = static_cast<StorageType*>(base); |
903 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), | 1231 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
904 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5, x6); | 1232 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5, x6); |
905 } | 1233 } |
906 }; | 1234 }; |
907 | 1235 |
908 // Method: Arity 5 -> 2. | 1236 // Method: Arity 5 -> 2. |
909 template <typename StorageType, typename R, typename T, typename X1, | 1237 template <typename StorageType, typename R, typename T, typename X1, |
910 typename X2, typename X3, typename X4, typename X5> | 1238 typename X2, typename X3, typename X4, typename X5> |
911 struct Invoker4<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { | 1239 struct Invoker4<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> { |
912 static R DoInvoke(InvokerStorageBase* base, | 1240 static R DoInvoke(InvokerStorageBase* base, |
913 typename internal::ParamTraits<X4>::ForwardType x4, | 1241 typename internal::ParamTraits<X4>::ForwardType x4, |
914 typename internal::ParamTraits<X5>::ForwardType x5) { | 1242 typename internal::ParamTraits<X5>::ForwardType x5) { |
915 StorageType* invoker = static_cast<StorageType*>(base); | 1243 StorageType* invoker = static_cast<StorageType*>(base); |
916 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), | 1244 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
917 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4, x5); | 1245 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4, x5); |
918 } | 1246 } |
919 }; | 1247 }; |
920 | 1248 |
921 template <typename StorageType, typename NormalizedSig> | 1249 // WeakPtr Method: Arity 5 -> 2. |
| 1250 template <typename StorageType, typename T, typename X1, typename X2, |
| 1251 typename X3, typename X4, typename X5> |
| 1252 struct Invoker4<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> { |
| 1253 static void DoInvoke(InvokerStorageBase* base, |
| 1254 typename internal::ParamTraits<X4>::ForwardType x4, |
| 1255 typename internal::ParamTraits<X5>::ForwardType x5) { |
| 1256 StorageType* invoker = static_cast<StorageType*>(base); |
| 1257 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 1258 if (!weak_ptr.get()) { |
| 1259 return; |
| 1260 } |
| 1261 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), |
| 1262 Unwrap(invoker->p4_), x4, x5); |
| 1263 } |
| 1264 }; |
| 1265 |
| 1266 template <bool IsWeak, typename StorageType, typename NormalizedSig> |
922 struct Invoker5; | 1267 struct Invoker5; |
923 | 1268 |
924 // Function: Arity 5 -> 0. | 1269 // Function: Arity 5 -> 0. |
925 template <typename StorageType, typename R,typename X1, typename X2, | 1270 template <typename StorageType, typename R,typename X1, typename X2, |
926 typename X3, typename X4, typename X5> | 1271 typename X3, typename X4, typename X5> |
927 struct Invoker5<StorageType, R(*)(X1, X2, X3, X4, X5)> { | 1272 struct Invoker5<false, StorageType, R(*)(X1, X2, X3, X4, X5)> { |
928 static R DoInvoke(InvokerStorageBase* base) { | 1273 static R DoInvoke(InvokerStorageBase* base) { |
929 StorageType* invoker = static_cast<StorageType*>(base); | 1274 StorageType* invoker = static_cast<StorageType*>(base); |
930 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), | 1275 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
931 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_)); | 1276 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_)); |
932 } | 1277 } |
933 }; | 1278 }; |
934 | 1279 |
935 // Method: Arity 4 -> 0. | 1280 // Method: Arity 4 -> 0. |
936 template <typename StorageType, typename R, typename T, typename X1, | 1281 template <typename StorageType, typename R, typename T, typename X1, |
937 typename X2, typename X3, typename X4> | 1282 typename X2, typename X3, typename X4> |
938 struct Invoker5<StorageType, R(T::*)(X1, X2, X3, X4)> { | 1283 struct Invoker5<false, StorageType, R(T::*)(X1, X2, X3, X4)> { |
939 static R DoInvoke(InvokerStorageBase* base) { | 1284 static R DoInvoke(InvokerStorageBase* base) { |
940 StorageType* invoker = static_cast<StorageType*>(base); | 1285 StorageType* invoker = static_cast<StorageType*>(base); |
941 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), | 1286 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
942 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_)); | 1287 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_)); |
943 } | 1288 } |
944 }; | 1289 }; |
945 | 1290 |
| 1291 // WeakPtr Method: Arity 4 -> 0. |
| 1292 template <typename StorageType, typename T, typename X1, typename X2, |
| 1293 typename X3, typename X4> |
| 1294 struct Invoker5<true, StorageType, void(T::*)(X1, X2, X3, X4)> { |
| 1295 static void DoInvoke(InvokerStorageBase* base) { |
| 1296 StorageType* invoker = static_cast<StorageType*>(base); |
| 1297 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 1298 if (!weak_ptr.get()) { |
| 1299 return; |
| 1300 } |
| 1301 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), |
| 1302 Unwrap(invoker->p4_), Unwrap(invoker->p5_)); |
| 1303 } |
| 1304 }; |
| 1305 |
946 // Function: Arity 6 -> 1. | 1306 // Function: Arity 6 -> 1. |
947 template <typename StorageType, typename R,typename X1, typename X2, | 1307 template <typename StorageType, typename R,typename X1, typename X2, |
948 typename X3, typename X4, typename X5, typename X6> | 1308 typename X3, typename X4, typename X5, typename X6> |
949 struct Invoker5<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { | 1309 struct Invoker5<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { |
950 static R DoInvoke(InvokerStorageBase* base, | 1310 static R DoInvoke(InvokerStorageBase* base, |
951 typename internal::ParamTraits<X6>::ForwardType x6) { | 1311 typename internal::ParamTraits<X6>::ForwardType x6) { |
952 StorageType* invoker = static_cast<StorageType*>(base); | 1312 StorageType* invoker = static_cast<StorageType*>(base); |
953 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), | 1313 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
954 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x6); | 1314 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x6); |
955 } | 1315 } |
956 }; | 1316 }; |
957 | 1317 |
958 // Method: Arity 5 -> 1. | 1318 // Method: Arity 5 -> 1. |
959 template <typename StorageType, typename R, typename T, typename X1, | 1319 template <typename StorageType, typename R, typename T, typename X1, |
960 typename X2, typename X3, typename X4, typename X5> | 1320 typename X2, typename X3, typename X4, typename X5> |
961 struct Invoker5<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { | 1321 struct Invoker5<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> { |
962 static R DoInvoke(InvokerStorageBase* base, | 1322 static R DoInvoke(InvokerStorageBase* base, |
963 typename internal::ParamTraits<X5>::ForwardType x5) { | 1323 typename internal::ParamTraits<X5>::ForwardType x5) { |
964 StorageType* invoker = static_cast<StorageType*>(base); | 1324 StorageType* invoker = static_cast<StorageType*>(base); |
965 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), | 1325 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
966 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5); | 1326 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5); |
967 } | 1327 } |
968 }; | 1328 }; |
969 | 1329 |
970 template <typename StorageType, typename NormalizedSig> | 1330 // WeakPtr Method: Arity 5 -> 1. |
| 1331 template <typename StorageType, typename T, typename X1, typename X2, |
| 1332 typename X3, typename X4, typename X5> |
| 1333 struct Invoker5<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> { |
| 1334 static void DoInvoke(InvokerStorageBase* base, |
| 1335 typename internal::ParamTraits<X5>::ForwardType x5) { |
| 1336 StorageType* invoker = static_cast<StorageType*>(base); |
| 1337 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 1338 if (!weak_ptr.get()) { |
| 1339 return; |
| 1340 } |
| 1341 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), |
| 1342 Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5); |
| 1343 } |
| 1344 }; |
| 1345 |
| 1346 template <bool IsWeak, typename StorageType, typename NormalizedSig> |
971 struct Invoker6; | 1347 struct Invoker6; |
972 | 1348 |
973 // Function: Arity 6 -> 0. | 1349 // Function: Arity 6 -> 0. |
974 template <typename StorageType, typename R,typename X1, typename X2, | 1350 template <typename StorageType, typename R,typename X1, typename X2, |
975 typename X3, typename X4, typename X5, typename X6> | 1351 typename X3, typename X4, typename X5, typename X6> |
976 struct Invoker6<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { | 1352 struct Invoker6<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { |
977 static R DoInvoke(InvokerStorageBase* base) { | 1353 static R DoInvoke(InvokerStorageBase* base) { |
978 StorageType* invoker = static_cast<StorageType*>(base); | 1354 StorageType* invoker = static_cast<StorageType*>(base); |
979 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), | 1355 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
980 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), | 1356 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), |
981 Unwrap(invoker->p6_)); | 1357 Unwrap(invoker->p6_)); |
982 } | 1358 } |
983 }; | 1359 }; |
984 | 1360 |
985 // Method: Arity 5 -> 0. | 1361 // Method: Arity 5 -> 0. |
986 template <typename StorageType, typename R, typename T, typename X1, | 1362 template <typename StorageType, typename R, typename T, typename X1, |
987 typename X2, typename X3, typename X4, typename X5> | 1363 typename X2, typename X3, typename X4, typename X5> |
988 struct Invoker6<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { | 1364 struct Invoker6<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> { |
989 static R DoInvoke(InvokerStorageBase* base) { | 1365 static R DoInvoke(InvokerStorageBase* base) { |
990 StorageType* invoker = static_cast<StorageType*>(base); | 1366 StorageType* invoker = static_cast<StorageType*>(base); |
991 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), | 1367 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
992 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), | 1368 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), |
993 Unwrap(invoker->p6_)); | 1369 Unwrap(invoker->p6_)); |
994 } | 1370 } |
995 }; | 1371 }; |
996 | 1372 |
| 1373 // WeakPtr Method: Arity 5 -> 0. |
| 1374 template <typename StorageType, typename T, typename X1, typename X2, |
| 1375 typename X3, typename X4, typename X5> |
| 1376 struct Invoker6<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> { |
| 1377 static void DoInvoke(InvokerStorageBase* base) { |
| 1378 StorageType* invoker = static_cast<StorageType*>(base); |
| 1379 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
| 1380 if (!weak_ptr.get()) { |
| 1381 return; |
| 1382 } |
| 1383 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), |
| 1384 Unwrap(invoker->p4_), Unwrap(invoker->p5_), Unwrap(invoker->p6_)); |
| 1385 } |
| 1386 }; |
997 | 1387 |
998 // InvokerStorageN<> | 1388 // InvokerStorageN<> |
999 // | 1389 // |
1000 // These are the actual storage classes for the Invokers. | 1390 // These are the actual storage classes for the Invokers. |
1001 // | 1391 // |
1002 // Though these types are "classes", they are being used as structs with | 1392 // Though these types are "classes", they are being used as structs with |
1003 // all member variable public. We cannot make it a struct because it inherits | 1393 // all member variable public. We cannot make it a struct because it inherits |
1004 // from a class which causes a compiler warning. We cannot add a "Run()" method | 1394 // from a class which causes a compiler warning. We cannot add a "Run()" method |
1005 // that forwards the unbound arguments because that would require we unwrap the | 1395 // that forwards the unbound arguments because that would require we unwrap the |
1006 // Sig type like in InvokerN above to know the return type, and the arity | 1396 // Sig type like in InvokerN above to know the return type, and the arity |
1007 // of Run(). | 1397 // of Run(). |
1008 // | 1398 // |
1009 // An alternate solution would be to merge InvokerN and InvokerStorageN, | 1399 // An alternate solution would be to merge InvokerN and InvokerStorageN, |
1010 // but the generated code seemed harder to read. | 1400 // but the generated code seemed harder to read. |
1011 | 1401 |
1012 template <typename Sig> | 1402 template <typename Sig> |
1013 class InvokerStorage0 : public InvokerStorageBase { | 1403 class InvokerStorage0 : public InvokerStorageBase { |
1014 public: | 1404 public: |
1015 typedef InvokerStorage0 StorageType; | 1405 typedef InvokerStorage0 StorageType; |
1016 typedef FunctionTraits<Sig> TargetTraits; | 1406 typedef FunctionTraits<Sig> TargetTraits; |
1017 typedef Invoker0<StorageType, typename TargetTraits::NormalizedSig> Invoker; | |
1018 typedef typename TargetTraits::IsMethod IsMethod; | 1407 typedef typename TargetTraits::IsMethod IsMethod; |
| 1408 typedef Sig Signature; |
| 1409 typedef Invoker0<false, StorageType, |
| 1410 typename TargetTraits::NormalizedSig> Invoker; |
1019 | 1411 |
1020 | 1412 |
1021 | 1413 |
1022 InvokerStorage0(Sig f) | 1414 InvokerStorage0(Sig f) |
1023 : f_(f) { | 1415 : f_(f) { |
1024 } | 1416 } |
1025 | 1417 |
1026 virtual ~InvokerStorage0() { } | 1418 virtual ~InvokerStorage0() { } |
1027 | 1419 |
1028 Sig f_; | 1420 Sig f_; |
1029 }; | 1421 }; |
1030 | 1422 |
1031 template <typename Sig, typename P1> | 1423 template <typename Sig, typename P1> |
1032 class InvokerStorage1 : public InvokerStorageBase { | 1424 class InvokerStorage1 : public InvokerStorageBase { |
1033 public: | 1425 public: |
1034 typedef InvokerStorage1 StorageType; | 1426 typedef InvokerStorage1 StorageType; |
1035 typedef FunctionTraits<Sig> TargetTraits; | 1427 typedef FunctionTraits<Sig> TargetTraits; |
1036 typedef Invoker1<StorageType, typename TargetTraits::NormalizedSig> Invoker; | |
1037 typedef typename TargetTraits::IsMethod IsMethod; | 1428 typedef typename TargetTraits::IsMethod IsMethod; |
| 1429 typedef Sig Signature; |
| 1430 typedef ParamTraits<P1> P1Traits; |
| 1431 typedef Invoker1<IsWeakMethod<IsMethod::value, P1>::value, StorageType, |
| 1432 typename TargetTraits::NormalizedSig> Invoker; |
| 1433 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) || |
| 1434 is_void<typename TargetTraits::Return>::value, |
| 1435 weak_ptrs_can_only_bind_to_methods_without_return_values); |
1038 | 1436 |
1039 // For methods, we need to be careful for parameter 1. We skip the | 1437 // For methods, we need to be careful for parameter 1. We skip the |
1040 // scoped_refptr check because the binder itself takes care of this. We also | 1438 // scoped_refptr check because the binder itself takes care of this. We also |
1041 // disallow binding of an array as the method's target object. | 1439 // disallow binding of an array as the method's target object. |
1042 COMPILE_ASSERT(IsMethod::value || | 1440 COMPILE_ASSERT(IsMethod::value || |
1043 !internal::UnsafeBindtoRefCountedArg<P1>::value, | 1441 !internal::UnsafeBindtoRefCountedArg<P1>::value, |
1044 p1_is_refcounted_type_and_needs_scoped_refptr); | 1442 p1_is_refcounted_type_and_needs_scoped_refptr); |
1045 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, | 1443 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, |
1046 first_bound_argument_to_method_cannot_be_array); | 1444 first_bound_argument_to_method_cannot_be_array); |
1047 | 1445 |
(...skipping 18 matching lines...) Expand all Loading... |
1066 | 1464 |
1067 Sig f_; | 1465 Sig f_; |
1068 typename ParamTraits<P1>::StorageType p1_; | 1466 typename ParamTraits<P1>::StorageType p1_; |
1069 }; | 1467 }; |
1070 | 1468 |
1071 template <typename Sig, typename P1, typename P2> | 1469 template <typename Sig, typename P1, typename P2> |
1072 class InvokerStorage2 : public InvokerStorageBase { | 1470 class InvokerStorage2 : public InvokerStorageBase { |
1073 public: | 1471 public: |
1074 typedef InvokerStorage2 StorageType; | 1472 typedef InvokerStorage2 StorageType; |
1075 typedef FunctionTraits<Sig> TargetTraits; | 1473 typedef FunctionTraits<Sig> TargetTraits; |
1076 typedef Invoker2<StorageType, typename TargetTraits::NormalizedSig> Invoker; | |
1077 typedef typename TargetTraits::IsMethod IsMethod; | 1474 typedef typename TargetTraits::IsMethod IsMethod; |
| 1475 typedef Sig Signature; |
| 1476 typedef ParamTraits<P1> P1Traits; |
| 1477 typedef ParamTraits<P2> P2Traits; |
| 1478 typedef Invoker2<IsWeakMethod<IsMethod::value, P1>::value, StorageType, |
| 1479 typename TargetTraits::NormalizedSig> Invoker; |
| 1480 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) || |
| 1481 is_void<typename TargetTraits::Return>::value, |
| 1482 weak_ptrs_can_only_bind_to_methods_without_return_values); |
1078 | 1483 |
1079 // For methods, we need to be careful for parameter 1. We skip the | 1484 // For methods, we need to be careful for parameter 1. We skip the |
1080 // scoped_refptr check because the binder itself takes care of this. We also | 1485 // scoped_refptr check because the binder itself takes care of this. We also |
1081 // disallow binding of an array as the method's target object. | 1486 // disallow binding of an array as the method's target object. |
1082 COMPILE_ASSERT(IsMethod::value || | 1487 COMPILE_ASSERT(IsMethod::value || |
1083 !internal::UnsafeBindtoRefCountedArg<P1>::value, | 1488 !internal::UnsafeBindtoRefCountedArg<P1>::value, |
1084 p1_is_refcounted_type_and_needs_scoped_refptr); | 1489 p1_is_refcounted_type_and_needs_scoped_refptr); |
1085 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, | 1490 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, |
1086 first_bound_argument_to_method_cannot_be_array); | 1491 first_bound_argument_to_method_cannot_be_array); |
1087 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, | 1492 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, |
(...skipping 23 matching lines...) Expand all Loading... |
1111 Sig f_; | 1516 Sig f_; |
1112 typename ParamTraits<P1>::StorageType p1_; | 1517 typename ParamTraits<P1>::StorageType p1_; |
1113 typename ParamTraits<P2>::StorageType p2_; | 1518 typename ParamTraits<P2>::StorageType p2_; |
1114 }; | 1519 }; |
1115 | 1520 |
1116 template <typename Sig, typename P1, typename P2, typename P3> | 1521 template <typename Sig, typename P1, typename P2, typename P3> |
1117 class InvokerStorage3 : public InvokerStorageBase { | 1522 class InvokerStorage3 : public InvokerStorageBase { |
1118 public: | 1523 public: |
1119 typedef InvokerStorage3 StorageType; | 1524 typedef InvokerStorage3 StorageType; |
1120 typedef FunctionTraits<Sig> TargetTraits; | 1525 typedef FunctionTraits<Sig> TargetTraits; |
1121 typedef Invoker3<StorageType, typename TargetTraits::NormalizedSig> Invoker; | |
1122 typedef typename TargetTraits::IsMethod IsMethod; | 1526 typedef typename TargetTraits::IsMethod IsMethod; |
| 1527 typedef Sig Signature; |
| 1528 typedef ParamTraits<P1> P1Traits; |
| 1529 typedef ParamTraits<P2> P2Traits; |
| 1530 typedef ParamTraits<P3> P3Traits; |
| 1531 typedef Invoker3<IsWeakMethod<IsMethod::value, P1>::value, StorageType, |
| 1532 typename TargetTraits::NormalizedSig> Invoker; |
| 1533 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) || |
| 1534 is_void<typename TargetTraits::Return>::value, |
| 1535 weak_ptrs_can_only_bind_to_methods_without_return_values); |
1123 | 1536 |
1124 // For methods, we need to be careful for parameter 1. We skip the | 1537 // For methods, we need to be careful for parameter 1. We skip the |
1125 // scoped_refptr check because the binder itself takes care of this. We also | 1538 // scoped_refptr check because the binder itself takes care of this. We also |
1126 // disallow binding of an array as the method's target object. | 1539 // disallow binding of an array as the method's target object. |
1127 COMPILE_ASSERT(IsMethod::value || | 1540 COMPILE_ASSERT(IsMethod::value || |
1128 !internal::UnsafeBindtoRefCountedArg<P1>::value, | 1541 !internal::UnsafeBindtoRefCountedArg<P1>::value, |
1129 p1_is_refcounted_type_and_needs_scoped_refptr); | 1542 p1_is_refcounted_type_and_needs_scoped_refptr); |
1130 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, | 1543 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, |
1131 first_bound_argument_to_method_cannot_be_array); | 1544 first_bound_argument_to_method_cannot_be_array); |
1132 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, | 1545 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, |
(...skipping 28 matching lines...) Expand all Loading... |
1161 typename ParamTraits<P1>::StorageType p1_; | 1574 typename ParamTraits<P1>::StorageType p1_; |
1162 typename ParamTraits<P2>::StorageType p2_; | 1575 typename ParamTraits<P2>::StorageType p2_; |
1163 typename ParamTraits<P3>::StorageType p3_; | 1576 typename ParamTraits<P3>::StorageType p3_; |
1164 }; | 1577 }; |
1165 | 1578 |
1166 template <typename Sig, typename P1, typename P2, typename P3, typename P4> | 1579 template <typename Sig, typename P1, typename P2, typename P3, typename P4> |
1167 class InvokerStorage4 : public InvokerStorageBase { | 1580 class InvokerStorage4 : public InvokerStorageBase { |
1168 public: | 1581 public: |
1169 typedef InvokerStorage4 StorageType; | 1582 typedef InvokerStorage4 StorageType; |
1170 typedef FunctionTraits<Sig> TargetTraits; | 1583 typedef FunctionTraits<Sig> TargetTraits; |
1171 typedef Invoker4<StorageType, typename TargetTraits::NormalizedSig> Invoker; | |
1172 typedef typename TargetTraits::IsMethod IsMethod; | 1584 typedef typename TargetTraits::IsMethod IsMethod; |
| 1585 typedef Sig Signature; |
| 1586 typedef ParamTraits<P1> P1Traits; |
| 1587 typedef ParamTraits<P2> P2Traits; |
| 1588 typedef ParamTraits<P3> P3Traits; |
| 1589 typedef ParamTraits<P4> P4Traits; |
| 1590 typedef Invoker4<IsWeakMethod<IsMethod::value, P1>::value, StorageType, |
| 1591 typename TargetTraits::NormalizedSig> Invoker; |
| 1592 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) || |
| 1593 is_void<typename TargetTraits::Return>::value, |
| 1594 weak_ptrs_can_only_bind_to_methods_without_return_values); |
1173 | 1595 |
1174 // For methods, we need to be careful for parameter 1. We skip the | 1596 // For methods, we need to be careful for parameter 1. We skip the |
1175 // scoped_refptr check because the binder itself takes care of this. We also | 1597 // scoped_refptr check because the binder itself takes care of this. We also |
1176 // disallow binding of an array as the method's target object. | 1598 // disallow binding of an array as the method's target object. |
1177 COMPILE_ASSERT(IsMethod::value || | 1599 COMPILE_ASSERT(IsMethod::value || |
1178 !internal::UnsafeBindtoRefCountedArg<P1>::value, | 1600 !internal::UnsafeBindtoRefCountedArg<P1>::value, |
1179 p1_is_refcounted_type_and_needs_scoped_refptr); | 1601 p1_is_refcounted_type_and_needs_scoped_refptr); |
1180 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, | 1602 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, |
1181 first_bound_argument_to_method_cannot_be_array); | 1603 first_bound_argument_to_method_cannot_be_array); |
1182 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, | 1604 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1217 typename ParamTraits<P3>::StorageType p3_; | 1639 typename ParamTraits<P3>::StorageType p3_; |
1218 typename ParamTraits<P4>::StorageType p4_; | 1640 typename ParamTraits<P4>::StorageType p4_; |
1219 }; | 1641 }; |
1220 | 1642 |
1221 template <typename Sig, typename P1, typename P2, typename P3, typename P4, | 1643 template <typename Sig, typename P1, typename P2, typename P3, typename P4, |
1222 typename P5> | 1644 typename P5> |
1223 class InvokerStorage5 : public InvokerStorageBase { | 1645 class InvokerStorage5 : public InvokerStorageBase { |
1224 public: | 1646 public: |
1225 typedef InvokerStorage5 StorageType; | 1647 typedef InvokerStorage5 StorageType; |
1226 typedef FunctionTraits<Sig> TargetTraits; | 1648 typedef FunctionTraits<Sig> TargetTraits; |
1227 typedef Invoker5<StorageType, typename TargetTraits::NormalizedSig> Invoker; | |
1228 typedef typename TargetTraits::IsMethod IsMethod; | 1649 typedef typename TargetTraits::IsMethod IsMethod; |
| 1650 typedef Sig Signature; |
| 1651 typedef ParamTraits<P1> P1Traits; |
| 1652 typedef ParamTraits<P2> P2Traits; |
| 1653 typedef ParamTraits<P3> P3Traits; |
| 1654 typedef ParamTraits<P4> P4Traits; |
| 1655 typedef ParamTraits<P5> P5Traits; |
| 1656 typedef Invoker5<IsWeakMethod<IsMethod::value, P1>::value, StorageType, |
| 1657 typename TargetTraits::NormalizedSig> Invoker; |
| 1658 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) || |
| 1659 is_void<typename TargetTraits::Return>::value, |
| 1660 weak_ptrs_can_only_bind_to_methods_without_return_values); |
1229 | 1661 |
1230 // For methods, we need to be careful for parameter 1. We skip the | 1662 // For methods, we need to be careful for parameter 1. We skip the |
1231 // scoped_refptr check because the binder itself takes care of this. We also | 1663 // scoped_refptr check because the binder itself takes care of this. We also |
1232 // disallow binding of an array as the method's target object. | 1664 // disallow binding of an array as the method's target object. |
1233 COMPILE_ASSERT(IsMethod::value || | 1665 COMPILE_ASSERT(IsMethod::value || |
1234 !internal::UnsafeBindtoRefCountedArg<P1>::value, | 1666 !internal::UnsafeBindtoRefCountedArg<P1>::value, |
1235 p1_is_refcounted_type_and_needs_scoped_refptr); | 1667 p1_is_refcounted_type_and_needs_scoped_refptr); |
1236 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, | 1668 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, |
1237 first_bound_argument_to_method_cannot_be_array); | 1669 first_bound_argument_to_method_cannot_be_array); |
1238 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, | 1670 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1279 typename ParamTraits<P4>::StorageType p4_; | 1711 typename ParamTraits<P4>::StorageType p4_; |
1280 typename ParamTraits<P5>::StorageType p5_; | 1712 typename ParamTraits<P5>::StorageType p5_; |
1281 }; | 1713 }; |
1282 | 1714 |
1283 template <typename Sig, typename P1, typename P2, typename P3, typename P4, | 1715 template <typename Sig, typename P1, typename P2, typename P3, typename P4, |
1284 typename P5, typename P6> | 1716 typename P5, typename P6> |
1285 class InvokerStorage6 : public InvokerStorageBase { | 1717 class InvokerStorage6 : public InvokerStorageBase { |
1286 public: | 1718 public: |
1287 typedef InvokerStorage6 StorageType; | 1719 typedef InvokerStorage6 StorageType; |
1288 typedef FunctionTraits<Sig> TargetTraits; | 1720 typedef FunctionTraits<Sig> TargetTraits; |
1289 typedef Invoker6<StorageType, typename TargetTraits::NormalizedSig> Invoker; | |
1290 typedef typename TargetTraits::IsMethod IsMethod; | 1721 typedef typename TargetTraits::IsMethod IsMethod; |
| 1722 typedef Sig Signature; |
| 1723 typedef ParamTraits<P1> P1Traits; |
| 1724 typedef ParamTraits<P2> P2Traits; |
| 1725 typedef ParamTraits<P3> P3Traits; |
| 1726 typedef ParamTraits<P4> P4Traits; |
| 1727 typedef ParamTraits<P5> P5Traits; |
| 1728 typedef ParamTraits<P6> P6Traits; |
| 1729 typedef Invoker6<IsWeakMethod<IsMethod::value, P1>::value, StorageType, |
| 1730 typename TargetTraits::NormalizedSig> Invoker; |
| 1731 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) || |
| 1732 is_void<typename TargetTraits::Return>::value, |
| 1733 weak_ptrs_can_only_bind_to_methods_without_return_values); |
1291 | 1734 |
1292 // For methods, we need to be careful for parameter 1. We skip the | 1735 // For methods, we need to be careful for parameter 1. We skip the |
1293 // scoped_refptr check because the binder itself takes care of this. We also | 1736 // scoped_refptr check because the binder itself takes care of this. We also |
1294 // disallow binding of an array as the method's target object. | 1737 // disallow binding of an array as the method's target object. |
1295 COMPILE_ASSERT(IsMethod::value || | 1738 COMPILE_ASSERT(IsMethod::value || |
1296 !internal::UnsafeBindtoRefCountedArg<P1>::value, | 1739 !internal::UnsafeBindtoRefCountedArg<P1>::value, |
1297 p1_is_refcounted_type_and_needs_scoped_refptr); | 1740 p1_is_refcounted_type_and_needs_scoped_refptr); |
1298 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, | 1741 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, |
1299 first_bound_argument_to_method_cannot_be_array); | 1742 first_bound_argument_to_method_cannot_be_array); |
1300 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, | 1743 COMPILE_ASSERT(!internal::UnsafeBindtoRefCountedArg<P2>::value, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1344 typename ParamTraits<P3>::StorageType p3_; | 1787 typename ParamTraits<P3>::StorageType p3_; |
1345 typename ParamTraits<P4>::StorageType p4_; | 1788 typename ParamTraits<P4>::StorageType p4_; |
1346 typename ParamTraits<P5>::StorageType p5_; | 1789 typename ParamTraits<P5>::StorageType p5_; |
1347 typename ParamTraits<P6>::StorageType p6_; | 1790 typename ParamTraits<P6>::StorageType p6_; |
1348 }; | 1791 }; |
1349 | 1792 |
1350 } // namespace internal | 1793 } // namespace internal |
1351 } // namespace base | 1794 } // namespace base |
1352 | 1795 |
1353 #endif // BASE_BIND_INTERNAL_H_ | 1796 #endif // BASE_BIND_INTERNAL_H_ |
OLD | NEW |