diff options
-rw-r--r-- | src/corelib/tools/qtaggedpointer.h | 50 | ||||
-rw-r--r-- | src/corelib/tools/qtaggedpointer.qdoc | 30 |
2 files changed, 49 insertions, 31 deletions
diff --git a/src/corelib/tools/qtaggedpointer.h b/src/corelib/tools/qtaggedpointer.h index 0c48fa6e4f..67209ffc08 100644 --- a/src/corelib/tools/qtaggedpointer.h +++ b/src/corelib/tools/qtaggedpointer.h @@ -43,8 +43,7 @@ #include <QtCore/qglobal.h> #include <QtCore/qalgorithms.h> #include <QtCore/qmath.h> - -#include <limits.h> +#include <QtCore/qtypeinfo.h> QT_BEGIN_NAMESPACE @@ -80,10 +79,13 @@ public: static constexpr quintptr tagMask() { return QtPrivate::TagInfo<T>::alignment - 1; } static constexpr quintptr pointerMask() { return ~tagMask(); } - explicit QTaggedPointer(T *pointer = nullptr, Tag tag = Tag()) noexcept + constexpr QTaggedPointer() noexcept : d(0) {} + constexpr QTaggedPointer(std::nullptr_t) noexcept : QTaggedPointer() {} + + explicit QTaggedPointer(T *pointer, Tag tag = Tag()) noexcept : d(quintptr(pointer)) { - Q_STATIC_ASSERT(sizeof(Type*) == sizeof(QTaggedPointer<Type>)); + Q_STATIC_ASSERT(sizeof(Type*) == sizeof(QTaggedPointer)); Q_ASSERT_X((quintptr(pointer) & tagMask()) == 0, "QTaggedPointer<T, Tag>", "Pointer is not aligned"); @@ -107,18 +109,12 @@ public: return !isNull(); } - QTaggedPointer<T, Tag> &operator=(T *other) noexcept + QTaggedPointer &operator=(T *other) noexcept { d = reinterpret_cast<quintptr>(other) | (d & tagMask()); return *this; } - QTaggedPointer<T, Tag> &operator=(std::nullptr_t) noexcept - { - d &= tagMask(); - return *this; - } - static constexpr Tag maximumTag() noexcept { return TagType(typename QtPrivate::TagInfo<T>::TagType(tagMask())); @@ -147,58 +143,62 @@ public: return !data(); } - void swap(QTaggedPointer<T, Tag> &other) noexcept + void swap(QTaggedPointer &other) noexcept { qSwap(d, other.d); } - friend inline bool operator==(const QTaggedPointer<T, Tag> &lhs, const QTaggedPointer<T, Tag> &rhs) noexcept + friend inline bool operator==(QTaggedPointer lhs, QTaggedPointer rhs) noexcept { return lhs.data() == rhs.data(); } - friend inline bool operator!=(const QTaggedPointer<T, Tag> &lhs, const QTaggedPointer<T, Tag> &rhs) noexcept + friend inline bool operator!=(QTaggedPointer lhs, QTaggedPointer rhs) noexcept { return lhs.data() != rhs.data(); } - friend inline bool operator==(const QTaggedPointer<T, Tag> &lhs, std::nullptr_t) noexcept + friend inline bool operator==(QTaggedPointer lhs, std::nullptr_t) noexcept { return lhs.isNull(); } - friend inline bool operator==(std::nullptr_t, const QTaggedPointer<T, Tag> &rhs) noexcept + friend inline bool operator==(std::nullptr_t, QTaggedPointer rhs) noexcept { return rhs.isNull(); } - friend inline bool operator!=(const QTaggedPointer<T, Tag> &lhs, std::nullptr_t) noexcept + friend inline bool operator!=(QTaggedPointer lhs, std::nullptr_t) noexcept { return !lhs.isNull(); } - friend inline bool operator!=(std::nullptr_t, const QTaggedPointer<T, Tag> &rhs) noexcept + friend inline bool operator!=(std::nullptr_t, QTaggedPointer rhs) noexcept { return !rhs.isNull(); } - friend inline bool operator!(const QTaggedPointer<T, Tag> &ptr) noexcept + friend inline bool operator!(QTaggedPointer ptr) noexcept { return !ptr.data(); } + friend inline void swap(QTaggedPointer &p1, QTaggedPointer &p2) noexcept + { + p1.swap(p2); + } + protected: quintptr d; }; -template <typename T> -Q_DECLARE_TYPEINFO_BODY(QTaggedPointer<T>, Q_MOVABLE_TYPE); +template <typename T, typename Tag> +constexpr inline std::size_t qHash(QTaggedPointer<T, Tag> p, std::size_t seed = 0) noexcept +{ return qHash(p.data(), seed); } template <typename T, typename Tag> -inline void swap(QTaggedPointer<T, Tag> &p1, QTaggedPointer<T, Tag> &p2) noexcept -{ - p1.swap(p2); -} +class QTypeInfo<QTaggedPointer<T, Tag>> + : public QTypeInfoMerger<QTaggedPointer<T, Tag>, quintptr> {}; QT_END_NAMESPACE diff --git a/src/corelib/tools/qtaggedpointer.qdoc b/src/corelib/tools/qtaggedpointer.qdoc index 5b335e8739..303b89232c 100644 --- a/src/corelib/tools/qtaggedpointer.qdoc +++ b/src/corelib/tools/qtaggedpointer.qdoc @@ -93,6 +93,18 @@ /*! + \fn template <typename T, typename Tag> QTaggedPointer<T, Tag>::QTaggedPointer() + + Creates a tagged pointer that contains nullptr and stores no tag. +*/ + +/*! + \fn template <typename T, typename Tag> QTaggedPointer<T, Tag>::QTaggedPointer(std::nullptr_t) + + Creates a tagged pointer that contains nullptr and stores no tag. +*/ + +/*! \fn template <typename T, typename Tag> explicit QTaggedPointer<T, Tag>::QTaggedPointer(T *pointer = nullptr, Tag tag = Tag()) noexcept Creates a tagged pointer that points to \a pointer and stores the specified \a tag. @@ -159,7 +171,7 @@ */ /*! - \fn template <typename T, typename Tag> inline bool operator==(const QTaggedPointer<T, Tag> &lhs, const QTaggedPointer<T, Tag> &rhs) noexcept + \fn template <typename T, typename Tag> inline bool operator==(QTaggedPointer lhs, QTaggedPointer rhs) noexcept \relates QTaggedPointer Returns \c true if \a lhs is equal to \a rhs; otherwise returns \c false. @@ -168,7 +180,7 @@ */ /*! - \fn template <typename T, typename Tag> inline bool operator!=(const QTaggedPointer<T, Tag> &lhs, const QTaggedPointer<T, Tag> &rhs) noexcept + \fn template <typename T, typename Tag> inline bool operator!=(QTaggedPointer lhs, QTaggedPointer rhs) noexcept \relates QTaggedPointer Returns \c true if \a lhs is not equal to \a rhs; otherwise returns \c false. @@ -177,30 +189,36 @@ */ /*! - \fn template <typename T, typename Tag> inline bool operator==(const QTaggedPointer<T, Tag> &lhs, std::nullptr_t) noexcept + \fn template <typename T, typename Tag> inline bool operator==(QTaggedPointer lhs, std::nullptr_t) noexcept \relates QTaggedPointer Returns \c true if \a lhs refers to \c nullptr. */ /*! - \fn template <typename T, typename Tag> inline bool operator==(std::nullptr_t, const QTaggedPointer<T, Tag> &rhs) noexcept + \fn template <typename T, typename Tag> inline bool operator==(std::nullptr_t, QTaggedPointer rhs) noexcept \relates QTaggedPointer Returns \c true if \a rhs refers to \c nullptr. */ /*! - \fn template <typename T, typename Tag> inline bool operator!=(const QTaggedPointer<T, Tag> &lhs, std::nullptr_t) noexcept + \fn template <typename T, typename Tag> inline bool operator!=(QTaggedPointerlhs, std::nullptr_t) noexcept \relates QTaggedPointer Returns \c true if \a lhs refers to a valid (i.e. non-null) pointer. */ /*! - \fn template <typename T, typename Tag> inline bool operator!=(std::nullptr_t, const QTaggedPointer<T, Tag> &rhs) noexcept + \fn template <typename T, typename Tag> inline bool operator!=(std::nullptr_t, QTaggedPointer rhs) noexcept \relates QTaggedPointer Returns \c true if \a rhs refers to a valid (i.e. non-null) pointer. */ +/*! + \fn template <typename T, typename Tag> qHash(QTaggedPointer<T, Tag> key, std::size_t seed) + \relates QTaggedPointer + + Returns the hash value for the \a key, using \a seed to seed the calculation. +*/ |