QSignalSpy: assorted improvements
authorMarc Mutz <marc.mutz@kdab.com>
Sun, 21 Oct 2012 17:02:51 +0000 (19:02 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Sat, 1 Dec 2012 09:31:20 +0000 (10:31 +0100)
- 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>
src/testlib/qsignalspy.h
src/testlib/qsignalspy.qdoc

index e26faee..b8e542a 100644 (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;
index 1b73ccd..30ab7c8 100644 (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