QTouchEvent::TouchPoint: make it a proper value class

This includes:
- Marking it as Q_MOVABLE_TYPE
- adding move ctor and move assignment operator
- add member-swap
- use the copy-swap idiom in the copy-assignment operator

This required making the destructor safe for d == nullptr.

Change-Id: I8a77ffcb8e4a395a7e103d1df610561b6ae4c001
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
Marc Mutz 2012-03-01 08:47:20 +01:00 committed by Qt by Nokia
parent f5433b9666
commit 47cdc50bbc
2 changed files with 21 additions and 13 deletions

View File

@ -3621,7 +3621,7 @@ QTouchEvent::TouchPoint::TouchPoint(const QTouchEvent::TouchPoint &other)
*/
QTouchEvent::TouchPoint::~TouchPoint()
{
if (!d->ref.deref())
if (d && !d->ref.deref())
delete d;
}
@ -4043,16 +4043,15 @@ void QTouchEvent::TouchPoint::setFlags(InfoFlags flags)
d->flags = flags;
}
/*! \internal */
QTouchEvent::TouchPoint &QTouchEvent::TouchPoint::operator=(const QTouchEvent::TouchPoint &other)
{
other.d->ref.ref();
if (!d->ref.deref())
delete d;
d = other.d;
return *this;
}
/*!
\fn QTouchEvent::TouchPoint &QTouchEvent::TouchPoint::operator=(const QTouchEvent::TouchPoint &other)
\internal
*/
/*!
\fn void QTouchEvent::TouchPoint::swap(TouchPoint &other);
\internal
*/
/*!
\class QScrollPrepareEvent

View File

@ -713,9 +713,19 @@ public:
Q_DECLARE_FLAGS(InfoFlags, InfoFlag)
explicit TouchPoint(int id = -1);
TouchPoint(const QTouchEvent::TouchPoint &other);
TouchPoint(const TouchPoint &other);
#ifdef Q_COMPILER_RVALUE_REFS
TouchPoint(TouchPoint &&other) : d(other.d) { other.d = 0; }
TouchPoint &operator=(TouchPoint &&other)
{ qSwap(d, other.d); return *this; }
#endif
~TouchPoint();
TouchPoint &operator=(const TouchPoint &other)
{ if ( d != other.d ) { TouchPoint copy(other); swap(copy); } return *this; }
void swap(TouchPoint &other) { qSwap(d, other.d); }
int id() const;
Qt::TouchPointState state() const;
@ -767,7 +777,6 @@ public:
void setVelocity(const QVector2D &v);
void setFlags(InfoFlags flags);
void setRawScreenPositions(const QList<QPointF> &positions);
QTouchEvent::TouchPoint &operator=(const QTouchEvent::TouchPoint &other);
private:
QTouchEventTouchPointPrivate *d;
@ -819,7 +828,7 @@ protected:
friend class QApplication;
friend class QApplicationPrivate;
};
Q_DECLARE_TYPEINFO(QTouchEvent::TouchPoint, Q_MOVABLE_TYPE);
Q_DECLARE_OPERATORS_FOR_FLAGS(QTouchEvent::TouchPoint::InfoFlags)
class QScrollPrepareEventPrivate;