diff options
author | Andy Nichols <andy.nichols@theqtcompany.com> | 2015-11-26 12:51:24 +0100 |
---|---|---|
committer | Andy Nichols <andy.nichols@theqtcompany.com> | 2015-11-27 11:34:44 +0000 |
commit | 422f8d389a5fc17b8bb0d607aaad8239003db50d (patch) | |
tree | 6b71b1f769136f42a7198610faa2f7fe9424f840 /src/core/services | |
parent | 9dcde2a90a59e67ca7108a1e2facf1a578825241 (diff) |
QCollisionQueryResult: Use implicit sharing
Previously the implimentation of QCollisionQueryResults was causing
leaks by not deleting the private implementation. The way
QCollisionQueryResult is used though it makes more sense to use implicit
sharing, which also solves the issue of leaking the private
implementation.
Change-Id: Iab76aed2f4d9c6655a5e0fe39885a41072e565ea
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
Diffstat (limited to 'src/core/services')
-rw-r--r-- | src/core/services/qcollisionqueryresult.cpp | 44 | ||||
-rw-r--r-- | src/core/services/qcollisionqueryresult.h | 31 | ||||
-rw-r--r-- | src/core/services/qcollisionqueryresult_p.h | 8 |
3 files changed, 73 insertions, 10 deletions
diff --git a/src/core/services/qcollisionqueryresult.cpp b/src/core/services/qcollisionqueryresult.cpp index baa3ee4a0..c0c815093 100644 --- a/src/core/services/qcollisionqueryresult.cpp +++ b/src/core/services/qcollisionqueryresult.cpp @@ -41,8 +41,15 @@ QT_BEGIN_NAMESPACE namespace Qt3DCore { -QCollisionQueryResultPrivate::QCollisionQueryResultPrivate(QCollisionQueryResult *qq) - : q_ptr(qq) +QCollisionQueryResultPrivate::QCollisionQueryResultPrivate() + : QSharedData() +{ +} + +QCollisionQueryResultPrivate::QCollisionQueryResultPrivate(const QCollisionQueryResultPrivate ©) + : QSharedData(copy) + , m_handle(copy.m_handle) + , m_entitiesHit(copy.m_entitiesHit) { } @@ -57,16 +64,47 @@ void QCollisionQueryResultPrivate::setHandle(const QQueryHandle &handle) } QCollisionQueryResult::QCollisionQueryResult() - : d_ptr(new QCollisionQueryResultPrivate(this)) + : d_ptr(new QCollisionQueryResultPrivate()) +{ +} + +QCollisionQueryResult::QCollisionQueryResult(const QCollisionQueryResult &result) + : d_ptr(result.d_ptr) +{ +} + +QCollisionQueryResult::~QCollisionQueryResult() { } +QCollisionQueryResult &QCollisionQueryResult::operator=(const QCollisionQueryResult &result) +{ + d_ptr = result.d_ptr; + return *this; +} + QVector<QNodeId> QCollisionQueryResult::entitiesHit() const { Q_D(const QCollisionQueryResult); return d->m_entitiesHit; } +/*! + \internal +*/ +QCollisionQueryResult::QCollisionQueryResult(QCollisionQueryResultPrivate &p) + : d_ptr(&p) +{ +} + +/*! + \internal +*/ +QCollisionQueryResultPrivate *QCollisionQueryResult::d_func() +{ + return d_ptr.data(); +} + QQueryHandle QCollisionQueryResult::handle() const { Q_D(const QCollisionQueryResult); diff --git a/src/core/services/qcollisionqueryresult.h b/src/core/services/qcollisionqueryresult.h index 265869cab..a5df974b5 100644 --- a/src/core/services/qcollisionqueryresult.h +++ b/src/core/services/qcollisionqueryresult.h @@ -40,6 +40,7 @@ #include <Qt3DCore/qt3dcore_global.h> #include <Qt3DCore/qnodeid.h> #include <QVector> +#include <QSharedData> QT_BEGIN_NAMESPACE @@ -53,18 +54,44 @@ class QT3DCORESHARED_EXPORT QCollisionQueryResult { public: QCollisionQueryResult(); + QCollisionQueryResult(const QCollisionQueryResult &); + ~QCollisionQueryResult(); + + QCollisionQueryResult &operator=(const QCollisionQueryResult &); +#ifdef Q_COMPILER_RVALUE_REFS + QCollisionQueryResult &operator=(QCollisionQueryResult &&other) Q_DECL_NOTHROW + { + swap(other); + return *this; + } +#endif + + void swap(QCollisionQueryResult &other) Q_DECL_NOTHROW + { + qSwap(d_ptr, other.d_ptr); + } QQueryHandle handle() const; QVector<QNodeId> entitiesHit() const; private: - Q_DECLARE_PRIVATE(QCollisionQueryResult) - QCollisionQueryResultPrivate *d_ptr; friend class QAbstractCollisionQueryService; + + explicit QCollisionQueryResult(QCollisionQueryResultPrivate &p); + + QSharedDataPointer<QCollisionQueryResultPrivate> d_ptr; + // Q_DECLARE_PRIVATE equivalent for shared data pointers + QCollisionQueryResultPrivate *d_func(); + inline const QCollisionQueryResultPrivate *d_func() const + { + return d_ptr.constData(); + } }; } // Qt3D +Q_DECLARE_SHARED(Qt3DCore::QCollisionQueryResult) + QT_END_NAMESPACE #endif // QT3DCORE_QCOLLISIONQUERYRESULT_H diff --git a/src/core/services/qcollisionqueryresult_p.h b/src/core/services/qcollisionqueryresult_p.h index 85daad64b..02525e36d 100644 --- a/src/core/services/qcollisionqueryresult_p.h +++ b/src/core/services/qcollisionqueryresult_p.h @@ -55,17 +55,15 @@ QT_BEGIN_NAMESPACE namespace Qt3DCore { -class QCollisionQueryResultPrivate +class QCollisionQueryResultPrivate : public QSharedData { public: - QCollisionQueryResultPrivate(QCollisionQueryResult *qq); + explicit QCollisionQueryResultPrivate(); + explicit QCollisionQueryResultPrivate(const QCollisionQueryResultPrivate ©); void setHandle(const QQueryHandle &handle); void addEntityHit(const QNodeId &entity); - Q_DECLARE_PUBLIC(QCollisionQueryResult) - QCollisionQueryResult *q_ptr; - QQueryHandle m_handle; QVector<QNodeId> m_entitiesHit; }; |