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