QObject: replace QScopedPointer with std::unique_ptr in the implementation
Use the standard tool instead of self-made stuff that cannot decide whether it wants to be a scoped pointer (why take()?) or a movable one (why no move special member functions?). Take advantage of C++11 local structs for pulling the custom deleter into the scope where its only user is located, too. Change-Id: I7e097a59edef9adc8455504ae94b8df0f8b9e5d2 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
parent
fd42589b14
commit
c13bb2a66a
@ -93,12 +93,6 @@ QAbstractDynamicMetaObject::~QAbstractDynamicMetaObject()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct QSlotObjectBaseDeleter { // for use with QScopedPointer<QSlotObjectBase,...>
|
|
||||||
static void cleanup(QtPrivate::QSlotObjectBase *slot) {
|
|
||||||
if (slot) slot->destroyIfLastRef();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
static int *queuedConnectionTypes(const QList<QByteArray> &typeNames)
|
static int *queuedConnectionTypes(const QList<QByteArray> &typeNames)
|
||||||
{
|
{
|
||||||
int *types = new int [typeNames.count() + 1];
|
int *types = new int [typeNames.count() + 1];
|
||||||
@ -3380,7 +3374,7 @@ QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender,
|
|||||||
type &= Qt::UniqueConnection - 1;
|
type &= Qt::UniqueConnection - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
QScopedPointer<QObjectPrivate::Connection> c(new QObjectPrivate::Connection);
|
std::unique_ptr<QObjectPrivate::Connection> c{new QObjectPrivate::Connection};
|
||||||
c->sender = s;
|
c->sender = s;
|
||||||
c->signal_index = signal_index;
|
c->signal_index = signal_index;
|
||||||
c->receiver.storeRelaxed(r);
|
c->receiver.storeRelaxed(r);
|
||||||
@ -3394,14 +3388,14 @@ QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender,
|
|||||||
c->argumentTypes.storeRelaxed(types);
|
c->argumentTypes.storeRelaxed(types);
|
||||||
c->callFunction = callFunction;
|
c->callFunction = callFunction;
|
||||||
|
|
||||||
QObjectPrivate::get(s)->addConnection(signal_index, c.data());
|
QObjectPrivate::get(s)->addConnection(signal_index, c.get());
|
||||||
|
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index);
|
QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index);
|
||||||
if (smethod.isValid())
|
if (smethod.isValid())
|
||||||
s->connectNotify(smethod);
|
s->connectNotify(smethod);
|
||||||
|
|
||||||
return c.take();
|
return c.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -3791,10 +3785,16 @@ void doActivate(QObject *sender, int signal_index, void **argv)
|
|||||||
|
|
||||||
if (c->isSlotObject) {
|
if (c->isSlotObject) {
|
||||||
c->slotObj->ref();
|
c->slotObj->ref();
|
||||||
QScopedPointer<QtPrivate::QSlotObjectBase, QSlotObjectBaseDeleter> obj(c->slotObj);
|
|
||||||
|
struct Deleter {
|
||||||
|
void operator()(QtPrivate::QSlotObjectBase *slot) const {
|
||||||
|
if (slot) slot->destroyIfLastRef();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const std::unique_ptr<QtPrivate::QSlotObjectBase, Deleter> obj{c->slotObj};
|
||||||
|
|
||||||
{
|
{
|
||||||
Q_TRACE_SCOPE(QMetaObject_activate_slot_functor, obj.data());
|
Q_TRACE_SCOPE(QMetaObject_activate_slot_functor, obj.get());
|
||||||
obj->call(receiver, argv);
|
obj->call(receiver, argv);
|
||||||
}
|
}
|
||||||
} else if (c->callFunction && c->method_offset <= receiver->metaObject()->methodOffset()) {
|
} else if (c->callFunction && c->method_offset <= receiver->metaObject()->methodOffset()) {
|
||||||
@ -4947,7 +4947,7 @@ QMetaObject::Connection QObjectPrivate::connectImpl(const QObject *sender, int s
|
|||||||
type = static_cast<Qt::ConnectionType>(type ^ Qt::UniqueConnection);
|
type = static_cast<Qt::ConnectionType>(type ^ Qt::UniqueConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
QScopedPointer<QObjectPrivate::Connection> c(new QObjectPrivate::Connection);
|
std::unique_ptr<QObjectPrivate::Connection> c{new QObjectPrivate::Connection};
|
||||||
c->sender = s;
|
c->sender = s;
|
||||||
c->signal_index = signal_index;
|
c->signal_index = signal_index;
|
||||||
QThreadData *td = r->d_func()->threadData;
|
QThreadData *td = r->d_func()->threadData;
|
||||||
@ -4962,8 +4962,8 @@ QMetaObject::Connection QObjectPrivate::connectImpl(const QObject *sender, int s
|
|||||||
c->ownArgumentTypes = false;
|
c->ownArgumentTypes = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QObjectPrivate::get(s)->addConnection(signal_index, c.data());
|
QObjectPrivate::get(s)->addConnection(signal_index, c.get());
|
||||||
QMetaObject::Connection ret(c.take());
|
QMetaObject::Connection ret(c.release());
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
|
|
||||||
QMetaMethod method = QMetaObjectPrivate::signal(senderMetaObject, signal_index);
|
QMetaMethod method = QMetaObjectPrivate::signal(senderMetaObject, signal_index);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user