diff options
-rw-r--r-- | chromium/base/bind_internal.h | 16 | ||||
-rw-r--r-- | chromium/base/memory/raw_ptr.h | 32 | ||||
-rw-r--r-- | chromium/base/memory/raw_scoped_refptr_mismatch_checker.h | 5 |
3 files changed, 43 insertions, 10 deletions
diff --git a/chromium/base/bind_internal.h b/chromium/base/bind_internal.h index a7aba35bb6c..5315534e478 100644 --- a/chromium/base/bind_internal.h +++ b/chromium/base/bind_internal.h @@ -801,8 +801,8 @@ bool QueryCancellationTraits(const BindStateBase* base, template <typename Functor, typename Receiver, typename... Unused> std::enable_if_t< !(MakeFunctorTraits<Functor>::is_method && - std::is_pointer<std::decay_t<Receiver>>::value && - IsRefCountedType<std::remove_pointer_t<std::decay_t<Receiver>>>::value)> + IsPointerV<std::decay_t<Receiver>> && + IsRefCountedType<RemovePointerT<std::decay_t<Receiver>>>::value)> BanUnconstructedRefCountedReceiver(const Receiver& receiver, Unused&&...) {} template <typename Functor> @@ -812,8 +812,8 @@ void BanUnconstructedRefCountedReceiver() {} template <typename Functor, typename Receiver, typename... Unused> std::enable_if_t< MakeFunctorTraits<Functor>::is_method && - std::is_pointer<std::decay_t<Receiver>>::value && - IsRefCountedType<std::remove_pointer_t<std::decay_t<Receiver>>>::value> + IsPointerV<std::decay_t<Receiver>> && + IsRefCountedType<RemovePointerT<std::decay_t<Receiver>>>::value> BanUnconstructedRefCountedReceiver(const Receiver& receiver, Unused&&...) { DCHECK(receiver); @@ -946,8 +946,8 @@ struct MakeBindStateTypeImpl<true, Functor, Receiver, BoundArgs...> { static_assert(!std::is_array<std::remove_reference_t<Receiver>>::value, "First bound argument to a method cannot be an array."); static_assert( - !std::is_pointer<DecayedReceiver>::value || - IsRefCountedType<std::remove_pointer_t<DecayedReceiver>>::value, + !IsPointerV<DecayedReceiver> || + IsRefCountedType<RemovePointerT<DecayedReceiver>>::value, "Receivers may not be raw pointers. If using a raw pointer here is safe" " and has no lifetime concerns, use base::Unretained() and document why" " it's safe."); @@ -957,8 +957,8 @@ struct MakeBindStateTypeImpl<true, Functor, Receiver, BoundArgs...> { public: using Type = BindState< std::decay_t<Functor>, - std::conditional_t<std::is_pointer<DecayedReceiver>::value, - scoped_refptr<std::remove_pointer_t<DecayedReceiver>>, + std::conditional_t<IsPointerV<DecayedReceiver>, + scoped_refptr<RemovePointerT<DecayedReceiver>>, DecayedReceiver>, std::decay_t<BoundArgs>...>; }; diff --git a/chromium/base/memory/raw_ptr.h b/chromium/base/memory/raw_ptr.h index f22003573c7..56f0bd20d5a 100644 --- a/chromium/base/memory/raw_ptr.h +++ b/chromium/base/memory/raw_ptr.h @@ -579,6 +579,38 @@ class raw_ptr { friend class raw_ptr; }; + +// Template helpers for working with T* or raw_ptr<T>. +template <typename T> +struct IsPointer : std::false_type {}; + +template <typename T> +struct IsPointer<T*> : std::true_type {}; + +template <typename T, typename I> +struct IsPointer<raw_ptr<T, I>> : std::true_type {}; + +template <typename T> +inline constexpr bool IsPointerV = IsPointer<T>::value; + +template <typename T> +struct RemovePointer { + using type = T; +}; + +template <typename T> +struct RemovePointer<T*> { + using type = T; +}; + +template <typename T, typename I> +struct RemovePointer<raw_ptr<T, I>> { + using type = T; +}; + +template <typename T> +using RemovePointerT = typename RemovePointer<T>::type; + } // namespace base using base::raw_ptr; diff --git a/chromium/base/memory/raw_scoped_refptr_mismatch_checker.h b/chromium/base/memory/raw_scoped_refptr_mismatch_checker.h index 9e50458ec98..7afae066fa3 100644 --- a/chromium/base/memory/raw_scoped_refptr_mismatch_checker.h +++ b/chromium/base/memory/raw_scoped_refptr_mismatch_checker.h @@ -7,6 +7,7 @@ #include <type_traits> +#include "base/memory/raw_ptr.h" #include "base/template_util.h" // It is dangerous to post a task with a T* argument where T is a subtype of @@ -35,8 +36,8 @@ struct IsRefCountedType<T, // pointer type and are convertible to a RefCounted(Base|ThreadSafeBase) type. template <typename T> struct NeedsScopedRefptrButGetsRawPtr - : conjunction<std::is_pointer<T>, - IsRefCountedType<std::remove_pointer_t<T>>> { + : conjunction<base::IsPointer<T>, + IsRefCountedType<base::RemovePointerT<T>>> { static_assert(!std::is_reference<T>::value, "NeedsScopedRefptrButGetsRawPtr requires non-reference type."); }; |