| Index: base/bind_helpers.h
|
| diff --git a/base/bind_helpers.h b/base/bind_helpers.h
|
| index 93d02e37a997cc81e776ffdce26f9107a5b1a7f0..c7c7be8ee840a7b52206787fa8f717dcc4de4e30 100644
|
| --- a/base/bind_helpers.h
|
| +++ b/base/bind_helpers.h
|
| @@ -174,6 +174,9 @@ namespace base {
|
| template <typename T>
|
| struct IsWeakReceiver;
|
|
|
| +template <typename>
|
| +struct BindUnwrapTraits;
|
| +
|
| namespace internal {
|
|
|
| template <typename T>
|
| @@ -275,35 +278,12 @@ class PassedWrapper {
|
| mutable T scoper_;
|
| };
|
|
|
| -// Unwrap the stored parameters for the wrappers above.
|
| -template <typename T>
|
| -T&& Unwrap(T&& o) {
|
| - return std::forward<T>(o);
|
| -}
|
| -
|
| -template <typename T>
|
| -T* Unwrap(const UnretainedWrapper<T>& unretained) {
|
| - return unretained.get();
|
| -}
|
| -
|
| -template <typename T>
|
| -const T& Unwrap(const ConstRefWrapper<T>& const_ref) {
|
| - return const_ref.get();
|
| -}
|
| -
|
| template <typename T>
|
| -T* Unwrap(const RetainedRefWrapper<T>& o) {
|
| - return o.get();
|
| -}
|
| -
|
| -template <typename T>
|
| -T* Unwrap(const OwnedWrapper<T>& o) {
|
| - return o.get();
|
| -}
|
| +using Unwrapper = BindUnwrapTraits<typename std::decay<T>::type>;
|
|
|
| template <typename T>
|
| -T Unwrap(const PassedWrapper<T>& o) {
|
| - return o.Take();
|
| +auto Unwrap(T&& o) -> decltype(Unwrapper<T>::Unwrap(std::forward<T>(o))) {
|
| + return Unwrapper<T>::Unwrap(std::forward<T>(o));
|
| }
|
|
|
| // IsWeakMethod is a helper that determine if we are binding a WeakPtr<> to a
|
| @@ -497,6 +477,50 @@ struct IsWeakReceiver<internal::ConstRefWrapper<T>> : IsWeakReceiver<T> {};
|
| template <typename T>
|
| struct IsWeakReceiver<WeakPtr<T>> : std::true_type {};
|
|
|
| +// An injection point to control how bound objects passed to the target
|
| +// function. BindUnwrapTraits<>::Unwrap() is called for each bound objects right
|
| +// before the target function is invoked.
|
| +template <typename>
|
| +struct BindUnwrapTraits {
|
| + template <typename T>
|
| + static T&& Unwrap(T&& o) { return std::forward<T>(o); }
|
| +};
|
| +
|
| +template <typename T>
|
| +struct BindUnwrapTraits<internal::UnretainedWrapper<T>> {
|
| + static T* Unwrap(const internal::UnretainedWrapper<T>& o) {
|
| + return o.get();
|
| + }
|
| +};
|
| +
|
| +template <typename T>
|
| +struct BindUnwrapTraits<internal::ConstRefWrapper<T>> {
|
| + static const T& Unwrap(const internal::ConstRefWrapper<T>& o) {
|
| + return o.get();
|
| + }
|
| +};
|
| +
|
| +template <typename T>
|
| +struct BindUnwrapTraits<internal::RetainedRefWrapper<T>> {
|
| + static T* Unwrap(const internal::RetainedRefWrapper<T>& o) {
|
| + return o.get();
|
| + }
|
| +};
|
| +
|
| +template <typename T>
|
| +struct BindUnwrapTraits<internal::OwnedWrapper<T>> {
|
| + static T* Unwrap(const internal::OwnedWrapper<T>& o) {
|
| + return o.get();
|
| + }
|
| +};
|
| +
|
| +template <typename T>
|
| +struct BindUnwrapTraits<internal::PassedWrapper<T>> {
|
| + static T Unwrap(const internal::PassedWrapper<T>& o) {
|
| + return o.Take();
|
| + }
|
| +};
|
| +
|
| } // namespace base
|
|
|
| #endif // BASE_BIND_HELPERS_H_
|
|
|