diff options
Diffstat (limited to 'src/corelib/kernel/qpointer.h')
-rw-r--r-- | src/corelib/kernel/qpointer.h | 149 |
1 files changed, 61 insertions, 88 deletions
diff --git a/src/corelib/kernel/qpointer.h b/src/corelib/kernel/qpointer.h index ebc06a0fb1..8875eef5c3 100644 --- a/src/corelib/kernel/qpointer.h +++ b/src/corelib/kernel/qpointer.h @@ -1,45 +1,10 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QPOINTER_H #define QPOINTER_H +#include <QtCore/qcompare.h> #include <QtCore/qsharedpointer.h> #include <QtCore/qtypeinfo.h> @@ -54,15 +19,48 @@ class QPointer { static_assert(!std::is_pointer<T>::value, "QPointer's template type must not be a pointer type"); + template <typename X> + using if_convertible = std::enable_if_t<std::is_convertible_v<X*, T*>, bool>; + template <typename X> + friend class QPointer; + using QObjectType = typename std::conditional<std::is_const<T>::value, const QObject, QObject>::type; QWeakPointer<QObjectType> wp; public: - QPointer() = default; + Q_NODISCARD_CTOR + QPointer() noexcept = default; + Q_NODISCARD_CTOR + constexpr QPointer(std::nullptr_t) noexcept : QPointer{} {} + Q_WEAK_OVERLOAD + Q_NODISCARD_CTOR inline QPointer(T *p) : wp(p, true) { } // compiler-generated copy/move ctor/assignment operators are fine! // compiler-generated dtor is fine! + template <typename X, if_convertible<X> = true> + Q_NODISCARD_CTOR + QPointer(QPointer<X> &&other) noexcept + : wp(std::exchange(other.wp, nullptr).internalData(), true) {} + template <typename X, if_convertible<X> = true> + Q_NODISCARD_CTOR + QPointer(const QPointer<X> &other) noexcept + : wp(other.wp.internalData(), true) {} + + template <typename X, if_convertible<X> = true> + QPointer &operator=(const QPointer<X> &other) noexcept + { + QPointer(other).swap(*this); + return *this; + } + + template <typename X, if_convertible<X> = true> + QPointer &operator=(QPointer<X> &&other) noexcept + { + QPointer(std::move(other)).swap(*this); + return *this; + } + #ifdef Q_QDOC // Stop qdoc from complaining about missing function ~QPointer(); @@ -73,64 +71,43 @@ public: inline QPointer<T> &operator=(T* p) { wp.assign(static_cast<QObjectType*>(p)); return *this; } - inline T* data() const + T* data() const noexcept { return static_cast<T*>(wp.internalData()); } - inline T* get() const + T* get() const noexcept { return data(); } - inline T* operator->() const + T* operator->() const noexcept { return data(); } - inline T& operator*() const + T& operator*() const noexcept { return *data(); } - inline operator T*() const + operator T*() const noexcept { return data(); } - inline bool isNull() const + bool isNull() const noexcept { return wp.isNull(); } - inline void clear() + void clear() noexcept { wp.clear(); } -}; -template <class T> Q_DECLARE_TYPEINFO_BODY(QPointer<T>, Q_MOVABLE_TYPE); - -template <class T> -inline bool operator==(const T *o, const QPointer<T> &p) -{ return o == p.operator->(); } - -template<class T> -inline bool operator==(const QPointer<T> &p, const T *o) -{ return p.operator->() == o; } - -template <class T> -inline bool operator==(T *o, const QPointer<T> &p) -{ return o == p.operator->(); } -template<class T> -inline bool operator==(const QPointer<T> &p, T *o) -{ return p.operator->() == o; } + friend void swap(QPointer &lhs, QPointer &rhs) noexcept + { lhs.swap(rhs); } -template<class T> -inline bool operator==(const QPointer<T> &p1, const QPointer<T> &p2) -{ return p1.operator->() == p2.operator->(); } +private: + template <typename X> + friend bool comparesEqual(const QPointer &lhs, const QPointer<X> &rhs) noexcept + { return lhs.data() == rhs.data(); } + QT_DECLARE_EQUALITY_OPERATORS_HELPER(QPointer, QPointer<X>, /* non-constexpr */, + template <typename X>) -template <class T> -inline bool operator!=(const T *o, const QPointer<T> &p) -{ return o != p.operator->(); } - -template<class T> -inline bool operator!= (const QPointer<T> &p, const T *o) -{ return p.operator->() != o; } - -template <class T> -inline bool operator!=(T *o, const QPointer<T> &p) -{ return o != p.operator->(); } + template <typename X> + friend bool comparesEqual(const QPointer &lhs, X *rhs) noexcept + { return lhs.data() == rhs; } + Q_DECLARE_EQUALITY_COMPARABLE(QPointer, X*, template <typename X>) -template<class T> -inline bool operator!= (const QPointer<T> &p, T *o) -{ return p.operator->() != o; } - -template<class T> -inline bool operator!= (const QPointer<T> &p1, const QPointer<T> &p2) -{ return p1.operator->() != p2.operator->() ; } + friend bool comparesEqual(const QPointer &lhs, std::nullptr_t) noexcept + { return lhs.data() == nullptr; } + Q_DECLARE_EQUALITY_COMPARABLE(QPointer, std::nullptr_t) +}; +template <class T> Q_DECLARE_TYPEINFO_BODY(QPointer<T>, Q_RELOCATABLE_TYPE); template<typename T> QPointer<T> @@ -140,10 +117,6 @@ qPointerFromVariant(const QVariant &variant) return QPointer<T>{qobject_cast<T*>(QtPrivate::EnableInternalData::internalData(wp))}; } -template <class T> -inline void swap(QPointer<T> &p1, QPointer<T> &p2) noexcept -{ p1.swap(p2); } - QT_END_NAMESPACE #endif // QT_NO_QOBJECT |