QSignalSpy: assorted improvements

- Add const
- Add explicit (only effect under C++11;
  C++98 knows no multi-arg implicit conversions)
- Add Q_DECL_OVERRIDE to qt_metacall reimplementation
- Add reserve() calls on containers
- Change 'args' from QList to QVector for a 2x
  memory reduction on 64bit platforms

Change-Id: If6c779dac0499d4ab64e5191d37596edf7341f76
Reviewed-by: hjk <qthjk@ovi.com>
Reviewed-by: Andreas Aardal Hanssen <andreas@hanssen.name>
Reviewed-by: David Faure <david.faure@kdab.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
This commit is contained in:
Marc Mutz 2012-10-21 19:02:51 +02:00 committed by The Qt Project
parent b32d7bc96d
commit 80ae1d2078
2 changed files with 13 additions and 10 deletions

View File

@ -47,6 +47,7 @@
#include <QtCore/qobject.h>
#include <QtCore/qmetaobject.h>
#include <QtCore/qvariant.h>
#include <QtCore/qvector.h>
#include <QtTest/qtesteventloop.h>
QT_BEGIN_HEADER
@ -59,7 +60,7 @@ class QVariant;
class QSignalSpy: public QObject, public QList<QList<QVariant> >
{
public:
QSignalSpy(QObject *obj, const char *aSignal)
explicit QSignalSpy(const QObject *obj, const char *aSignal)
: m_waiting(false)
{
#ifdef Q_CC_BOR
@ -82,9 +83,9 @@ public:
return;
}
QByteArray ba = QMetaObject::normalizedSignature(aSignal + 1);
const QMetaObject *mo = obj->metaObject();
int sigIndex = mo->indexOfMethod(ba.constData());
const QByteArray ba = QMetaObject::normalizedSignature(aSignal + 1);
const QMetaObject * const mo = obj->metaObject();
const int sigIndex = mo->indexOfMethod(ba.constData());
if (sigIndex < 0) {
qWarning("QSignalSpy: No such signal: '%s'", ba.constData());
return;
@ -112,7 +113,7 @@ public:
return count() > origCount;
}
int qt_metacall(QMetaObject::Call call, int methodId, void **a)
int qt_metacall(QMetaObject::Call call, int methodId, void **a) Q_DECL_OVERRIDE
{
methodId = QObject::qt_metacall(call, methodId, a);
if (methodId < 0)
@ -130,9 +131,10 @@ public:
private:
void initArgs(const QMetaMethod &member)
{
QList<QByteArray> params = member.parameterTypes();
const QList<QByteArray> params = member.parameterTypes();
args.reserve(params.size());
for (int i = 0; i < params.count(); ++i) {
int tp = QMetaType::type(params.at(i).constData());
const int tp = QMetaType::type(params.at(i).constData());
if (tp == QMetaType::UnknownType) {
Q_ASSERT(tp != QMetaType::Void); // void parameter => metaobject is corrupt
qWarning("Don't know how to handle '%s', use qRegisterMetaType to register it.",
@ -145,8 +147,9 @@ private:
void appendArgs(void **a)
{
QList<QVariant> list;
list.reserve(args.count());
for (int i = 0; i < args.count(); ++i) {
QMetaType::Type type = static_cast<QMetaType::Type>(args.at(i));
const QMetaType::Type type = static_cast<QMetaType::Type>(args.at(i));
if (type == QMetaType::QVariant)
list << *reinterpret_cast<QVariant *>(a[i + 1]);
else
@ -161,7 +164,7 @@ private:
// the full, normalized signal name
QByteArray sig;
// holds the QMetaType types for the argument list of the signal
QList<int> args;
QVector<int> args;
QTestEventLoop m_loop;
bool m_waiting;

View File

@ -59,7 +59,7 @@
\snippet code/doc_src_qsignalspy.cpp 3
*/
/*! \fn QSignalSpy::QSignalSpy(QObject *object, const char *signal)
/*! \fn QSignalSpy::QSignalSpy(const QObject *object, const char *signal)
Constructs a new QSignalSpy that listens for emissions of the \a signal
from the QObject \a object. If QSignalSpy is not able to listen for a