diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-22 09:13:24 +0200 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-10-23 20:29:32 +0200 |
commit | 85e4e5bacf0030573359be8de2ea984d541fdbd5 (patch) | |
tree | 8468b154096371d204a74bb61195ba39a650d367 /src/corelib/tools/qsharedpointer_impl.h | |
parent | 074f71cfdabd49ae23ac956a9459c8e13f8e627e (diff) |
Make QSharedPointer comparisons hidden friends
Doesn't touch qsharedpointer.h which already seems outdated and needs
a general overhaul.
Change-Id: I051cdeb1fe03a7ef16e333a483bb68e2fada3c25
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/corelib/tools/qsharedpointer_impl.h')
-rw-r--r-- | src/corelib/tools/qsharedpointer_impl.h | 158 |
1 files changed, 48 insertions, 110 deletions
diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index 2e7ec8103c..affd85d88d 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -437,6 +437,27 @@ public: return result; } +#define DECLARE_COMPARE_SET(T1, A1, T2, A2) \ + friend bool operator==(T1, T2) noexcept \ + { return A1 == A2; } \ + friend bool operator!=(T1, T2) noexcept \ + { return A1 != A2; } + +#define DECLARE_TEMPLATE_COMPARE_SET(T1, A1, T2, A2) \ + template <typename X> \ + friend bool operator==(T1, T2) noexcept \ + { return A1 == A2; } \ + template <typename X> \ + friend bool operator!=(T1, T2) noexcept \ + { return A1 != A2; } + + DECLARE_TEMPLATE_COMPARE_SET(const QSharedPointer &p1, p1.data(), const QSharedPointer<X> &p2, p2.data()) + DECLARE_TEMPLATE_COMPARE_SET(const QSharedPointer &p1, p1.data(), X *ptr, ptr) + DECLARE_TEMPLATE_COMPARE_SET(X *ptr, ptr, const QSharedPointer &p2, p2.data()) + DECLARE_COMPARE_SET(const QSharedPointer &p1, p1.data(), std::nullptr_t, nullptr) + DECLARE_COMPARE_SET(std::nullptr_t, nullptr, const QSharedPointer &p2, p2.data()) +#undef DECLARE_TEMPLATE_COMPARE_SET + private: explicit QSharedPointer(Qt::Initialization) {} @@ -593,14 +614,6 @@ public: return *this; } - template <class X> - bool operator==(const QWeakPointer<X> &o) const noexcept - { return d == o.d && value == static_cast<const T *>(o.value); } - - template <class X> - bool operator!=(const QWeakPointer<X> &o) const noexcept - { return !(*this == o); } - template <class X, IfCompatible<X> = true> inline QWeakPointer(const QSharedPointer<X> &o) : d(nullptr), value(nullptr) { *this = o; } @@ -612,14 +625,6 @@ public: return *this; } - template <class X> - bool operator==(const QSharedPointer<X> &o) const noexcept - { return d == o.d; } - - template <class X> - bool operator!=(const QSharedPointer<X> &o) const noexcept - { return !(*this == o); } - inline void clear() { *this = QWeakPointer(); } inline QSharedPointer<T> toStrongRef() const { return QSharedPointer<T>(*this); } @@ -630,6 +635,33 @@ public: inline T *operator->() const { return data(); } #endif + template <class X> + bool operator==(const QWeakPointer<X> &o) const noexcept + { return d == o.d && value == static_cast<const T *>(o.value); } + + template <class X> + bool operator!=(const QWeakPointer<X> &o) const noexcept + { return !(*this == o); } + + template <class X> + bool operator==(const QSharedPointer<X> &o) const noexcept + { return d == o.d; } + + template <class X> + bool operator!=(const QSharedPointer<X> &o) const noexcept + { return !(*this == o); } + + template <typename X> + friend bool operator==(const QSharedPointer<X> &p1, const QWeakPointer &p2) noexcept + { return p2 == p1; } + template <typename X> + friend bool operator!=(const QSharedPointer<X> &p1, const QWeakPointer &p2) noexcept + { return p2 != p1; } + + DECLARE_COMPARE_SET(const QWeakPointer &p1, p1.d, std::nullptr_t, nullptr) + DECLARE_COMPARE_SET(std::nullptr_t, nullptr, const QWeakPointer &p2, p2.data()) +#undef DECLARE_COMPARE_SET + private: friend struct QtPrivate::EnableInternalData; #if defined(Q_NO_TEMPLATE_FRIENDS) @@ -710,100 +742,6 @@ public: }; // -// operator== and operator!= -// -template <class T, class X> -bool operator==(const QSharedPointer<T> &ptr1, const QSharedPointer<X> &ptr2) noexcept -{ - return ptr1.data() == ptr2.data(); -} -template <class T, class X> -bool operator!=(const QSharedPointer<T> &ptr1, const QSharedPointer<X> &ptr2) noexcept -{ - return ptr1.data() != ptr2.data(); -} - -template <class T, class X> -bool operator==(const QSharedPointer<T> &ptr1, const X *ptr2) noexcept -{ - return ptr1.data() == ptr2; -} -template <class T, class X> -bool operator==(const T *ptr1, const QSharedPointer<X> &ptr2) noexcept -{ - return ptr1 == ptr2.data(); -} -template <class T, class X> -bool operator!=(const QSharedPointer<T> &ptr1, const X *ptr2) noexcept -{ - return !(ptr1 == ptr2); -} -template <class T, class X> -bool operator!=(const T *ptr1, const QSharedPointer<X> &ptr2) noexcept -{ - return !(ptr2 == ptr1); -} - -template <class T, class X> -bool operator==(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2) noexcept -{ - return ptr2 == ptr1; -} -template <class T, class X> -bool operator!=(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2) noexcept -{ - return ptr2 != ptr1; -} - -template<class T> -inline bool operator==(const QSharedPointer<T> &lhs, std::nullptr_t) noexcept -{ - return lhs.isNull(); -} - -template<class T> -inline bool operator!=(const QSharedPointer<T> &lhs, std::nullptr_t) noexcept -{ - return !lhs.isNull(); -} - -template<class T> -inline bool operator==(std::nullptr_t, const QSharedPointer<T> &rhs) noexcept -{ - return rhs.isNull(); -} - -template<class T> -inline bool operator!=(std::nullptr_t, const QSharedPointer<T> &rhs) noexcept -{ - return !rhs.isNull(); -} - -template<class T> -inline bool operator==(const QWeakPointer<T> &lhs, std::nullptr_t) noexcept -{ - return lhs.isNull(); -} - -template<class T> -inline bool operator!=(const QWeakPointer<T> &lhs, std::nullptr_t) noexcept -{ - return !lhs.isNull(); -} - -template<class T> -inline bool operator==(std::nullptr_t, const QWeakPointer<T> &rhs) noexcept -{ - return rhs.isNull(); -} - -template<class T> -inline bool operator!=(std::nullptr_t, const QWeakPointer<T> &rhs) noexcept -{ - return !rhs.isNull(); -} - -// // operator- // template <class T, class X> |