summaryrefslogtreecommitdiffstats
path: root/src/core/services
diff options
context:
space:
mode:
authorAndy Nichols <andy.nichols@theqtcompany.com>2015-11-26 12:51:24 +0100
committerAndy Nichols <andy.nichols@theqtcompany.com>2015-11-27 11:34:44 +0000
commit422f8d389a5fc17b8bb0d607aaad8239003db50d (patch)
tree6b71b1f769136f42a7198610faa2f7fe9424f840 /src/core/services
parent9dcde2a90a59e67ca7108a1e2facf1a578825241 (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.cpp44
-rw-r--r--src/core/services/qcollisionqueryresult.h31
-rw-r--r--src/core/services/qcollisionqueryresult_p.h8
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 &copy)
+ : 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 &copy);
void setHandle(const QQueryHandle &handle);
void addEntityHit(const QNodeId &entity);
- Q_DECLARE_PUBLIC(QCollisionQueryResult)
- QCollisionQueryResult *q_ptr;
-
QQueryHandle m_handle;
QVector<QNodeId> m_entitiesHit;
};