| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // This defines a set of argument wrappers and related factory methods that | 5 // This defines a set of argument wrappers and related factory methods that |
| 6 // can be used specify the refcounting and reference semantics of arguments | 6 // can be used specify the refcounting and reference semantics of arguments |
| 7 // that are bound by the Bind() function in base/bind.h. | 7 // that are bound by the Bind() function in base/bind.h. |
| 8 // | 8 // |
| 9 // It also defines a set of simple functions and utilities that people want | 9 // It also defines a set of simple functions and utilities that people want |
| 10 // when using Callback<> and Bind(). | 10 // when using Callback<> and Bind(). |
| (...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 return o.Take(); | 455 return o.Take(); |
| 456 } | 456 } |
| 457 | 457 |
| 458 // IsWeakMethod is a helper that determine if we are binding a WeakPtr<> to a | 458 // IsWeakMethod is a helper that determine if we are binding a WeakPtr<> to a |
| 459 // method. It is used internally by Bind() to select the correct | 459 // method. It is used internally by Bind() to select the correct |
| 460 // InvokeHelper that will no-op itself in the event the WeakPtr<> for | 460 // InvokeHelper that will no-op itself in the event the WeakPtr<> for |
| 461 // the target object is invalidated. | 461 // the target object is invalidated. |
| 462 // | 462 // |
| 463 // The first argument should be the type of the object that will be received by | 463 // The first argument should be the type of the object that will be received by |
| 464 // the method. | 464 // the method. |
| 465 template <bool IsMethod, typename... Args> | 465 template <bool is_method, typename... Args> |
| 466 struct IsWeakMethod : std::false_type {}; | 466 struct IsWeakMethod : std::false_type {}; |
| 467 | 467 |
| 468 template <typename T, typename... Args> | 468 template <typename T, typename... Args> |
| 469 struct IsWeakMethod<true, T, Args...> : IsWeakReceiver<T> {}; | 469 struct IsWeakMethod<true, T, Args...> : IsWeakReceiver<T> {}; |
| 470 | 470 |
| 471 // Packs a list of types to hold them in a single type. | 471 // Packs a list of types to hold them in a single type. |
| 472 template <typename... Types> | 472 template <typename... Types> |
| 473 struct TypeList {}; | 473 struct TypeList {}; |
| 474 | 474 |
| 475 // Used for DropTypeListItem implementation. | 475 // Used for DropTypeListItem implementation. |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 // MSVC 2013 doesn't support Type Alias of function types. | 542 // MSVC 2013 doesn't support Type Alias of function types. |
| 543 // Revisit this after we update it to newer version. | 543 // Revisit this after we update it to newer version. |
| 544 typedef R Type(Args...); | 544 typedef R Type(Args...); |
| 545 }; | 545 }; |
| 546 | 546 |
| 547 // A type-level function that constructs a function type that has |R| as its | 547 // A type-level function that constructs a function type that has |R| as its |
| 548 // return type and has TypeLists items as its arguments. | 548 // return type and has TypeLists items as its arguments. |
| 549 template <typename R, typename ArgList> | 549 template <typename R, typename ArgList> |
| 550 using MakeFunctionType = typename MakeFunctionTypeImpl<R, ArgList>::Type; | 550 using MakeFunctionType = typename MakeFunctionTypeImpl<R, ArgList>::Type; |
| 551 | 551 |
| 552 // Used for ExtractArgs. | 552 // Used for ExtractArgs and ExtractReturnType. |
| 553 template <typename Signature> | 553 template <typename Signature> |
| 554 struct ExtractArgsImpl; | 554 struct ExtractArgsImpl; |
| 555 | 555 |
| 556 template <typename R, typename... Args> | 556 template <typename R, typename... Args> |
| 557 struct ExtractArgsImpl<R(Args...)> { | 557 struct ExtractArgsImpl<R(Args...)> { |
| 558 using Type = TypeList<Args...>; | 558 using ReturnType = R; |
| 559 using ArgsList = TypeList<Args...>; |
| 559 }; | 560 }; |
| 560 | 561 |
| 561 // A type-level function that extracts function arguments into a TypeList. | 562 // A type-level function that extracts function arguments into a TypeList. |
| 562 // E.g. ExtractArgs<R(A, B, C)> is evaluated to TypeList<A, B, C>. | 563 // E.g. ExtractArgs<R(A, B, C)> is evaluated to TypeList<A, B, C>. |
| 563 template <typename Signature> | 564 template <typename Signature> |
| 564 using ExtractArgs = typename ExtractArgsImpl<Signature>::Type; | 565 using ExtractArgs = typename ExtractArgsImpl<Signature>::ArgsList; |
| 566 |
| 567 // A type-level function that extracts the return type of a function. |
| 568 // E.g. ExtractReturnType<R(A, B, C)> is evaluated to R. |
| 569 template <typename Signature> |
| 570 using ExtractReturnType = typename ExtractArgsImpl<Signature>::ReturnType; |
| 565 | 571 |
| 566 } // namespace internal | 572 } // namespace internal |
| 567 | 573 |
| 568 template <typename T> | 574 template <typename T> |
| 569 static inline internal::UnretainedWrapper<T> Unretained(T* o) { | 575 static inline internal::UnretainedWrapper<T> Unretained(T* o) { |
| 570 return internal::UnretainedWrapper<T>(o); | 576 return internal::UnretainedWrapper<T>(o); |
| 571 } | 577 } |
| 572 | 578 |
| 573 template <typename T> | 579 template <typename T> |
| 574 static inline internal::RetainedRefWrapper<T> RetainedRef(T* o) { | 580 static inline internal::RetainedRefWrapper<T> RetainedRef(T* o) { |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 | 648 |
| 643 template <typename T> | 649 template <typename T> |
| 644 struct IsWeakReceiver<internal::ConstRefWrapper<T>> : IsWeakReceiver<T> {}; | 650 struct IsWeakReceiver<internal::ConstRefWrapper<T>> : IsWeakReceiver<T> {}; |
| 645 | 651 |
| 646 template <typename T> | 652 template <typename T> |
| 647 struct IsWeakReceiver<WeakPtr<T>> : std::true_type {}; | 653 struct IsWeakReceiver<WeakPtr<T>> : std::true_type {}; |
| 648 | 654 |
| 649 } // namespace base | 655 } // namespace base |
| 650 | 656 |
| 651 #endif // BASE_BIND_HELPERS_H_ | 657 #endif // BASE_BIND_HELPERS_H_ |
| OLD | NEW |