OLD | NEW |
(Empty) | |
| 1 // This file was GENERATED by command: |
| 2 // pump.py prebind.h.pump |
| 3 // DO NOT EDIT BY HAND!!! |
| 4 |
| 5 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 6 // Use of this source code is governed by a BSD-style license that can be |
| 7 // found in the LICENSE file. |
| 8 |
| 9 #ifndef BASE_PREBIND_H_ |
| 10 #define BASE_PREBIND_H_ |
| 11 |
| 12 #include "base/uber_callback.h" |
| 13 |
| 14 namespace base { |
| 15 |
| 16 namespace internal { |
| 17 // These classes are argument wrappers that affect the refcounting, and storage |
| 18 // semantics for prebound arguments. |
| 19 |
| 20 template <typename T> |
| 21 class UnretainedWrapper { |
| 22 public: |
| 23 explicit UnretainedWrapper(T* o) : obj_(o) {} |
| 24 T* get() { return obj_; } |
| 25 private: |
| 26 T* obj_; |
| 27 }; |
| 28 |
| 29 template <typename T> |
| 30 class ConstRefWrapper { |
| 31 public: |
| 32 explicit ConstRefWrapper(const T& o) : ptr_(&o) {} |
| 33 const T* get() { return ptr_; } |
| 34 private: |
| 35 const T* ptr_; |
| 36 }; |
| 37 |
| 38 // Unwrap for the wrappers above. |
| 39 template <typename T> |
| 40 T Unwrap(T o) { return o; } |
| 41 |
| 42 template <typename T> |
| 43 T* Unwrap(UnretainedWrapper<T> unretained) { return unretained.get(); } |
| 44 |
| 45 template <typename T> |
| 46 const T* Unwrap(ConstRefWrapper<T> const_ref) { return const_ref.get(); } |
| 47 |
| 48 // Optional Refcounting. |
| 49 |
| 50 template <bool ref, typename O> |
| 51 struct MaybeRefcount; |
| 52 |
| 53 template <typename O> |
| 54 struct MaybeRefcount<false, O> { |
| 55 static void AddRef(const O&) {} |
| 56 static void Release(const O&) {} |
| 57 }; |
| 58 |
| 59 template <typename O> |
| 60 struct MaybeRefcount<true, UnretainedWrapper<O> > { |
| 61 static void AddRef(const UnretainedWrapper<O>&) {} |
| 62 static void Release(const UnretainedWrapper<O>&) {} |
| 63 }; |
| 64 |
| 65 template <typename O> |
| 66 struct MaybeRefcount<true, ConstRefWrapper<O> > { |
| 67 static void AddRef(ConstRefWrapper<O> o) { o.get()->AddRef(); } |
| 68 static void Release(ConstRefWrapper<O> o) { o.get()->Release(); } |
| 69 }; |
| 70 |
| 71 template <typename O> |
| 72 struct MaybeRefcount<true, O* > { |
| 73 static void AddRef(O* o) { o->AddRef(); } |
| 74 static void Release(O* o) { o->Release(); } |
| 75 }; |
| 76 |
| 77 // The method by which a function is invoked is determined by 3 different |
| 78 // dimensions: |
| 79 // |
| 80 // 1) The type of function (normal, method, const-method) |
| 81 // 2) The arity of the function |
| 82 // 3) The number of bound parameters. |
| 83 // |
| 84 // The FunctionTraitsN classes unwrap the function signature type to |
| 85 // specialize based on the first two dimensions. The N in FunctionTraitsN |
| 86 // specifies the 3rd dimension. |
| 87 |
| 88 template <typename StorageType, typename Sig> |
| 89 struct FunctionTraits1; |
| 90 |
| 91 // Function: Arity 1 -> 0. |
| 92 template <typename StorageType, typename R, typename X1> |
| 93 struct FunctionTraits1<StorageType, R(*)(X1)> { |
| 94 static const bool kShouldRef = false; |
| 95 static R DoInvoke(InvokerStorageBase* base) { |
| 96 StorageType* invoker = static_cast<StorageType*>(base); |
| 97 return invoker->f_(Unwrap(invoker->p1_)); |
| 98 } |
| 99 }; |
| 100 |
| 101 // Method: Arity 0 -> 0. |
| 102 template <typename StorageType, typename R, typename T> |
| 103 struct FunctionTraits1<StorageType, R(T::*)()> { |
| 104 static const bool kShouldRef = true; |
| 105 static R DoInvoke(InvokerStorageBase* base) { |
| 106 StorageType* invoker = static_cast<StorageType*>(base); |
| 107 return (Unwrap(invoker->p1_)->*invoker->f_)(); |
| 108 } |
| 109 }; |
| 110 |
| 111 // Const Method: Arity 0 -> 0. |
| 112 template <typename StorageType, typename R, typename T> |
| 113 struct FunctionTraits1<StorageType, R(T::*)() const> { |
| 114 static const bool kShouldRef = true; |
| 115 static R DoInvoke(InvokerStorageBase* base) { |
| 116 StorageType* invoker = static_cast<StorageType*>(base); |
| 117 return (Unwrap(invoker->p1_)->*invoker->f_)(); |
| 118 } |
| 119 }; |
| 120 |
| 121 // Function: Arity 2 -> 1. |
| 122 template <typename StorageType, typename R, typename X1, typename X2> |
| 123 struct FunctionTraits1<StorageType, R(*)(X1, X2)> { |
| 124 static const bool kShouldRef = false; |
| 125 static R DoInvoke(InvokerStorageBase* base, X2 x2) { |
| 126 StorageType* invoker = static_cast<StorageType*>(base); |
| 127 return invoker->f_(Unwrap(invoker->p1_), x2); |
| 128 } |
| 129 }; |
| 130 |
| 131 // Method: Arity 1 -> 1. |
| 132 template <typename StorageType, typename R, typename T, typename X1> |
| 133 struct FunctionTraits1<StorageType, R(T::*)(X1)> { |
| 134 static const bool kShouldRef = true; |
| 135 static R DoInvoke(InvokerStorageBase* base, X1 x1) { |
| 136 StorageType* invoker = static_cast<StorageType*>(base); |
| 137 return (Unwrap(invoker->p1_)->*invoker->f_)(x1); |
| 138 } |
| 139 }; |
| 140 |
| 141 // Const Method: Arity 1 -> 1. |
| 142 template <typename StorageType, typename R, typename T, typename X1> |
| 143 struct FunctionTraits1<StorageType, R(T::*)(X1) const> { |
| 144 static const bool kShouldRef = true; |
| 145 static R DoInvoke(InvokerStorageBase* base, X1 x1) { |
| 146 StorageType* invoker = static_cast<StorageType*>(base); |
| 147 return (Unwrap(invoker->p1_)->*invoker->f_)(x1); |
| 148 } |
| 149 }; |
| 150 |
| 151 // Function: Arity 3 -> 2. |
| 152 template <typename StorageType, typename R, typename X1, typename X2, |
| 153 typename X3> |
| 154 struct FunctionTraits1<StorageType, R(*)(X1, X2, X3)> { |
| 155 static const bool kShouldRef = false; |
| 156 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3) { |
| 157 StorageType* invoker = static_cast<StorageType*>(base); |
| 158 return invoker->f_(Unwrap(invoker->p1_), x2, x3); |
| 159 } |
| 160 }; |
| 161 |
| 162 // Method: Arity 2 -> 2. |
| 163 template <typename StorageType, typename R, typename T, typename X1, |
| 164 typename X2> |
| 165 struct FunctionTraits1<StorageType, R(T::*)(X1, X2)> { |
| 166 static const bool kShouldRef = true; |
| 167 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2) { |
| 168 StorageType* invoker = static_cast<StorageType*>(base); |
| 169 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2); |
| 170 } |
| 171 }; |
| 172 |
| 173 // Const Method: Arity 2 -> 2. |
| 174 template <typename StorageType, typename R, typename T, typename X1, |
| 175 typename X2> |
| 176 struct FunctionTraits1<StorageType, R(T::*)(X1, X2) const> { |
| 177 static const bool kShouldRef = true; |
| 178 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2) { |
| 179 StorageType* invoker = static_cast<StorageType*>(base); |
| 180 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2); |
| 181 } |
| 182 }; |
| 183 |
| 184 // Function: Arity 4 -> 3. |
| 185 template <typename StorageType, typename R, typename X1, typename X2, |
| 186 typename X3, typename X4> |
| 187 struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4)> { |
| 188 static const bool kShouldRef = false; |
| 189 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3, X4 x4) { |
| 190 StorageType* invoker = static_cast<StorageType*>(base); |
| 191 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4); |
| 192 } |
| 193 }; |
| 194 |
| 195 // Method: Arity 3 -> 3. |
| 196 template <typename StorageType, typename R, typename T, typename X1, |
| 197 typename X2, typename X3> |
| 198 struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3)> { |
| 199 static const bool kShouldRef = true; |
| 200 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2, X3 x3) { |
| 201 StorageType* invoker = static_cast<StorageType*>(base); |
| 202 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3); |
| 203 } |
| 204 }; |
| 205 |
| 206 // Const Method: Arity 3 -> 3. |
| 207 template <typename StorageType, typename R, typename T, typename X1, |
| 208 typename X2, typename X3> |
| 209 struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3) const> { |
| 210 static const bool kShouldRef = true; |
| 211 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2, X3 x3) { |
| 212 StorageType* invoker = static_cast<StorageType*>(base); |
| 213 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3); |
| 214 } |
| 215 }; |
| 216 |
| 217 // Function: Arity 5 -> 4. |
| 218 template <typename StorageType, typename R, typename X1, typename X2, |
| 219 typename X3, typename X4, typename X5> |
| 220 struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4, X5)> { |
| 221 static const bool kShouldRef = false; |
| 222 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3, X4 x4, X5 x5) { |
| 223 StorageType* invoker = static_cast<StorageType*>(base); |
| 224 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5); |
| 225 } |
| 226 }; |
| 227 |
| 228 // Method: Arity 4 -> 4. |
| 229 template <typename StorageType, typename R, typename T, typename X1, |
| 230 typename X2, typename X3, typename X4> |
| 231 struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4)> { |
| 232 static const bool kShouldRef = true; |
| 233 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2, X3 x3, X4 x4) { |
| 234 StorageType* invoker = static_cast<StorageType*>(base); |
| 235 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4); |
| 236 } |
| 237 }; |
| 238 |
| 239 // Const Method: Arity 4 -> 4. |
| 240 template <typename StorageType, typename R, typename T, typename X1, |
| 241 typename X2, typename X3, typename X4> |
| 242 struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4) const> { |
| 243 static const bool kShouldRef = true; |
| 244 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2, X3 x3, X4 x4) { |
| 245 StorageType* invoker = static_cast<StorageType*>(base); |
| 246 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4); |
| 247 } |
| 248 }; |
| 249 |
| 250 // Function: Arity 6 -> 5. |
| 251 template <typename StorageType, typename R, typename X1, typename X2, |
| 252 typename X3, typename X4, typename X5, typename X6> |
| 253 struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { |
| 254 static const bool kShouldRef = false; |
| 255 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3, X4 x4, X5 x5, |
| 256 X6 x6) { |
| 257 StorageType* invoker = static_cast<StorageType*>(base); |
| 258 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5, x6); |
| 259 } |
| 260 }; |
| 261 |
| 262 // Method: Arity 5 -> 5. |
| 263 template <typename StorageType, typename R, typename T, typename X1, |
| 264 typename X2, typename X3, typename X4, typename X5> |
| 265 struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { |
| 266 static const bool kShouldRef = true; |
| 267 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2, X3 x3, X4 x4, |
| 268 X5 x5) { |
| 269 StorageType* invoker = static_cast<StorageType*>(base); |
| 270 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4, x5); |
| 271 } |
| 272 }; |
| 273 |
| 274 // Const Method: Arity 5 -> 5. |
| 275 template <typename StorageType, typename R, typename T, typename X1, |
| 276 typename X2, typename X3, typename X4, typename X5> |
| 277 struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> { |
| 278 static const bool kShouldRef = true; |
| 279 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2, X3 x3, X4 x4, |
| 280 X5 x5) { |
| 281 StorageType* invoker = static_cast<StorageType*>(base); |
| 282 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4, x5); |
| 283 } |
| 284 }; |
| 285 |
| 286 template <typename StorageType, typename Sig> |
| 287 struct FunctionTraits2; |
| 288 |
| 289 // Function: Arity 2 -> 0. |
| 290 template <typename StorageType, typename R, typename X1, typename X2> |
| 291 struct FunctionTraits2<StorageType, R(*)(X1, X2)> { |
| 292 static const bool kShouldRef = false; |
| 293 static R DoInvoke(InvokerStorageBase* base) { |
| 294 StorageType* invoker = static_cast<StorageType*>(base); |
| 295 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_)); |
| 296 } |
| 297 }; |
| 298 |
| 299 // Method: Arity 1 -> 0. |
| 300 template <typename StorageType, typename R, typename T, typename X1> |
| 301 struct FunctionTraits2<StorageType, R(T::*)(X1)> { |
| 302 static const bool kShouldRef = true; |
| 303 static R DoInvoke(InvokerStorageBase* base) { |
| 304 StorageType* invoker = static_cast<StorageType*>(base); |
| 305 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_)); |
| 306 } |
| 307 }; |
| 308 |
| 309 // Const Method: Arity 1 -> 0. |
| 310 template <typename StorageType, typename R, typename T, typename X1> |
| 311 struct FunctionTraits2<StorageType, R(T::*)(X1) const> { |
| 312 static const bool kShouldRef = true; |
| 313 static R DoInvoke(InvokerStorageBase* base) { |
| 314 StorageType* invoker = static_cast<StorageType*>(base); |
| 315 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_)); |
| 316 } |
| 317 }; |
| 318 |
| 319 // Function: Arity 3 -> 1. |
| 320 template <typename StorageType, typename R, typename X1, typename X2, |
| 321 typename X3> |
| 322 struct FunctionTraits2<StorageType, R(*)(X1, X2, X3)> { |
| 323 static const bool kShouldRef = false; |
| 324 static R DoInvoke(InvokerStorageBase* base, X3 x3) { |
| 325 StorageType* invoker = static_cast<StorageType*>(base); |
| 326 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3); |
| 327 } |
| 328 }; |
| 329 |
| 330 // Method: Arity 2 -> 1. |
| 331 template <typename StorageType, typename R, typename T, typename X1, |
| 332 typename X2> |
| 333 struct FunctionTraits2<StorageType, R(T::*)(X1, X2)> { |
| 334 static const bool kShouldRef = true; |
| 335 static R DoInvoke(InvokerStorageBase* base, X2 x2) { |
| 336 StorageType* invoker = static_cast<StorageType*>(base); |
| 337 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2); |
| 338 } |
| 339 }; |
| 340 |
| 341 // Const Method: Arity 2 -> 1. |
| 342 template <typename StorageType, typename R, typename T, typename X1, |
| 343 typename X2> |
| 344 struct FunctionTraits2<StorageType, R(T::*)(X1, X2) const> { |
| 345 static const bool kShouldRef = true; |
| 346 static R DoInvoke(InvokerStorageBase* base, X2 x2) { |
| 347 StorageType* invoker = static_cast<StorageType*>(base); |
| 348 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2); |
| 349 } |
| 350 }; |
| 351 |
| 352 // Function: Arity 4 -> 2. |
| 353 template <typename StorageType, typename R, typename X1, typename X2, |
| 354 typename X3, typename X4> |
| 355 struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4)> { |
| 356 static const bool kShouldRef = false; |
| 357 static R DoInvoke(InvokerStorageBase* base, X3 x3, X4 x4) { |
| 358 StorageType* invoker = static_cast<StorageType*>(base); |
| 359 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4); |
| 360 } |
| 361 }; |
| 362 |
| 363 // Method: Arity 3 -> 2. |
| 364 template <typename StorageType, typename R, typename T, typename X1, |
| 365 typename X2, typename X3> |
| 366 struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3)> { |
| 367 static const bool kShouldRef = true; |
| 368 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3) { |
| 369 StorageType* invoker = static_cast<StorageType*>(base); |
| 370 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3); |
| 371 } |
| 372 }; |
| 373 |
| 374 // Const Method: Arity 3 -> 2. |
| 375 template <typename StorageType, typename R, typename T, typename X1, |
| 376 typename X2, typename X3> |
| 377 struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3) const> { |
| 378 static const bool kShouldRef = true; |
| 379 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3) { |
| 380 StorageType* invoker = static_cast<StorageType*>(base); |
| 381 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3); |
| 382 } |
| 383 }; |
| 384 |
| 385 // Function: Arity 5 -> 3. |
| 386 template <typename StorageType, typename R, typename X1, typename X2, |
| 387 typename X3, typename X4, typename X5> |
| 388 struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4, X5)> { |
| 389 static const bool kShouldRef = false; |
| 390 static R DoInvoke(InvokerStorageBase* base, X3 x3, X4 x4, X5 x5) { |
| 391 StorageType* invoker = static_cast<StorageType*>(base); |
| 392 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5); |
| 393 } |
| 394 }; |
| 395 |
| 396 // Method: Arity 4 -> 3. |
| 397 template <typename StorageType, typename R, typename T, typename X1, |
| 398 typename X2, typename X3, typename X4> |
| 399 struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4)> { |
| 400 static const bool kShouldRef = true; |
| 401 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3, X4 x4) { |
| 402 StorageType* invoker = static_cast<StorageType*>(base); |
| 403 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, |
| 404 x4); |
| 405 } |
| 406 }; |
| 407 |
| 408 // Const Method: Arity 4 -> 3. |
| 409 template <typename StorageType, typename R, typename T, typename X1, |
| 410 typename X2, typename X3, typename X4> |
| 411 struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4) const> { |
| 412 static const bool kShouldRef = true; |
| 413 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3, X4 x4) { |
| 414 StorageType* invoker = static_cast<StorageType*>(base); |
| 415 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, |
| 416 x4); |
| 417 } |
| 418 }; |
| 419 |
| 420 // Function: Arity 6 -> 4. |
| 421 template <typename StorageType, typename R, typename X1, typename X2, |
| 422 typename X3, typename X4, typename X5, typename X6> |
| 423 struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { |
| 424 static const bool kShouldRef = false; |
| 425 static R DoInvoke(InvokerStorageBase* base, X3 x3, X4 x4, X5 x5, X6 x6) { |
| 426 StorageType* invoker = static_cast<StorageType*>(base); |
| 427 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5, |
| 428 x6); |
| 429 } |
| 430 }; |
| 431 |
| 432 // Method: Arity 5 -> 4. |
| 433 template <typename StorageType, typename R, typename T, typename X1, |
| 434 typename X2, typename X3, typename X4, typename X5> |
| 435 struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { |
| 436 static const bool kShouldRef = true; |
| 437 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3, X4 x4, X5 x5) { |
| 438 StorageType* invoker = static_cast<StorageType*>(base); |
| 439 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, |
| 440 x4, x5); |
| 441 } |
| 442 }; |
| 443 |
| 444 // Const Method: Arity 5 -> 4. |
| 445 template <typename StorageType, typename R, typename T, typename X1, |
| 446 typename X2, typename X3, typename X4, typename X5> |
| 447 struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> { |
| 448 static const bool kShouldRef = true; |
| 449 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3, X4 x4, X5 x5) { |
| 450 StorageType* invoker = static_cast<StorageType*>(base); |
| 451 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, |
| 452 x4, x5); |
| 453 } |
| 454 }; |
| 455 |
| 456 template <typename StorageType, typename Sig> |
| 457 struct FunctionTraits3; |
| 458 |
| 459 // Function: Arity 3 -> 0. |
| 460 template <typename StorageType, typename R, typename X1, typename X2, |
| 461 typename X3> |
| 462 struct FunctionTraits3<StorageType, R(*)(X1, X2, X3)> { |
| 463 static const bool kShouldRef = false; |
| 464 static R DoInvoke(InvokerStorageBase* base) { |
| 465 StorageType* invoker = static_cast<StorageType*>(base); |
| 466 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
| 467 Unwrap(invoker->p3_)); |
| 468 } |
| 469 }; |
| 470 |
| 471 // Method: Arity 2 -> 0. |
| 472 template <typename StorageType, typename R, typename T, typename X1, |
| 473 typename X2> |
| 474 struct FunctionTraits3<StorageType, R(T::*)(X1, X2)> { |
| 475 static const bool kShouldRef = true; |
| 476 static R DoInvoke(InvokerStorageBase* base) { |
| 477 StorageType* invoker = static_cast<StorageType*>(base); |
| 478 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 479 Unwrap(invoker->p3_)); |
| 480 } |
| 481 }; |
| 482 |
| 483 // Const Method: Arity 2 -> 0. |
| 484 template <typename StorageType, typename R, typename T, typename X1, |
| 485 typename X2> |
| 486 struct FunctionTraits3<StorageType, R(T::*)(X1, X2) const> { |
| 487 static const bool kShouldRef = true; |
| 488 static R DoInvoke(InvokerStorageBase* base) { |
| 489 StorageType* invoker = static_cast<StorageType*>(base); |
| 490 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 491 Unwrap(invoker->p3_)); |
| 492 } |
| 493 }; |
| 494 |
| 495 // Function: Arity 4 -> 1. |
| 496 template <typename StorageType, typename R, typename X1, typename X2, |
| 497 typename X3, typename X4> |
| 498 struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4)> { |
| 499 static const bool kShouldRef = false; |
| 500 static R DoInvoke(InvokerStorageBase* base, X4 x4) { |
| 501 StorageType* invoker = static_cast<StorageType*>(base); |
| 502 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
| 503 Unwrap(invoker->p3_), x4); |
| 504 } |
| 505 }; |
| 506 |
| 507 // Method: Arity 3 -> 1. |
| 508 template <typename StorageType, typename R, typename T, typename X1, |
| 509 typename X2, typename X3> |
| 510 struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3)> { |
| 511 static const bool kShouldRef = true; |
| 512 static R DoInvoke(InvokerStorageBase* base, X3 x3) { |
| 513 StorageType* invoker = static_cast<StorageType*>(base); |
| 514 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 515 Unwrap(invoker->p3_), x3); |
| 516 } |
| 517 }; |
| 518 |
| 519 // Const Method: Arity 3 -> 1. |
| 520 template <typename StorageType, typename R, typename T, typename X1, |
| 521 typename X2, typename X3> |
| 522 struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3) const> { |
| 523 static const bool kShouldRef = true; |
| 524 static R DoInvoke(InvokerStorageBase* base, X3 x3) { |
| 525 StorageType* invoker = static_cast<StorageType*>(base); |
| 526 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 527 Unwrap(invoker->p3_), x3); |
| 528 } |
| 529 }; |
| 530 |
| 531 // Function: Arity 5 -> 2. |
| 532 template <typename StorageType, typename R, typename X1, typename X2, |
| 533 typename X3, typename X4, typename X5> |
| 534 struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4, X5)> { |
| 535 static const bool kShouldRef = false; |
| 536 static R DoInvoke(InvokerStorageBase* base, X4 x4, X5 x5) { |
| 537 StorageType* invoker = static_cast<StorageType*>(base); |
| 538 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
| 539 Unwrap(invoker->p3_), x4, x5); |
| 540 } |
| 541 }; |
| 542 |
| 543 // Method: Arity 4 -> 2. |
| 544 template <typename StorageType, typename R, typename T, typename X1, |
| 545 typename X2, typename X3, typename X4> |
| 546 struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4)> { |
| 547 static const bool kShouldRef = true; |
| 548 static R DoInvoke(InvokerStorageBase* base, X3 x3, X4 x4) { |
| 549 StorageType* invoker = static_cast<StorageType*>(base); |
| 550 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 551 Unwrap(invoker->p3_), x3, x4); |
| 552 } |
| 553 }; |
| 554 |
| 555 // Const Method: Arity 4 -> 2. |
| 556 template <typename StorageType, typename R, typename T, typename X1, |
| 557 typename X2, typename X3, typename X4> |
| 558 struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4) const> { |
| 559 static const bool kShouldRef = true; |
| 560 static R DoInvoke(InvokerStorageBase* base, X3 x3, X4 x4) { |
| 561 StorageType* invoker = static_cast<StorageType*>(base); |
| 562 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 563 Unwrap(invoker->p3_), x3, x4); |
| 564 } |
| 565 }; |
| 566 |
| 567 // Function: Arity 6 -> 3. |
| 568 template <typename StorageType, typename R, typename X1, typename X2, |
| 569 typename X3, typename X4, typename X5, typename X6> |
| 570 struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { |
| 571 static const bool kShouldRef = false; |
| 572 static R DoInvoke(InvokerStorageBase* base, X4 x4, X5 x5, X6 x6) { |
| 573 StorageType* invoker = static_cast<StorageType*>(base); |
| 574 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
| 575 Unwrap(invoker->p3_), x4, x5, x6); |
| 576 } |
| 577 }; |
| 578 |
| 579 // Method: Arity 5 -> 3. |
| 580 template <typename StorageType, typename R, typename T, typename X1, |
| 581 typename X2, typename X3, typename X4, typename X5> |
| 582 struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { |
| 583 static const bool kShouldRef = true; |
| 584 static R DoInvoke(InvokerStorageBase* base, X3 x3, X4 x4, X5 x5) { |
| 585 StorageType* invoker = static_cast<StorageType*>(base); |
| 586 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 587 Unwrap(invoker->p3_), x3, x4, x5); |
| 588 } |
| 589 }; |
| 590 |
| 591 // Const Method: Arity 5 -> 3. |
| 592 template <typename StorageType, typename R, typename T, typename X1, |
| 593 typename X2, typename X3, typename X4, typename X5> |
| 594 struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> { |
| 595 static const bool kShouldRef = true; |
| 596 static R DoInvoke(InvokerStorageBase* base, X3 x3, X4 x4, X5 x5) { |
| 597 StorageType* invoker = static_cast<StorageType*>(base); |
| 598 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 599 Unwrap(invoker->p3_), x3, x4, x5); |
| 600 } |
| 601 }; |
| 602 |
| 603 template <typename StorageType, typename Sig> |
| 604 struct FunctionTraits4; |
| 605 |
| 606 // Function: Arity 4 -> 0. |
| 607 template <typename StorageType, typename R, typename X1, typename X2, |
| 608 typename X3, typename X4> |
| 609 struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4)> { |
| 610 static const bool kShouldRef = false; |
| 611 static R DoInvoke(InvokerStorageBase* base) { |
| 612 StorageType* invoker = static_cast<StorageType*>(base); |
| 613 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
| 614 Unwrap(invoker->p3_), Unwrap(invoker->p4_)); |
| 615 } |
| 616 }; |
| 617 |
| 618 // Method: Arity 3 -> 0. |
| 619 template <typename StorageType, typename R, typename T, typename X1, |
| 620 typename X2, typename X3> |
| 621 struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3)> { |
| 622 static const bool kShouldRef = true; |
| 623 static R DoInvoke(InvokerStorageBase* base) { |
| 624 StorageType* invoker = static_cast<StorageType*>(base); |
| 625 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 626 Unwrap(invoker->p3_), Unwrap(invoker->p4_)); |
| 627 } |
| 628 }; |
| 629 |
| 630 // Const Method: Arity 3 -> 0. |
| 631 template <typename StorageType, typename R, typename T, typename X1, |
| 632 typename X2, typename X3> |
| 633 struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3) const> { |
| 634 static const bool kShouldRef = true; |
| 635 static R DoInvoke(InvokerStorageBase* base) { |
| 636 StorageType* invoker = static_cast<StorageType*>(base); |
| 637 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 638 Unwrap(invoker->p3_), Unwrap(invoker->p4_)); |
| 639 } |
| 640 }; |
| 641 |
| 642 // Function: Arity 5 -> 1. |
| 643 template <typename StorageType, typename R, typename X1, typename X2, |
| 644 typename X3, typename X4, typename X5> |
| 645 struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4, X5)> { |
| 646 static const bool kShouldRef = false; |
| 647 static R DoInvoke(InvokerStorageBase* base, X5 x5) { |
| 648 StorageType* invoker = static_cast<StorageType*>(base); |
| 649 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
| 650 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5); |
| 651 } |
| 652 }; |
| 653 |
| 654 // Method: Arity 4 -> 1. |
| 655 template <typename StorageType, typename R, typename T, typename X1, |
| 656 typename X2, typename X3, typename X4> |
| 657 struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4)> { |
| 658 static const bool kShouldRef = true; |
| 659 static R DoInvoke(InvokerStorageBase* base, X4 x4) { |
| 660 StorageType* invoker = static_cast<StorageType*>(base); |
| 661 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 662 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4); |
| 663 } |
| 664 }; |
| 665 |
| 666 // Const Method: Arity 4 -> 1. |
| 667 template <typename StorageType, typename R, typename T, typename X1, |
| 668 typename X2, typename X3, typename X4> |
| 669 struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4) const> { |
| 670 static const bool kShouldRef = true; |
| 671 static R DoInvoke(InvokerStorageBase* base, X4 x4) { |
| 672 StorageType* invoker = static_cast<StorageType*>(base); |
| 673 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 674 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4); |
| 675 } |
| 676 }; |
| 677 |
| 678 // Function: Arity 6 -> 2. |
| 679 template <typename StorageType, typename R, typename X1, typename X2, |
| 680 typename X3, typename X4, typename X5, typename X6> |
| 681 struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { |
| 682 static const bool kShouldRef = false; |
| 683 static R DoInvoke(InvokerStorageBase* base, X5 x5, X6 x6) { |
| 684 StorageType* invoker = static_cast<StorageType*>(base); |
| 685 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
| 686 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5, x6); |
| 687 } |
| 688 }; |
| 689 |
| 690 // Method: Arity 5 -> 2. |
| 691 template <typename StorageType, typename R, typename T, typename X1, |
| 692 typename X2, typename X3, typename X4, typename X5> |
| 693 struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { |
| 694 static const bool kShouldRef = true; |
| 695 static R DoInvoke(InvokerStorageBase* base, X4 x4, X5 x5) { |
| 696 StorageType* invoker = static_cast<StorageType*>(base); |
| 697 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 698 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4, x5); |
| 699 } |
| 700 }; |
| 701 |
| 702 // Const Method: Arity 5 -> 2. |
| 703 template <typename StorageType, typename R, typename T, typename X1, |
| 704 typename X2, typename X3, typename X4, typename X5> |
| 705 struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> { |
| 706 static const bool kShouldRef = true; |
| 707 static R DoInvoke(InvokerStorageBase* base, X4 x4, X5 x5) { |
| 708 StorageType* invoker = static_cast<StorageType*>(base); |
| 709 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 710 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4, x5); |
| 711 } |
| 712 }; |
| 713 |
| 714 template <typename StorageType, typename Sig> |
| 715 struct FunctionTraits5; |
| 716 |
| 717 // Function: Arity 5 -> 0. |
| 718 template <typename StorageType, typename R, typename X1, typename X2, |
| 719 typename X3, typename X4, typename X5> |
| 720 struct FunctionTraits5<StorageType, R(*)(X1, X2, X3, X4, X5)> { |
| 721 static const bool kShouldRef = false; |
| 722 static R DoInvoke(InvokerStorageBase* base) { |
| 723 StorageType* invoker = static_cast<StorageType*>(base); |
| 724 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
| 725 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_)); |
| 726 } |
| 727 }; |
| 728 |
| 729 // Method: Arity 4 -> 0. |
| 730 template <typename StorageType, typename R, typename T, typename X1, |
| 731 typename X2, typename X3, typename X4> |
| 732 struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4)> { |
| 733 static const bool kShouldRef = true; |
| 734 static R DoInvoke(InvokerStorageBase* base) { |
| 735 StorageType* invoker = static_cast<StorageType*>(base); |
| 736 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 737 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_)); |
| 738 } |
| 739 }; |
| 740 |
| 741 // Const Method: Arity 4 -> 0. |
| 742 template <typename StorageType, typename R, typename T, typename X1, |
| 743 typename X2, typename X3, typename X4> |
| 744 struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4) const> { |
| 745 static const bool kShouldRef = true; |
| 746 static R DoInvoke(InvokerStorageBase* base) { |
| 747 StorageType* invoker = static_cast<StorageType*>(base); |
| 748 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 749 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_)); |
| 750 } |
| 751 }; |
| 752 |
| 753 // Function: Arity 6 -> 1. |
| 754 template <typename StorageType, typename R, typename X1, typename X2, |
| 755 typename X3, typename X4, typename X5, typename X6> |
| 756 struct FunctionTraits5<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { |
| 757 static const bool kShouldRef = false; |
| 758 static R DoInvoke(InvokerStorageBase* base, X6 x6) { |
| 759 StorageType* invoker = static_cast<StorageType*>(base); |
| 760 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
| 761 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x6); |
| 762 } |
| 763 }; |
| 764 |
| 765 // Method: Arity 5 -> 1. |
| 766 template <typename StorageType, typename R, typename T, typename X1, |
| 767 typename X2, typename X3, typename X4, typename X5> |
| 768 struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { |
| 769 static const bool kShouldRef = true; |
| 770 static R DoInvoke(InvokerStorageBase* base, X5 x5) { |
| 771 StorageType* invoker = static_cast<StorageType*>(base); |
| 772 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 773 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5); |
| 774 } |
| 775 }; |
| 776 |
| 777 // Const Method: Arity 5 -> 1. |
| 778 template <typename StorageType, typename R, typename T, typename X1, |
| 779 typename X2, typename X3, typename X4, typename X5> |
| 780 struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> { |
| 781 static const bool kShouldRef = true; |
| 782 static R DoInvoke(InvokerStorageBase* base, X5 x5) { |
| 783 StorageType* invoker = static_cast<StorageType*>(base); |
| 784 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 785 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5); |
| 786 } |
| 787 }; |
| 788 |
| 789 template <typename StorageType, typename Sig> |
| 790 struct FunctionTraits6; |
| 791 |
| 792 // Function: Arity 6 -> 0. |
| 793 template <typename StorageType, typename R, typename X1, typename X2, |
| 794 typename X3, typename X4, typename X5, typename X6> |
| 795 struct FunctionTraits6<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { |
| 796 static const bool kShouldRef = false; |
| 797 static R DoInvoke(InvokerStorageBase* base) { |
| 798 StorageType* invoker = static_cast<StorageType*>(base); |
| 799 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
| 800 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), |
| 801 Unwrap(invoker->p6_)); |
| 802 } |
| 803 }; |
| 804 |
| 805 // Method: Arity 5 -> 0. |
| 806 template <typename StorageType, typename R, typename T, typename X1, |
| 807 typename X2, typename X3, typename X4, typename X5> |
| 808 struct FunctionTraits6<StorageType, R(T::*)(X1, X2, X3, X4, X5)> { |
| 809 static const bool kShouldRef = true; |
| 810 static R DoInvoke(InvokerStorageBase* base) { |
| 811 StorageType* invoker = static_cast<StorageType*>(base); |
| 812 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 813 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), |
| 814 Unwrap(invoker->p6_)); |
| 815 } |
| 816 }; |
| 817 |
| 818 // Const Method: Arity 5 -> 0. |
| 819 template <typename StorageType, typename R, typename T, typename X1, |
| 820 typename X2, typename X3, typename X4, typename X5> |
| 821 struct FunctionTraits6<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> { |
| 822 static const bool kShouldRef = true; |
| 823 static R DoInvoke(InvokerStorageBase* base) { |
| 824 StorageType* invoker = static_cast<StorageType*>(base); |
| 825 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
| 826 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), |
| 827 Unwrap(invoker->p6_)); |
| 828 } |
| 829 }; |
| 830 |
| 831 |
| 832 // These are the actual storage classes for the invokers. |
| 833 |
| 834 template <typename Sig, typename P1> |
| 835 class InvokerStorage1 : public InvokerStorageBase { |
| 836 public: |
| 837 typedef InvokerStorage1 StorageType; |
| 838 typedef FunctionTraits1<StorageType, Sig> FunctionTraits; |
| 839 |
| 840 InvokerStorage1(Sig f, const P1& p1) |
| 841 : f_(f), p1_(p1) { |
| 842 MaybeRefcount<FunctionTraits::kShouldRef, P1>::AddRef(p1_); |
| 843 } |
| 844 |
| 845 virtual ~InvokerStorage1() { |
| 846 MaybeRefcount<FunctionTraits::kShouldRef, P1>::Release(p1_); |
| 847 } |
| 848 |
| 849 Sig f_; |
| 850 P1 p1_; |
| 851 }; |
| 852 |
| 853 template <typename Sig, typename P1, typename P2> |
| 854 class InvokerStorage2 : public InvokerStorageBase { |
| 855 public: |
| 856 typedef InvokerStorage2 StorageType; |
| 857 typedef FunctionTraits2<StorageType, Sig> FunctionTraits; |
| 858 |
| 859 InvokerStorage2(Sig f, const P1& p1, const P2& p2) |
| 860 : f_(f), p1_(p1), p2_(p2) { |
| 861 MaybeRefcount<FunctionTraits::kShouldRef, P1>::AddRef(p1_); |
| 862 } |
| 863 |
| 864 virtual ~InvokerStorage2() { |
| 865 MaybeRefcount<FunctionTraits::kShouldRef, P1>::Release(p1_); |
| 866 } |
| 867 |
| 868 Sig f_; |
| 869 P1 p1_; |
| 870 P2 p2_; |
| 871 }; |
| 872 |
| 873 template <typename Sig, typename P1, typename P2, typename P3> |
| 874 class InvokerStorage3 : public InvokerStorageBase { |
| 875 public: |
| 876 typedef InvokerStorage3 StorageType; |
| 877 typedef FunctionTraits3<StorageType, Sig> FunctionTraits; |
| 878 |
| 879 InvokerStorage3(Sig f, const P1& p1, const P2& p2, const P3& p3) |
| 880 : f_(f), p1_(p1), p2_(p2), p3_(p3) { |
| 881 MaybeRefcount<FunctionTraits::kShouldRef, P1>::AddRef(p1_); |
| 882 } |
| 883 |
| 884 virtual ~InvokerStorage3() { |
| 885 MaybeRefcount<FunctionTraits::kShouldRef, P1>::Release(p1_); |
| 886 } |
| 887 |
| 888 Sig f_; |
| 889 P1 p1_; |
| 890 P2 p2_; |
| 891 P3 p3_; |
| 892 }; |
| 893 |
| 894 template <typename Sig, typename P1, typename P2, typename P3, typename P4> |
| 895 class InvokerStorage4 : public InvokerStorageBase { |
| 896 public: |
| 897 typedef InvokerStorage4 StorageType; |
| 898 typedef FunctionTraits4<StorageType, Sig> FunctionTraits; |
| 899 |
| 900 InvokerStorage4(Sig f, const P1& p1, const P2& p2, const P3& p3, const P4& p4) |
| 901 : f_(f), p1_(p1), p2_(p2), p3_(p3), p4_(p4) { |
| 902 MaybeRefcount<FunctionTraits::kShouldRef, P1>::AddRef(p1_); |
| 903 } |
| 904 |
| 905 virtual ~InvokerStorage4() { |
| 906 MaybeRefcount<FunctionTraits::kShouldRef, P1>::Release(p1_); |
| 907 } |
| 908 |
| 909 Sig f_; |
| 910 P1 p1_; |
| 911 P2 p2_; |
| 912 P3 p3_; |
| 913 P4 p4_; |
| 914 }; |
| 915 |
| 916 template <typename Sig, typename P1, typename P2, typename P3, typename P4, |
| 917 typename P5> |
| 918 class InvokerStorage5 : public InvokerStorageBase { |
| 919 public: |
| 920 typedef InvokerStorage5 StorageType; |
| 921 typedef FunctionTraits5<StorageType, Sig> FunctionTraits; |
| 922 |
| 923 InvokerStorage5(Sig f, const P1& p1, const P2& p2, const P3& p3, |
| 924 const P4& p4, const P5& p5) |
| 925 : f_(f), p1_(p1), p2_(p2), p3_(p3), p4_(p4), p5_(p5) { |
| 926 MaybeRefcount<FunctionTraits::kShouldRef, P1>::AddRef(p1_); |
| 927 } |
| 928 |
| 929 virtual ~InvokerStorage5() { |
| 930 MaybeRefcount<FunctionTraits::kShouldRef, P1>::Release(p1_); |
| 931 } |
| 932 |
| 933 Sig f_; |
| 934 P1 p1_; |
| 935 P2 p2_; |
| 936 P3 p3_; |
| 937 P4 p4_; |
| 938 P5 p5_; |
| 939 }; |
| 940 |
| 941 template <typename Sig, typename P1, typename P2, typename P3, typename P4, |
| 942 typename P5, typename P6> |
| 943 class InvokerStorage6 : public InvokerStorageBase { |
| 944 public: |
| 945 typedef InvokerStorage6 StorageType; |
| 946 typedef FunctionTraits6<StorageType, Sig> FunctionTraits; |
| 947 |
| 948 InvokerStorage6(Sig f, const P1& p1, const P2& p2, const P3& p3, |
| 949 const P4& p4, const P5& p5, const P6& p6) |
| 950 : f_(f), p1_(p1), p2_(p2), p3_(p3), p4_(p4), p5_(p5), p6_(p6) { |
| 951 MaybeRefcount<FunctionTraits::kShouldRef, P1>::AddRef(p1_); |
| 952 } |
| 953 |
| 954 virtual ~InvokerStorage6() { |
| 955 MaybeRefcount<FunctionTraits::kShouldRef, P1>::Release(p1_); |
| 956 } |
| 957 |
| 958 Sig f_; |
| 959 P1 p1_; |
| 960 P2 p2_; |
| 961 P3 p3_; |
| 962 P4 p4_; |
| 963 P5 p5_; |
| 964 P6 p6_; |
| 965 }; |
| 966 |
| 967 } // namespace internal |
| 968 |
| 969 |
| 970 template <typename Sig, typename P1> |
| 971 InvokerStorageHolder<internal::InvokerStorage1<Sig, P1> > |
| 972 Prebind(Sig f, const P1& p1) { |
| 973 return MakeInvokerStorageHolder( |
| 974 new internal::InvokerStorage1<Sig, P1>( |
| 975 f, p1)); |
| 976 } |
| 977 |
| 978 template <typename Sig, typename P1, typename P2> |
| 979 InvokerStorageHolder<internal::InvokerStorage2<Sig, P1, P2> > |
| 980 Prebind(Sig f, const P1& p1, const P2& p2) { |
| 981 return MakeInvokerStorageHolder( |
| 982 new internal::InvokerStorage2<Sig, P1, P2>( |
| 983 f, p1, p2)); |
| 984 } |
| 985 |
| 986 template <typename Sig, typename P1, typename P2, typename P3> |
| 987 InvokerStorageHolder<internal::InvokerStorage3<Sig, P1, P2, P3> > |
| 988 Prebind(Sig f, const P1& p1, const P2& p2, const P3& p3) { |
| 989 return MakeInvokerStorageHolder( |
| 990 new internal::InvokerStorage3<Sig, P1, P2, P3>( |
| 991 f, p1, p2, p3)); |
| 992 } |
| 993 |
| 994 template <typename Sig, typename P1, typename P2, typename P3, typename P4> |
| 995 InvokerStorageHolder<internal::InvokerStorage4<Sig, P1, P2, P3, P4> > |
| 996 Prebind(Sig f, const P1& p1, const P2& p2, const P3& p3, const P4& p4) { |
| 997 return MakeInvokerStorageHolder( |
| 998 new internal::InvokerStorage4<Sig, P1, P2, P3, P4>( |
| 999 f, p1, p2, p3, p4)); |
| 1000 } |
| 1001 |
| 1002 template <typename Sig, typename P1, typename P2, typename P3, typename P4, |
| 1003 typename P5> |
| 1004 InvokerStorageHolder<internal::InvokerStorage5<Sig, P1, P2, P3, P4, P5> > |
| 1005 Prebind(Sig f, const P1& p1, const P2& p2, const P3& p3, const P4& p4, |
| 1006 const P5& p5) { |
| 1007 return MakeInvokerStorageHolder( |
| 1008 new internal::InvokerStorage5<Sig, P1, P2, P3, P4, P5>( |
| 1009 f, p1, p2, p3, p4, p5)); |
| 1010 } |
| 1011 |
| 1012 template <typename Sig, typename P1, typename P2, typename P3, typename P4, |
| 1013 typename P5, typename P6> |
| 1014 InvokerStorageHolder<internal::InvokerStorage6<Sig, P1, P2, P3, P4, P5, P6> > |
| 1015 Prebind(Sig f, const P1& p1, const P2& p2, const P3& p3, const P4& p4, |
| 1016 const P5& p5, const P6& p6) { |
| 1017 return MakeInvokerStorageHolder( |
| 1018 new internal::InvokerStorage6<Sig, P1, P2, P3, P4, P5, P6>( |
| 1019 f, p1, p2, p3, p4, p5, p6)); |
| 1020 } |
| 1021 |
| 1022 template <typename T> |
| 1023 inline internal::UnretainedWrapper<T> Unretained(T* o) { |
| 1024 return internal::UnretainedWrapper<T>(o); |
| 1025 } |
| 1026 |
| 1027 template <typename T> |
| 1028 inline internal::ConstRefWrapper<T> ConstRef(const T& o) { |
| 1029 return internal::ConstRefWrapper<T>(o); |
| 1030 } |
| 1031 |
| 1032 |
| 1033 } // namespace base |
| 1034 |
| 1035 #endif // BASE_PREBIND_H_ |
OLD | NEW |