QWeakPointer: purge deprecated API
Since 5.0: assignment/construction from QObject pointer Since 5.14: data() to recover the packaged pointer Change-Id: I5d6ab561ce39bc0d9d3e5035eb2ca38139cd76b6 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
860c68522b
commit
e40320c552
@ -63,9 +63,6 @@ QT_END_NAMESPACE
|
|||||||
#include <new>
|
#include <new>
|
||||||
#include <QtCore/qatomic.h>
|
#include <QtCore/qatomic.h>
|
||||||
#include <QtCore/qobject.h> // for qobject_cast
|
#include <QtCore/qobject.h> // for qobject_cast
|
||||||
#if QT_DEPRECATED_SINCE(5, 6)
|
|
||||||
#include <QtCore/qhash.h>
|
|
||||||
#endif
|
|
||||||
#include <QtCore/qhashfunctions.h>
|
#include <QtCore/qhashfunctions.h>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@ -555,29 +552,9 @@ public:
|
|||||||
explicit operator bool() const noexcept { return !isNull(); }
|
explicit operator bool() const noexcept { return !isNull(); }
|
||||||
bool operator !() const noexcept { return isNull(); }
|
bool operator !() const noexcept { return isNull(); }
|
||||||
|
|
||||||
#if QT_DEPRECATED_SINCE(5, 14)
|
|
||||||
QT_DEPRECATED_X("Use toStrongRef() instead, and data() on the returned QSharedPointer")
|
|
||||||
T *data() const noexcept { return internalData(); }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
inline QWeakPointer() noexcept : d(nullptr), value(nullptr) { }
|
inline QWeakPointer() noexcept : d(nullptr), value(nullptr) { }
|
||||||
inline ~QWeakPointer() { if (d && !d->weakref.deref()) delete d; }
|
inline ~QWeakPointer() { if (d && !d->weakref.deref()) delete d; }
|
||||||
|
|
||||||
#ifndef QT_NO_QOBJECT
|
|
||||||
// special constructor that is enabled only if X derives from QObject
|
|
||||||
#if QT_DEPRECATED_SINCE(5, 0)
|
|
||||||
template <class X, IfCompatible<X> = true>
|
|
||||||
QT_DEPRECATED inline QWeakPointer(X *ptr) : d(ptr ? Data::getAndRef(ptr) : nullptr), value(ptr)
|
|
||||||
{ }
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if QT_DEPRECATED_SINCE(5, 0)
|
|
||||||
template <class X, IfCompatible<X> = true>
|
|
||||||
QT_DEPRECATED inline QWeakPointer &operator=(X *ptr)
|
|
||||||
{ return *this = QWeakPointer(ptr); }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
QWeakPointer(const QWeakPointer &other) noexcept : d(other.d), value(other.value)
|
QWeakPointer(const QWeakPointer &other) noexcept : d(other.d), value(other.value)
|
||||||
{ if (d) d->weakref.ref(); }
|
{ if (d) d->weakref.ref(); }
|
||||||
QWeakPointer(QWeakPointer &&other) noexcept
|
QWeakPointer(QWeakPointer &&other) noexcept
|
||||||
|
@ -1938,13 +1938,6 @@ void tst_QMetaType::automaticTemplateRegistration()
|
|||||||
QCOMPARE(extractedPtr.data()->objectName(), sp.data()->objectName()); \
|
QCOMPARE(extractedPtr.data()->objectName(), sp.data()->objectName()); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#if QT_DEPRECATED_SINCE(5, 0)
|
|
||||||
TEST_NONOWNING_SMARTPOINTER(QWeakPointer, QObject, WeakPointerToQObject, qWeakPointerFromVariant)
|
|
||||||
TEST_NONOWNING_SMARTPOINTER(QWeakPointer, QFile, WeakPointerToQObject, qWeakPointerFromVariant)
|
|
||||||
TEST_NONOWNING_SMARTPOINTER(QWeakPointer, QTemporaryFile, WeakPointerToQObject, qWeakPointerFromVariant)
|
|
||||||
TEST_NONOWNING_SMARTPOINTER(QWeakPointer, MyObject, WeakPointerToQObject, qWeakPointerFromVariant)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
TEST_NONOWNING_SMARTPOINTER(QPointer, QObject, TrackingPointerToQObject, qPointerFromVariant)
|
TEST_NONOWNING_SMARTPOINTER(QPointer, QObject, TrackingPointerToQObject, qPointerFromVariant)
|
||||||
TEST_NONOWNING_SMARTPOINTER(QPointer, QFile, TrackingPointerToQObject, qPointerFromVariant)
|
TEST_NONOWNING_SMARTPOINTER(QPointer, QFile, TrackingPointerToQObject, qPointerFromVariant)
|
||||||
TEST_NONOWNING_SMARTPOINTER(QPointer, QTemporaryFile, TrackingPointerToQObject, qPointerFromVariant)
|
TEST_NONOWNING_SMARTPOINTER(QPointer, QTemporaryFile, TrackingPointerToQObject, qPointerFromVariant)
|
||||||
|
@ -2487,18 +2487,6 @@ void tst_QVariant::qvariant_cast_QObject_wrapper()
|
|||||||
QVERIFY(spVar.canConvert<QObject*>());
|
QVERIFY(spVar.canConvert<QObject*>());
|
||||||
QCOMPARE(f, spVar.value<QObject*>());
|
QCOMPARE(f, spVar.value<QObject*>());
|
||||||
}
|
}
|
||||||
#if QT_DEPRECATED_SINCE(5, 0)
|
|
||||||
{
|
|
||||||
QFile *f = new QFile(this);
|
|
||||||
QT_WARNING_PUSH
|
|
||||||
QT_WARNING_DISABLE_DEPRECATED
|
|
||||||
QWeakPointer<QFile> sp(f);
|
|
||||||
QT_WARNING_POP
|
|
||||||
QVariant spVar = QVariant::fromValue(sp);
|
|
||||||
QVERIFY(spVar.canConvert<QObject*>());
|
|
||||||
QCOMPARE(f, spVar.value<QObject*>());
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
QFile *f = new QFile(this);
|
QFile *f = new QFile(this);
|
||||||
QSharedPointer<QObject> sp(f);
|
QSharedPointer<QObject> sp(f);
|
||||||
|
@ -77,10 +77,6 @@ private slots:
|
|||||||
void functionCallDownCast();
|
void functionCallDownCast();
|
||||||
void upCast();
|
void upCast();
|
||||||
void qobjectWeakManagement();
|
void qobjectWeakManagement();
|
||||||
#if QT_DEPRECATED_SINCE(5, 0)
|
|
||||||
void noSharedPointerFromWeakQObject();
|
|
||||||
void sharedPointerFromQObjectWithWeak();
|
|
||||||
#endif
|
|
||||||
void weakQObjectFromSharedPointer();
|
void weakQObjectFromSharedPointer();
|
||||||
void objectCast();
|
void objectCast();
|
||||||
void objectCastStdSharedPtr();
|
void objectCastStdSharedPtr();
|
||||||
@ -956,156 +952,10 @@ void tst_QSharedPointer::qobjectWeakManagement()
|
|||||||
QVERIFY(weak.isNull());
|
QVERIFY(weak.isNull());
|
||||||
}
|
}
|
||||||
safetyCheck();
|
safetyCheck();
|
||||||
|
|
||||||
#if QT_DEPRECATED_SINCE(5, 0)
|
|
||||||
{
|
|
||||||
QWeakPointer<QObject> weak;
|
|
||||||
weak = QWeakPointer<QObject>();
|
|
||||||
QVERIFY(weak.isNull());
|
|
||||||
QVERIFY(!weak.data());
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
QObject *obj = new QObject;
|
|
||||||
QWeakPointer<QObject> weak(obj);
|
|
||||||
QVERIFY(!weak.isNull());
|
|
||||||
QVERIFY(weak.data() == obj);
|
|
||||||
|
|
||||||
// now delete
|
|
||||||
delete obj;
|
|
||||||
QVERIFY(weak.isNull());
|
|
||||||
}
|
|
||||||
safetyCheck();
|
|
||||||
|
|
||||||
{
|
|
||||||
// same, bit with operator=
|
|
||||||
QObject *obj = new QObject;
|
|
||||||
QWeakPointer<QObject> weak;
|
|
||||||
weak = obj;
|
|
||||||
QVERIFY(!weak.isNull());
|
|
||||||
QVERIFY(weak.data() == obj);
|
|
||||||
|
|
||||||
// now delete
|
|
||||||
delete obj;
|
|
||||||
QVERIFY(weak.isNull());
|
|
||||||
}
|
|
||||||
safetyCheck();
|
|
||||||
|
|
||||||
{
|
|
||||||
// delete triggered by parent
|
|
||||||
QObject *obj, *parent;
|
|
||||||
parent = new QObject;
|
|
||||||
obj = new QObject(parent);
|
|
||||||
QWeakPointer<QObject> weak(obj);
|
|
||||||
|
|
||||||
// now delete the parent
|
|
||||||
delete parent;
|
|
||||||
QVERIFY(weak.isNull());
|
|
||||||
}
|
|
||||||
safetyCheck();
|
|
||||||
|
|
||||||
{
|
|
||||||
// same as above, but set the parent after QWeakPointer is created
|
|
||||||
QObject *obj, *parent;
|
|
||||||
obj = new QObject;
|
|
||||||
QWeakPointer<QObject> weak(obj);
|
|
||||||
|
|
||||||
parent = new QObject;
|
|
||||||
obj->setParent(parent);
|
|
||||||
|
|
||||||
// now delete the parent
|
|
||||||
delete parent;
|
|
||||||
QVERIFY(weak.isNull());
|
|
||||||
}
|
|
||||||
safetyCheck();
|
|
||||||
|
|
||||||
{
|
|
||||||
// with two QWeakPointers
|
|
||||||
QObject *obj = new QObject;
|
|
||||||
QWeakPointer<QObject> weak(obj);
|
|
||||||
|
|
||||||
{
|
|
||||||
QWeakPointer<QObject> weak2(obj);
|
|
||||||
QVERIFY(!weak2.isNull());
|
|
||||||
QVERIFY(weak == weak2);
|
|
||||||
}
|
|
||||||
QVERIFY(!weak.isNull());
|
|
||||||
|
|
||||||
delete obj;
|
|
||||||
QVERIFY(weak.isNull());
|
|
||||||
}
|
|
||||||
safetyCheck();
|
|
||||||
|
|
||||||
{
|
|
||||||
// same, but delete the pointer while two QWeakPointers exist
|
|
||||||
QObject *obj = new QObject;
|
|
||||||
QWeakPointer<QObject> weak(obj);
|
|
||||||
|
|
||||||
{
|
|
||||||
QWeakPointer<QObject> weak2(obj);
|
|
||||||
QVERIFY(!weak2.isNull());
|
|
||||||
|
|
||||||
delete obj;
|
|
||||||
QVERIFY(weak.isNull());
|
|
||||||
QVERIFY(weak2.isNull());
|
|
||||||
}
|
|
||||||
QVERIFY(weak.isNull());
|
|
||||||
}
|
|
||||||
safetyCheck();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if QT_DEPRECATED_SINCE(5, 0)
|
|
||||||
void tst_QSharedPointer::noSharedPointerFromWeakQObject()
|
|
||||||
{
|
|
||||||
// you're not allowed to create a QSharedPointer from an unmanaged QObject
|
|
||||||
QObject obj;
|
|
||||||
QWeakPointer<QObject> weak(&obj);
|
|
||||||
|
|
||||||
{
|
|
||||||
QTest::ignoreMessage(QtWarningMsg , "QSharedPointer: cannot create a QSharedPointer from a QObject-tracking QWeakPointer");
|
|
||||||
QSharedPointer<QObject> strong = weak.toStrongRef();
|
|
||||||
QVERIFY(strong.isNull());
|
|
||||||
}
|
|
||||||
{
|
|
||||||
QTest::ignoreMessage(QtWarningMsg , "QSharedPointer: cannot create a QSharedPointer from a QObject-tracking QWeakPointer");
|
|
||||||
QSharedPointer<QObject> strong = weak;
|
|
||||||
QVERIFY(strong.isNull());
|
|
||||||
}
|
|
||||||
|
|
||||||
QCOMPARE(weak.data(), &obj);
|
|
||||||
// if something went wrong, we'll probably crash here
|
|
||||||
}
|
|
||||||
|
|
||||||
void tst_QSharedPointer::sharedPointerFromQObjectWithWeak()
|
|
||||||
{
|
|
||||||
QObject *ptr = new QObject;
|
|
||||||
QWeakPointer<QObject> weak = ptr;
|
|
||||||
{
|
|
||||||
QSharedPointer<QObject> shared(ptr);
|
|
||||||
QVERIFY(!weak.isNull());
|
|
||||||
QCOMPARE(shared.data(), ptr);
|
|
||||||
QCOMPARE(weak.data(), ptr);
|
|
||||||
}
|
|
||||||
QVERIFY(weak.isNull());
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void tst_QSharedPointer::weakQObjectFromSharedPointer()
|
void tst_QSharedPointer::weakQObjectFromSharedPointer()
|
||||||
{
|
{
|
||||||
#if QT_DEPRECATED_SINCE(5, 0)
|
|
||||||
{
|
|
||||||
// this is the inverse of the above: you're allowed to create a QWeakPointer
|
|
||||||
// from a managed QObject
|
|
||||||
QSharedPointer<QObject> shared(new QObject);
|
|
||||||
QWeakPointer<QObject> weak = shared.data();
|
|
||||||
QVERIFY(!weak.isNull());
|
|
||||||
|
|
||||||
// delete:
|
|
||||||
shared.clear();
|
|
||||||
QVERIFY(weak.isNull());
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
QSharedPointer<QObject> shared(new QObject);
|
QSharedPointer<QObject> shared(new QObject);
|
||||||
QWeakPointer<QObject> weak = shared;
|
QWeakPointer<QObject> weak = shared;
|
||||||
@ -2507,52 +2357,6 @@ void tst_QSharedPointer::qvariantCast()
|
|||||||
}
|
}
|
||||||
// Intentionally does not compile.
|
// Intentionally does not compile.
|
||||||
// QSharedPointer<int> sop = qSharedPointerFromVariant<int>(v);
|
// QSharedPointer<int> sop = qSharedPointerFromVariant<int>(v);
|
||||||
|
|
||||||
#if QT_DEPRECATED_SINCE(5, 0)
|
|
||||||
v = QVariant::fromValue(sp.toWeakRef());
|
|
||||||
|
|
||||||
{
|
|
||||||
QWeakPointer<QObject> other = qWeakPointerFromVariant<QObject>(v);
|
|
||||||
QCOMPARE(other.data()->objectName(), QString::fromLatin1("A test name"));
|
|
||||||
}
|
|
||||||
{
|
|
||||||
QWeakPointer<QIODevice> other = qWeakPointerFromVariant<QIODevice>(v);
|
|
||||||
QCOMPARE(other.data()->objectName(), QString::fromLatin1("A test name"));
|
|
||||||
}
|
|
||||||
{
|
|
||||||
QWeakPointer<QFile> other = qWeakPointerFromVariant<QFile>(v);
|
|
||||||
QCOMPARE(other.data()->objectName(), QString::fromLatin1("A test name"));
|
|
||||||
}
|
|
||||||
{
|
|
||||||
QWeakPointer<QThread> other = qWeakPointerFromVariant<QThread>(v);
|
|
||||||
QVERIFY(!other);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Intentionally does not compile.
|
|
||||||
// QWeakPointer<int> sop = qWeakPointerFromVariant<int>(v);
|
|
||||||
|
|
||||||
QFile file;
|
|
||||||
QWeakPointer<QFile> tracking = &file;
|
|
||||||
tracking.data()->setObjectName("A test name");
|
|
||||||
v = QVariant::fromValue(tracking);
|
|
||||||
|
|
||||||
{
|
|
||||||
QWeakPointer<QObject> other = qWeakPointerFromVariant<QObject>(v);
|
|
||||||
QCOMPARE(other.data()->objectName(), QString::fromLatin1("A test name"));
|
|
||||||
}
|
|
||||||
{
|
|
||||||
QWeakPointer<QIODevice> other = qWeakPointerFromVariant<QIODevice>(v);
|
|
||||||
QCOMPARE(other.data()->objectName(), QString::fromLatin1("A test name"));
|
|
||||||
}
|
|
||||||
{
|
|
||||||
QWeakPointer<QFile> other = qWeakPointerFromVariant<QFile>(v);
|
|
||||||
QCOMPARE(other.data()->objectName(), QString::fromLatin1("A test name"));
|
|
||||||
}
|
|
||||||
{
|
|
||||||
QWeakPointer<QThread> other = qWeakPointerFromVariant<QThread>(v);
|
|
||||||
QVERIFY(!other);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class SomeClass : public QEnableSharedFromThis<SomeClass>
|
class SomeClass : public QEnableSharedFromThis<SomeClass>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user