Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // This file was GENERATED by command: | 1 // This file was GENERATED by command: |
| 2 // pump.py callback.h.pump | 2 // pump.py callback.h.pump |
| 3 // DO NOT EDIT BY HAND!!! | 3 // DO NOT EDIT BY HAND!!! |
| 4 | 4 |
| 5 | 5 |
| 6 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 6 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 7 // Use of this source code is governed by a BSD-style license that can be | 7 // Use of this source code is governed by a BSD-style license that can be |
| 8 // found in the LICENSE file. | 8 // found in the LICENSE file. |
| 9 | 9 |
| 10 #ifndef BASE_CALLBACK_H_ | 10 #ifndef BASE_CALLBACK_H_ |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 118 // HOW THE IMPLEMENTATION WORKS: | 118 // HOW THE IMPLEMENTATION WORKS: |
| 119 // | 119 // |
| 120 // There are three main components to the system: | 120 // There are three main components to the system: |
| 121 // 1) The Callback classes. | 121 // 1) The Callback classes. |
| 122 // 2) The Bind() functions. | 122 // 2) The Bind() functions. |
| 123 // 3) The arguments wrappers (eg., Unretained() and ConstRef()). | 123 // 3) The arguments wrappers (eg., Unretained() and ConstRef()). |
| 124 // | 124 // |
| 125 // The Callback classes represent a generic function pointer. Internally, | 125 // The Callback classes represent a generic function pointer. Internally, |
| 126 // it stores a refcounted piece of state that represents the target function | 126 // it stores a refcounted piece of state that represents the target function |
| 127 // and all its bound parameters. Each Callback specialization has a templated | 127 // and all its bound parameters. Each Callback specialization has a templated |
| 128 // constructor that takes an BindStateHolder<> object. In the context of | 128 // constructor that takes an BindState<>*. In the context of the constructor, |
| 129 // the constructor, the static type of this BindStateHolder<> object | 129 // the static type of this BindState<> pointer uniquely identifies the |
| 130 // uniquely identifies the function it is representing, all its bound | 130 // function it is representing, all its bound parameters, and a Run() method |
| 131 // parameters, and a DoInvoke() that is capable of invoking the target. | 131 // that is capable of invoking the target. |
| 132 // | 132 // |
| 133 // Callback's constructor is takes the BindStateHolder<> that has the | 133 // Callback's constructor takes the BindState<>* that has the full static type |
| 134 // full static type and erases the target function type, and the bound | 134 // and erases the target function type as well as the types of the bound |
| 135 // parameters. It does this by storing a pointer to the specific DoInvoke() | 135 // parameters. It does this by storing a pointer to the specific Run() |
| 136 // function, and upcasting the state of BindStateHolder<> to a | 136 // function, and upcasting the state of BindState<>* to a |
| 137 // BindStateBase. This is safe as long as this BindStateBase pointer | 137 // BindStateBase*. This is safe as long as this BindStateBase pointer |
| 138 // is only used with the stored DoInvoke() pointer. | 138 // is only used with the stored Run() pointer. |
| 139 // | 139 // |
| 140 // To create BindStateHolder<> objects, we use the Bind() functions. | 140 // To BindState<> objects are created inside the Bind() functions. |
| 141 // These functions, along with a set of internal templates, are reponsible for | 141 // These functions, along with a set of internal templates, are reponsible for |
|
akalin
2011/12/02 18:54:45
reponsible -> responsible
awong
2011/12/06 00:21:12
Done.
| |
| 142 // | 142 // |
| 143 // - Unwrapping the function signature into return type, and parameters | 143 // - Unwrapping the function signature into return type, and parameters |
| 144 // - Determining the number of parameters that are bound | 144 // - Determining the number of parameters that are bound |
| 145 // - Creating the storage for the bound parameters | 145 // - Creating the BindState storing the bound parameters |
| 146 // - Performing compile-time asserts to avoid error-prone behavior | 146 // - Performing compile-time asserts to avoid error-prone behavior |
| 147 // - Returning an BindStateHolder<> with an DoInvoke() that has an arity | 147 // - Returning an Callback<> with an arity matching the number of unbound |
| 148 // matching the number of unbound parameters, and knows the correct | 148 // parameters and that knows the correct refcounting semantics for the |
| 149 // refcounting semantics for the target object if we are binding a class | 149 // target object if we are binding a method. |
| 150 // method. | |
| 151 // | 150 // |
| 152 // The Bind functions do the above using type-inference, and template | 151 // The Bind functions do the above using type-inference, and template |
| 153 // specializations. | 152 // specializations. |
| 154 // | 153 // |
| 155 // By default Bind() will store copies of all bound parameters, and attempt | 154 // By default Bind() will store copies of all bound parameters, and attempt |
| 156 // to refcount a target object if the function being bound is a class method. | 155 // to refcount a target object if the function being bound is a class method. |
| 157 // | 156 // |
| 158 // To change this behavior, we introduce a set of argument wrappers | 157 // To change this behavior, we introduce a set of argument wrappers |
| 159 // (eg. Unretained(), and ConstRef()). These are simple container templates | 158 // (eg. Unretained(), and ConstRef()). These are simple container templates |
| 160 // that are passed by value, and wrap a pointer to argument. See the | 159 // that are passed by value, and wrap a pointer to argument. See the |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 225 // First, we forward declare the Callback class template. This informs the | 224 // First, we forward declare the Callback class template. This informs the |
| 226 // compiler that the template only has 1 type parameter which is the function | 225 // compiler that the template only has 1 type parameter which is the function |
| 227 // signature that the Callback is representing. | 226 // signature that the Callback is representing. |
| 228 // | 227 // |
| 229 // After this, create template specializations for 0-7 parameters. Note that | 228 // After this, create template specializations for 0-7 parameters. Note that |
| 230 // even though the template typelist grows, the specialization still | 229 // even though the template typelist grows, the specialization still |
| 231 // only has one type: the function signature. | 230 // only has one type: the function signature. |
| 232 template <typename Sig> | 231 template <typename Sig> |
| 233 class Callback; | 232 class Callback; |
| 234 | 233 |
| 234 namespace internal { | |
| 235 template <typename Runnable, typename RunType, typename BoundArgsType> | |
| 236 struct BindState; | |
| 237 } // namespace internal | |
| 235 template <typename R> | 238 template <typename R> |
| 236 class Callback<R(void)> : public internal::CallbackBase { | 239 class Callback<R(void)> : public internal::CallbackBase { |
| 237 public: | 240 public: |
| 238 typedef R(RunType)(); | 241 typedef R(RunType)(); |
| 239 | 242 |
| 240 Callback() : CallbackBase(NULL, NULL) { } | 243 Callback() : CallbackBase(NULL) { } |
| 241 | 244 |
| 242 // We pass BindStateHolder by const ref to avoid incurring an | |
| 243 // unnecessary AddRef/Unref pair even though we will modify the object. | |
| 244 // We cannot use a normal reference because the compiler will warn | |
| 245 // since this is often used on a return value, which is a temporary. | |
| 246 // | |
| 247 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | 245 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT |
| 248 // return the exact Callback<> type. See base/bind.h for details. | 246 // return the exact Callback<> type. See base/bind.h for details. |
| 249 template <typename T> | 247 template <typename Runnable, typename RunType, typename BoundArgsType> |
| 250 Callback(const internal::BindStateHolder<T>& bind_state_holder) | 248 Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state) |
| 251 : CallbackBase(NULL, &bind_state_holder.bind_state_) { | 249 : CallbackBase(bind_state) { |
| 252 // Force the assignment to a location variable of PolymorphicInvoke | 250 |
| 251 // Force the assignment to a local variable of PolymorphicInvoke | |
| 253 // so the compiler will typecheck that the passed in Run() method has | 252 // so the compiler will typecheck that the passed in Run() method has |
| 254 // the correct type. | 253 // the correct type. |
| 255 PolymorphicInvoke invoke_func = &T::InvokerType::Run; | 254 PolymorphicInvoke invoke_func = |
| 255 &internal::BindState<Runnable, RunType, BoundArgsType> | |
| 256 ::InvokerType::Run; | |
| 256 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | 257 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); |
| 257 } | 258 } |
| 258 | 259 |
| 259 bool Equals(const Callback& other) const { | 260 bool Equals(const Callback& other) const { |
| 260 return CallbackBase::Equals(other); | 261 return CallbackBase::Equals(other); |
| 261 } | 262 } |
| 262 | 263 |
| 263 R Run() const { | 264 R Run() const { |
| 264 PolymorphicInvoke f = | 265 PolymorphicInvoke f = |
| 265 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); | 266 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); |
| 266 | 267 |
| 267 return f(bind_state_.get()); | 268 return f(bind_state_.get()); |
| 268 } | 269 } |
| 269 | 270 |
| 270 private: | 271 private: |
| 271 typedef R(*PolymorphicInvoke)( | 272 typedef R(*PolymorphicInvoke)( |
| 272 internal::BindStateBase*); | 273 internal::BindStateBase*); |
| 273 | 274 |
| 274 }; | 275 }; |
| 275 | 276 |
| 276 template <typename R, typename A1> | 277 template <typename R, typename A1> |
| 277 class Callback<R(A1)> : public internal::CallbackBase { | 278 class Callback<R(A1)> : public internal::CallbackBase { |
| 278 public: | 279 public: |
| 279 typedef R(RunType)(A1); | 280 typedef R(RunType)(A1); |
| 280 | 281 |
| 281 Callback() : CallbackBase(NULL, NULL) { } | 282 Callback() : CallbackBase(NULL) { } |
| 282 | 283 |
| 283 // We pass BindStateHolder by const ref to avoid incurring an | |
| 284 // unnecessary AddRef/Unref pair even though we will modify the object. | |
| 285 // We cannot use a normal reference because the compiler will warn | |
| 286 // since this is often used on a return value, which is a temporary. | |
| 287 // | |
| 288 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | 284 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT |
| 289 // return the exact Callback<> type. See base/bind.h for details. | 285 // return the exact Callback<> type. See base/bind.h for details. |
| 290 template <typename T> | 286 template <typename Runnable, typename RunType, typename BoundArgsType> |
| 291 Callback(const internal::BindStateHolder<T>& bind_state_holder) | 287 Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state) |
| 292 : CallbackBase(NULL, &bind_state_holder.bind_state_) { | 288 : CallbackBase(bind_state) { |
| 293 // Force the assignment to a location variable of PolymorphicInvoke | 289 |
| 290 // Force the assignment to a local variable of PolymorphicInvoke | |
| 294 // so the compiler will typecheck that the passed in Run() method has | 291 // so the compiler will typecheck that the passed in Run() method has |
| 295 // the correct type. | 292 // the correct type. |
| 296 PolymorphicInvoke invoke_func = &T::InvokerType::Run; | 293 PolymorphicInvoke invoke_func = |
| 294 &internal::BindState<Runnable, RunType, BoundArgsType> | |
| 295 ::InvokerType::Run; | |
| 297 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | 296 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); |
| 298 } | 297 } |
| 299 | 298 |
| 300 bool Equals(const Callback& other) const { | 299 bool Equals(const Callback& other) const { |
| 301 return CallbackBase::Equals(other); | 300 return CallbackBase::Equals(other); |
| 302 } | 301 } |
| 303 | 302 |
| 304 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1) const { | 303 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1) const { |
| 305 PolymorphicInvoke f = | 304 PolymorphicInvoke f = |
| 306 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); | 305 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); |
| 307 | 306 |
| 308 return f(bind_state_.get(), a1); | 307 return f(bind_state_.get(), a1); |
| 309 } | 308 } |
| 310 | 309 |
| 311 private: | 310 private: |
| 312 typedef R(*PolymorphicInvoke)( | 311 typedef R(*PolymorphicInvoke)( |
| 313 internal::BindStateBase*, | 312 internal::BindStateBase*, |
| 314 typename internal::CallbackParamTraits<A1>::ForwardType); | 313 typename internal::CallbackParamTraits<A1>::ForwardType); |
| 315 | 314 |
| 316 }; | 315 }; |
| 317 | 316 |
| 318 template <typename R, typename A1, typename A2> | 317 template <typename R, typename A1, typename A2> |
| 319 class Callback<R(A1, A2)> : public internal::CallbackBase { | 318 class Callback<R(A1, A2)> : public internal::CallbackBase { |
| 320 public: | 319 public: |
| 321 typedef R(RunType)(A1, A2); | 320 typedef R(RunType)(A1, A2); |
| 322 | 321 |
| 323 Callback() : CallbackBase(NULL, NULL) { } | 322 Callback() : CallbackBase(NULL) { } |
| 324 | 323 |
| 325 // We pass BindStateHolder by const ref to avoid incurring an | |
| 326 // unnecessary AddRef/Unref pair even though we will modify the object. | |
| 327 // We cannot use a normal reference because the compiler will warn | |
| 328 // since this is often used on a return value, which is a temporary. | |
| 329 // | |
| 330 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | 324 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT |
| 331 // return the exact Callback<> type. See base/bind.h for details. | 325 // return the exact Callback<> type. See base/bind.h for details. |
| 332 template <typename T> | 326 template <typename Runnable, typename RunType, typename BoundArgsType> |
| 333 Callback(const internal::BindStateHolder<T>& bind_state_holder) | 327 Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state) |
| 334 : CallbackBase(NULL, &bind_state_holder.bind_state_) { | 328 : CallbackBase(bind_state) { |
| 335 // Force the assignment to a location variable of PolymorphicInvoke | 329 |
| 330 // Force the assignment to a local variable of PolymorphicInvoke | |
| 336 // so the compiler will typecheck that the passed in Run() method has | 331 // so the compiler will typecheck that the passed in Run() method has |
| 337 // the correct type. | 332 // the correct type. |
| 338 PolymorphicInvoke invoke_func = &T::InvokerType::Run; | 333 PolymorphicInvoke invoke_func = |
| 334 &internal::BindState<Runnable, RunType, BoundArgsType> | |
| 335 ::InvokerType::Run; | |
| 339 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | 336 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); |
| 340 } | 337 } |
| 341 | 338 |
| 342 bool Equals(const Callback& other) const { | 339 bool Equals(const Callback& other) const { |
| 343 return CallbackBase::Equals(other); | 340 return CallbackBase::Equals(other); |
| 344 } | 341 } |
| 345 | 342 |
| 346 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, | 343 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, |
| 347 typename internal::CallbackParamTraits<A2>::ForwardType a2) const { | 344 typename internal::CallbackParamTraits<A2>::ForwardType a2) const { |
| 348 PolymorphicInvoke f = | 345 PolymorphicInvoke f = |
| 349 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); | 346 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); |
| 350 | 347 |
| 351 return f(bind_state_.get(), a1, | 348 return f(bind_state_.get(), a1, |
| 352 a2); | 349 a2); |
| 353 } | 350 } |
| 354 | 351 |
| 355 private: | 352 private: |
| 356 typedef R(*PolymorphicInvoke)( | 353 typedef R(*PolymorphicInvoke)( |
| 357 internal::BindStateBase*, | 354 internal::BindStateBase*, |
| 358 typename internal::CallbackParamTraits<A1>::ForwardType, | 355 typename internal::CallbackParamTraits<A1>::ForwardType, |
| 359 typename internal::CallbackParamTraits<A2>::ForwardType); | 356 typename internal::CallbackParamTraits<A2>::ForwardType); |
| 360 | 357 |
| 361 }; | 358 }; |
| 362 | 359 |
| 363 template <typename R, typename A1, typename A2, typename A3> | 360 template <typename R, typename A1, typename A2, typename A3> |
| 364 class Callback<R(A1, A2, A3)> : public internal::CallbackBase { | 361 class Callback<R(A1, A2, A3)> : public internal::CallbackBase { |
| 365 public: | 362 public: |
| 366 typedef R(RunType)(A1, A2, A3); | 363 typedef R(RunType)(A1, A2, A3); |
| 367 | 364 |
| 368 Callback() : CallbackBase(NULL, NULL) { } | 365 Callback() : CallbackBase(NULL) { } |
| 369 | 366 |
| 370 // We pass BindStateHolder by const ref to avoid incurring an | |
| 371 // unnecessary AddRef/Unref pair even though we will modify the object. | |
| 372 // We cannot use a normal reference because the compiler will warn | |
| 373 // since this is often used on a return value, which is a temporary. | |
| 374 // | |
| 375 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | 367 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT |
| 376 // return the exact Callback<> type. See base/bind.h for details. | 368 // return the exact Callback<> type. See base/bind.h for details. |
| 377 template <typename T> | 369 template <typename Runnable, typename RunType, typename BoundArgsType> |
| 378 Callback(const internal::BindStateHolder<T>& bind_state_holder) | 370 Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state) |
| 379 : CallbackBase(NULL, &bind_state_holder.bind_state_) { | 371 : CallbackBase(bind_state) { |
| 380 // Force the assignment to a location variable of PolymorphicInvoke | 372 |
| 373 // Force the assignment to a local variable of PolymorphicInvoke | |
| 381 // so the compiler will typecheck that the passed in Run() method has | 374 // so the compiler will typecheck that the passed in Run() method has |
| 382 // the correct type. | 375 // the correct type. |
| 383 PolymorphicInvoke invoke_func = &T::InvokerType::Run; | 376 PolymorphicInvoke invoke_func = |
| 377 &internal::BindState<Runnable, RunType, BoundArgsType> | |
| 378 ::InvokerType::Run; | |
| 384 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | 379 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); |
| 385 } | 380 } |
| 386 | 381 |
| 387 bool Equals(const Callback& other) const { | 382 bool Equals(const Callback& other) const { |
| 388 return CallbackBase::Equals(other); | 383 return CallbackBase::Equals(other); |
| 389 } | 384 } |
| 390 | 385 |
| 391 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, | 386 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, |
| 392 typename internal::CallbackParamTraits<A2>::ForwardType a2, | 387 typename internal::CallbackParamTraits<A2>::ForwardType a2, |
| 393 typename internal::CallbackParamTraits<A3>::ForwardType a3) const { | 388 typename internal::CallbackParamTraits<A3>::ForwardType a3) const { |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 406 typename internal::CallbackParamTraits<A2>::ForwardType, | 401 typename internal::CallbackParamTraits<A2>::ForwardType, |
| 407 typename internal::CallbackParamTraits<A3>::ForwardType); | 402 typename internal::CallbackParamTraits<A3>::ForwardType); |
| 408 | 403 |
| 409 }; | 404 }; |
| 410 | 405 |
| 411 template <typename R, typename A1, typename A2, typename A3, typename A4> | 406 template <typename R, typename A1, typename A2, typename A3, typename A4> |
| 412 class Callback<R(A1, A2, A3, A4)> : public internal::CallbackBase { | 407 class Callback<R(A1, A2, A3, A4)> : public internal::CallbackBase { |
| 413 public: | 408 public: |
| 414 typedef R(RunType)(A1, A2, A3, A4); | 409 typedef R(RunType)(A1, A2, A3, A4); |
| 415 | 410 |
| 416 Callback() : CallbackBase(NULL, NULL) { } | 411 Callback() : CallbackBase(NULL) { } |
| 417 | 412 |
| 418 // We pass BindStateHolder by const ref to avoid incurring an | |
| 419 // unnecessary AddRef/Unref pair even though we will modify the object. | |
| 420 // We cannot use a normal reference because the compiler will warn | |
| 421 // since this is often used on a return value, which is a temporary. | |
| 422 // | |
| 423 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | 413 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT |
| 424 // return the exact Callback<> type. See base/bind.h for details. | 414 // return the exact Callback<> type. See base/bind.h for details. |
| 425 template <typename T> | 415 template <typename Runnable, typename RunType, typename BoundArgsType> |
| 426 Callback(const internal::BindStateHolder<T>& bind_state_holder) | 416 Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state) |
| 427 : CallbackBase(NULL, &bind_state_holder.bind_state_) { | 417 : CallbackBase(bind_state) { |
| 428 // Force the assignment to a location variable of PolymorphicInvoke | 418 |
| 419 // Force the assignment to a local variable of PolymorphicInvoke | |
| 429 // so the compiler will typecheck that the passed in Run() method has | 420 // so the compiler will typecheck that the passed in Run() method has |
| 430 // the correct type. | 421 // the correct type. |
| 431 PolymorphicInvoke invoke_func = &T::InvokerType::Run; | 422 PolymorphicInvoke invoke_func = |
| 423 &internal::BindState<Runnable, RunType, BoundArgsType> | |
| 424 ::InvokerType::Run; | |
| 432 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | 425 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); |
| 433 } | 426 } |
| 434 | 427 |
| 435 bool Equals(const Callback& other) const { | 428 bool Equals(const Callback& other) const { |
| 436 return CallbackBase::Equals(other); | 429 return CallbackBase::Equals(other); |
| 437 } | 430 } |
| 438 | 431 |
| 439 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, | 432 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, |
| 440 typename internal::CallbackParamTraits<A2>::ForwardType a2, | 433 typename internal::CallbackParamTraits<A2>::ForwardType a2, |
| 441 typename internal::CallbackParamTraits<A3>::ForwardType a3, | 434 typename internal::CallbackParamTraits<A3>::ForwardType a3, |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 458 typename internal::CallbackParamTraits<A4>::ForwardType); | 451 typename internal::CallbackParamTraits<A4>::ForwardType); |
| 459 | 452 |
| 460 }; | 453 }; |
| 461 | 454 |
| 462 template <typename R, typename A1, typename A2, typename A3, typename A4, | 455 template <typename R, typename A1, typename A2, typename A3, typename A4, |
| 463 typename A5> | 456 typename A5> |
| 464 class Callback<R(A1, A2, A3, A4, A5)> : public internal::CallbackBase { | 457 class Callback<R(A1, A2, A3, A4, A5)> : public internal::CallbackBase { |
| 465 public: | 458 public: |
| 466 typedef R(RunType)(A1, A2, A3, A4, A5); | 459 typedef R(RunType)(A1, A2, A3, A4, A5); |
| 467 | 460 |
| 468 Callback() : CallbackBase(NULL, NULL) { } | 461 Callback() : CallbackBase(NULL) { } |
| 469 | 462 |
| 470 // We pass BindStateHolder by const ref to avoid incurring an | |
| 471 // unnecessary AddRef/Unref pair even though we will modify the object. | |
| 472 // We cannot use a normal reference because the compiler will warn | |
| 473 // since this is often used on a return value, which is a temporary. | |
| 474 // | |
| 475 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | 463 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT |
| 476 // return the exact Callback<> type. See base/bind.h for details. | 464 // return the exact Callback<> type. See base/bind.h for details. |
| 477 template <typename T> | 465 template <typename Runnable, typename RunType, typename BoundArgsType> |
| 478 Callback(const internal::BindStateHolder<T>& bind_state_holder) | 466 Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state) |
| 479 : CallbackBase(NULL, &bind_state_holder.bind_state_) { | 467 : CallbackBase(bind_state) { |
| 480 // Force the assignment to a location variable of PolymorphicInvoke | 468 |
| 469 // Force the assignment to a local variable of PolymorphicInvoke | |
| 481 // so the compiler will typecheck that the passed in Run() method has | 470 // so the compiler will typecheck that the passed in Run() method has |
| 482 // the correct type. | 471 // the correct type. |
| 483 PolymorphicInvoke invoke_func = &T::InvokerType::Run; | 472 PolymorphicInvoke invoke_func = |
| 473 &internal::BindState<Runnable, RunType, BoundArgsType> | |
| 474 ::InvokerType::Run; | |
| 484 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | 475 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); |
| 485 } | 476 } |
| 486 | 477 |
| 487 bool Equals(const Callback& other) const { | 478 bool Equals(const Callback& other) const { |
| 488 return CallbackBase::Equals(other); | 479 return CallbackBase::Equals(other); |
| 489 } | 480 } |
| 490 | 481 |
| 491 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, | 482 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, |
| 492 typename internal::CallbackParamTraits<A2>::ForwardType a2, | 483 typename internal::CallbackParamTraits<A2>::ForwardType a2, |
| 493 typename internal::CallbackParamTraits<A3>::ForwardType a3, | 484 typename internal::CallbackParamTraits<A3>::ForwardType a3, |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 513 typename internal::CallbackParamTraits<A5>::ForwardType); | 504 typename internal::CallbackParamTraits<A5>::ForwardType); |
| 514 | 505 |
| 515 }; | 506 }; |
| 516 | 507 |
| 517 template <typename R, typename A1, typename A2, typename A3, typename A4, | 508 template <typename R, typename A1, typename A2, typename A3, typename A4, |
| 518 typename A5, typename A6> | 509 typename A5, typename A6> |
| 519 class Callback<R(A1, A2, A3, A4, A5, A6)> : public internal::CallbackBase { | 510 class Callback<R(A1, A2, A3, A4, A5, A6)> : public internal::CallbackBase { |
| 520 public: | 511 public: |
| 521 typedef R(RunType)(A1, A2, A3, A4, A5, A6); | 512 typedef R(RunType)(A1, A2, A3, A4, A5, A6); |
| 522 | 513 |
| 523 Callback() : CallbackBase(NULL, NULL) { } | 514 Callback() : CallbackBase(NULL) { } |
| 524 | 515 |
| 525 // We pass BindStateHolder by const ref to avoid incurring an | |
| 526 // unnecessary AddRef/Unref pair even though we will modify the object. | |
| 527 // We cannot use a normal reference because the compiler will warn | |
| 528 // since this is often used on a return value, which is a temporary. | |
| 529 // | |
| 530 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | 516 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT |
| 531 // return the exact Callback<> type. See base/bind.h for details. | 517 // return the exact Callback<> type. See base/bind.h for details. |
| 532 template <typename T> | 518 template <typename Runnable, typename RunType, typename BoundArgsType> |
| 533 Callback(const internal::BindStateHolder<T>& bind_state_holder) | 519 Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state) |
| 534 : CallbackBase(NULL, &bind_state_holder.bind_state_) { | 520 : CallbackBase(bind_state) { |
| 535 // Force the assignment to a location variable of PolymorphicInvoke | 521 |
| 522 // Force the assignment to a local variable of PolymorphicInvoke | |
| 536 // so the compiler will typecheck that the passed in Run() method has | 523 // so the compiler will typecheck that the passed in Run() method has |
| 537 // the correct type. | 524 // the correct type. |
| 538 PolymorphicInvoke invoke_func = &T::InvokerType::Run; | 525 PolymorphicInvoke invoke_func = |
| 526 &internal::BindState<Runnable, RunType, BoundArgsType> | |
| 527 ::InvokerType::Run; | |
| 539 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | 528 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); |
| 540 } | 529 } |
| 541 | 530 |
| 542 bool Equals(const Callback& other) const { | 531 bool Equals(const Callback& other) const { |
| 543 return CallbackBase::Equals(other); | 532 return CallbackBase::Equals(other); |
| 544 } | 533 } |
| 545 | 534 |
| 546 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, | 535 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, |
| 547 typename internal::CallbackParamTraits<A2>::ForwardType a2, | 536 typename internal::CallbackParamTraits<A2>::ForwardType a2, |
| 548 typename internal::CallbackParamTraits<A3>::ForwardType a3, | 537 typename internal::CallbackParamTraits<A3>::ForwardType a3, |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 571 typename internal::CallbackParamTraits<A6>::ForwardType); | 560 typename internal::CallbackParamTraits<A6>::ForwardType); |
| 572 | 561 |
| 573 }; | 562 }; |
| 574 | 563 |
| 575 template <typename R, typename A1, typename A2, typename A3, typename A4, | 564 template <typename R, typename A1, typename A2, typename A3, typename A4, |
| 576 typename A5, typename A6, typename A7> | 565 typename A5, typename A6, typename A7> |
| 577 class Callback<R(A1, A2, A3, A4, A5, A6, A7)> : public internal::CallbackBase { | 566 class Callback<R(A1, A2, A3, A4, A5, A6, A7)> : public internal::CallbackBase { |
| 578 public: | 567 public: |
| 579 typedef R(RunType)(A1, A2, A3, A4, A5, A6, A7); | 568 typedef R(RunType)(A1, A2, A3, A4, A5, A6, A7); |
| 580 | 569 |
| 581 Callback() : CallbackBase(NULL, NULL) { } | 570 Callback() : CallbackBase(NULL) { } |
| 582 | 571 |
| 583 // We pass BindStateHolder by const ref to avoid incurring an | |
| 584 // unnecessary AddRef/Unref pair even though we will modify the object. | |
| 585 // We cannot use a normal reference because the compiler will warn | |
| 586 // since this is often used on a return value, which is a temporary. | |
| 587 // | |
| 588 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT | 572 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT |
| 589 // return the exact Callback<> type. See base/bind.h for details. | 573 // return the exact Callback<> type. See base/bind.h for details. |
| 590 template <typename T> | 574 template <typename Runnable, typename RunType, typename BoundArgsType> |
| 591 Callback(const internal::BindStateHolder<T>& bind_state_holder) | 575 Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state) |
| 592 : CallbackBase(NULL, &bind_state_holder.bind_state_) { | 576 : CallbackBase(bind_state) { |
| 593 // Force the assignment to a location variable of PolymorphicInvoke | 577 |
| 578 // Force the assignment to a local variable of PolymorphicInvoke | |
| 594 // so the compiler will typecheck that the passed in Run() method has | 579 // so the compiler will typecheck that the passed in Run() method has |
| 595 // the correct type. | 580 // the correct type. |
| 596 PolymorphicInvoke invoke_func = &T::InvokerType::Run; | 581 PolymorphicInvoke invoke_func = |
| 582 &internal::BindState<Runnable, RunType, BoundArgsType> | |
| 583 ::InvokerType::Run; | |
| 597 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); | 584 polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); |
| 598 } | 585 } |
| 599 | 586 |
| 600 bool Equals(const Callback& other) const { | 587 bool Equals(const Callback& other) const { |
| 601 return CallbackBase::Equals(other); | 588 return CallbackBase::Equals(other); |
| 602 } | 589 } |
| 603 | 590 |
| 604 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, | 591 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, |
| 605 typename internal::CallbackParamTraits<A2>::ForwardType a2, | 592 typename internal::CallbackParamTraits<A2>::ForwardType a2, |
| 606 typename internal::CallbackParamTraits<A3>::ForwardType a3, | 593 typename internal::CallbackParamTraits<A3>::ForwardType a3, |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 634 }; | 621 }; |
| 635 | 622 |
| 636 | 623 |
| 637 // Syntactic sugar to make Callbacks<void(void)> easier to declare since it | 624 // Syntactic sugar to make Callbacks<void(void)> easier to declare since it |
| 638 // will be used in a lot of APIs with delayed execution. | 625 // will be used in a lot of APIs with delayed execution. |
| 639 typedef Callback<void(void)> Closure; | 626 typedef Callback<void(void)> Closure; |
| 640 | 627 |
| 641 } // namespace base | 628 } // namespace base |
| 642 | 629 |
| 643 #endif // BASE_CALLBACK_H | 630 #endif // BASE_CALLBACK_H |
| OLD | NEW |