QRegularExpression: QMetaType and QVariant support
authorGiuseppe D'Angelo <dangelog@gmail.com>
Sun, 11 Mar 2012 00:26:17 +0000 (00:26 +0000)
committerQt by Nokia <qt-info@nokia.com>
Wed, 14 Mar 2012 09:53:24 +0000 (10:53 +0100)
Removed the Q_DECLARE_METATYPE in favour of first-class support
inside QMetaType and QVariant.

Change-Id: I904236822bfab967dc0fbd4d4cc2bcb68c741adc
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@nokia.com>
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
src/corelib/kernel/qmetatype.cpp
src/corelib/kernel/qmetatype.h
src/corelib/kernel/qvariant.cpp
src/corelib/kernel/qvariant.h
src/corelib/tools/qregularexpression.h
tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
tests/auto/corelib/kernel/qvariant/stream/qt5.0/qregularexpression.bin [new file with mode: 0644]
tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp

index 8474635..a61894d 100644 (file)
@@ -63,6 +63,7 @@
 #  include "qurl.h"
 #  include "qvariant.h"
 #  include "qabstractitemmodel.h"
+#  include "qregularexpression.h"
 #endif
 
 #ifndef QT_NO_GEOM_VARIANT
@@ -114,6 +115,9 @@ template<> struct TypeDefinition<QModelIndex> { static const bool IsAvailable =
 #ifdef QT_NO_REGEXP
 template<> struct TypeDefinition<QRegExp> { static const bool IsAvailable = false; };
 #endif
+#if defined(QT_BOOTSTRAPPED) || defined(QT_NO_REGEXP)
+template<> struct TypeDefinition<QRegularExpression> { static const bool IsAvailable = false; };
+#endif
 } // namespace
 
 /*!
@@ -219,6 +223,7 @@ template<> struct TypeDefinition<QRegExp> { static const bool IsAvailable = fals
     \value QPoint QPoint
     \value QUrl QUrl
     \value QRegExp QRegExp
+    \value QRegularExpression QRegularExpression
     \value QDateTime QDateTime
     \value QPointF QPointF
     \value QPalette QPalette
@@ -781,10 +786,15 @@ bool QMetaType::save(QDataStream &stream, int type, const void *data)
         break;
 #endif
 #ifndef QT_BOOTSTRAPPED
+#ifndef QT_NO_REGEXP
+    case QMetaType::QRegularExpression:
+        stream << *static_cast<const NS(QRegularExpression)*>(data);
+        break;
+#endif // QT_NO_REGEXP
     case QMetaType::QEasingCurve:
         stream << *static_cast<const NS(QEasingCurve)*>(data);
         break;
-#endif
+#endif // QT_BOOTSTRAPPED
     case QMetaType::QFont:
     case QMetaType::QPixmap:
     case QMetaType::QBrush:
@@ -993,10 +1003,15 @@ bool QMetaType::load(QDataStream &stream, int type, void *data)
         break;
 #endif
 #ifndef QT_BOOTSTRAPPED
+#ifndef QT_NO_REGEXP
+    case QMetaType::QRegularExpression:
+        stream >> *static_cast< NS(QRegularExpression)*>(data);
+        break;
+#endif // QT_NO_REGEXP
     case QMetaType::QEasingCurve:
         stream >> *static_cast< NS(QEasingCurve)*>(data);
         break;
-#endif
+#endif // QT_BOOTSTRAPPED
     case QMetaType::QFont:
     case QMetaType::QPixmap:
     case QMetaType::QBrush:
@@ -1149,9 +1164,13 @@ void *QMetaType::create(int type, const void *copy)
             return new NS(QRegExp)(*static_cast<const NS(QRegExp)*>(copy));
 #endif
 #ifndef QT_BOOTSTRAPPED
+#ifndef QT_NO_REGEXP
+        case QMetaType::QRegularExpression:
+            return new NS(QRegularExpression)(*static_cast<const NS(QRegularExpression)*>(copy));
+#endif // QT_NO_REGEXP
         case QMetaType::QEasingCurve:
             return new NS(QEasingCurve)(*static_cast<const NS(QEasingCurve)*>(copy));
-#endif
+#endif // QT_BOOTSTRAPPED
         case QMetaType::QUuid:
             return new NS(QUuid)(*static_cast<const NS(QUuid)*>(copy));
 #ifndef QT_BOOTSTRAPPED
@@ -1253,9 +1272,13 @@ void *QMetaType::create(int type, const void *copy)
             return new NS(QRegExp);
 #endif
 #ifndef QT_BOOTSTRAPPED
+#ifndef QT_NO_REGEXP
+        case QMetaType::QRegularExpression:
+            return new NS(QRegularExpression);
+#endif // QT_NO_REGEXP
         case QMetaType::QEasingCurve:
             return new NS(QEasingCurve);
-#endif
+#endif // QT_BOOTSTRAPPED
         case QMetaType::QUuid:
             return new NS(QUuid);
 #ifndef QT_BOOTSTRAPPED
index 4eadb34..d913e37 100644 (file)
@@ -102,6 +102,7 @@ QT_BEGIN_NAMESPACE
     F(QUuid, 30, QUuid) \
     F(QVariant, 41, QVariant) \
     F(QModelIndex, 42, QModelIndex) \
+    F(QRegularExpression, 44, QRegularExpression)
 
 #define QT_FOR_EACH_STATIC_CORE_POINTER(F)\
     F(QObjectStar, 39, QObject*) \
@@ -194,7 +195,7 @@ public:
         QT_FOR_EACH_STATIC_TYPE(QT_DEFINE_METATYPE_ID)
 
         FirstCoreType = Bool,
-        LastCoreType = Void,
+        LastCoreType = QRegularExpression,
         FirstGuiType = QFont,
         LastGuiType = QPolygonF,
         FirstWidgetsType = QIcon,
index 8058a06..e08f4ef 100644 (file)
@@ -48,6 +48,7 @@
 #include "qdatetime.h"
 #include "qeasingcurve.h"
 #include "qlist.h"
+#include "qregularexpression.h"
 #include "qstring.h"
 #include "qstringlist.h"
 #include "qurl.h"
@@ -106,6 +107,7 @@ struct TypeDefinition {
 #ifdef QT_BOOTSTRAPPED
 template<> struct TypeDefinition<QEasingCurve> { static const bool IsAvailable = false; };
 template<> struct TypeDefinition<QModelIndex> { static const bool IsAvailable = false; };
+template<> struct TypeDefinition<QRegularExpression> { static const bool IsAvailable = false; };
 #endif
 #ifdef QT_NO_GEOM_VARIANT
 template<> struct TypeDefinition<QRect> { static const bool IsAvailable = false; };
@@ -1028,6 +1030,7 @@ Q_CORE_EXPORT void QVariantPrivate::unregisterHandler(const int /* Modules::Name
     \value Rect  a QRect
     \value RectF  a QRectF
     \value RegExp  a QRegExp
+    \value RegularExpression  a QRegularExpression
     \value Region  a QRegion
     \value Size  a QSize
     \value SizeF  a QSizeF
@@ -1358,6 +1361,14 @@ QVariant::QVariant(const char *val)
   Constructs a new variant with the regexp value \a regExp.
 */
 
+/*!
+  \fn QVariant::QVariant(const QRegularExpression &re)
+
+  \since 5.0
+
+  Constructs a new variant with the regular expression value \a re.
+*/
+
 /*! \since 4.2
   \fn QVariant::QVariant(Qt::GlobalColor color)
 
@@ -1446,7 +1457,10 @@ QVariant::QVariant(const QUrl &u) { d.is_null = false; d.type = Url; v_construct
 QVariant::QVariant(const QLocale &l) { d.is_null = false; d.type = Locale; v_construct<QLocale>(&d, l); }
 #ifndef QT_NO_REGEXP
 QVariant::QVariant(const QRegExp &regExp) { d.is_null = false; d.type = RegExp; v_construct<QRegExp>(&d, regExp); }
-#endif
+#ifndef QT_BOOTSTRAPPED
+QVariant::QVariant(const QRegularExpression &re) { d.is_null = false; d.type = QMetaType::QRegularExpression; v_construct<QRegularExpression>(&d, re); }
+#endif // QT_BOOTSTRAPPED
+#endif // QT_NO_REGEXP
 QVariant::QVariant(Qt::GlobalColor color) { create(62, &color); }
 
 /*!
@@ -2127,6 +2141,24 @@ QRegExp QVariant::toRegExp() const
 #endif
 
 /*!
+    \fn QRegularExpression QVariant::toRegularExpression() const
+    \since 5.0
+
+    Returns the variant as a QRegularExpression if the variant has type() \l
+    QRegularExpression; otherwise returns an empty QRegularExpression.
+
+    \sa canConvert(), convert()
+*/
+#ifndef QT_BOOTSTRAPPED
+#ifndef QT_NO_REGEXP
+QRegularExpression QVariant::toRegularExpression() const
+{
+    return qVariantToHelper<QRegularExpression>(d, handlerManager);
+}
+#endif
+#endif
+
+/*!
     \fn QChar QVariant::toChar() const
 
     Returns the variant as a QChar if the variant has type() \l Char,
index 4d4b2d5..cc502d9 100644 (file)
@@ -76,7 +76,8 @@ class QRect;
 class QRectF;
 #ifndef QT_NO_REGEXP
 class QRegExp;
-#endif
+class QRegularExpression;
+#endif // QT_NO_REGEXP
 class QTextFormat;
 class QTextLength;
 class QUrl;
@@ -154,6 +155,7 @@ class Q_CORE_EXPORT QVariant
         Point = QMetaType::QPoint,
         PointF = QMetaType::QPointF,
         RegExp = QMetaType::QRegExp,
+        RegularExpression = QMetaType::QRegularExpression,
         Hash = QMetaType::QVariantHash,
         EasingCurve = QMetaType::QEasingCurve,
         Uuid = QMetaType::QUuid,
@@ -239,7 +241,10 @@ class Q_CORE_EXPORT QVariant
     QVariant(const QLocale &locale);
 #ifndef QT_NO_REGEXP
     QVariant(const QRegExp &regExp);
-#endif
+#ifndef QT_BOOTSRAPPED
+    QVariant(const QRegularExpression &re);
+#endif // QT_BOOTSTRAPPED
+#endif // QT_NO_REGEXP
 #ifndef QT_BOOTSTRAPPED
     QVariant(const QEasingCurve &easing);
 #endif
@@ -302,7 +307,10 @@ class Q_CORE_EXPORT QVariant
     QLocale toLocale() const;
 #ifndef QT_NO_REGEXP
     QRegExp toRegExp() const;
-#endif
+#ifndef QT_BOOTSTRAPPED
+    QRegularExpression toRegularExpression() const;
+#endif // QT_BOOTSTRAPPED
+#endif // QT_NO_REGEXP
 #ifndef QT_BOOTSTRAPPED
     QEasingCurve toEasingCurve() const;
 #endif
index 3ca83c9..57cb290 100644 (file)
@@ -239,8 +239,6 @@ Q_DECLARE_TYPEINFO(QRegularExpressionMatchIterator, Q_MOVABLE_TYPE);
 
 QT_END_NAMESPACE
 
-Q_DECLARE_METATYPE(QRegularExpression)
-
 QT_END_HEADER
 
 #endif // QT_NO_REGEXP
index 589b838..7fcf2ff 100644 (file)
@@ -528,6 +528,16 @@ template<> struct TestValueFactory<QMetaType::QRegExp> {
 #endif
     }
 };
+template<> struct TestValueFactory<QMetaType::QRegularExpression> {
+    static QRegularExpression *create()
+    {
+#ifndef QT_NO_REGEXP
+        return new QRegularExpression("abc.*def");
+#else
+        return 0;
+#endif
+    }
+};
 template<> struct TestValueFactory<QMetaType::QVariant> {
     static QVariant *create() { return new QVariant(QStringList(QStringList() << "Q" << "t")); }
 };
diff --git a/tests/auto/corelib/kernel/qvariant/stream/qt5.0/qregularexpression.bin b/tests/auto/corelib/kernel/qvariant/stream/qt5.0/qregularexpression.bin
new file mode 100644 (file)
index 0000000..eaa50f7
Binary files /dev/null and b/tests/auto/corelib/kernel/qvariant/stream/qt5.0/qregularexpression.bin differ
index 9c9c9be..05655b4 100644 (file)
@@ -192,6 +192,7 @@ private slots:
     void toLocale();
 
     void toRegExp();
+    void toRegularExpression();
 
     void matrix();
 
@@ -1319,6 +1320,21 @@ void tst_QVariant::toRegExp()
     rx = variant.toRegExp();
 }
 
+void tst_QVariant::toRegularExpression()
+{
+    QVariant variant;
+    QRegularExpression re = variant.toRegularExpression();
+    QCOMPARE(re, QRegularExpression());
+
+    variant = QRegularExpression("abc.*def");
+    re = variant.toRegularExpression();
+    QCOMPARE(re, QRegularExpression("abc.*def"));
+
+    variant = QVariant::fromValue(QRegularExpression("[ab]\\w+"));
+    re = variant.value<QRegularExpression>();
+    QCOMPARE(re, QRegularExpression("[ab]\\w+"));
+}
+
 void tst_QVariant::matrix()
 {
     QVariant variant;
@@ -1519,6 +1535,8 @@ void tst_QVariant::writeToReadFromDataStream_data()
     QTest::newRow( "qchar_null" ) << QVariant(QChar(0)) << true;
     QTest::newRow( "regexp" ) << QVariant(QRegExp("foo", Qt::CaseInsensitive)) << false;
     QTest::newRow( "regexp_empty" ) << QVariant(QRegExp()) << false;
+    QTest::newRow( "regularexpression" ) << QVariant(QRegularExpression("abc.*def")) << false;
+    QTest::newRow( "regularexpression_empty" ) << QVariant(QRegularExpression()) << false;
 
     // types known to QMetaType, but not part of QVariant::Type
     QTest::newRow("QMetaType::Long invalid") << QVariant(QMetaType::Long, (void *) 0) << false;
@@ -1944,6 +1962,7 @@ void tst_QVariant::typeName_data()
     QTest::newRow("48") << int(QVariant::Vector3D) << QByteArray("QVector3D");
     QTest::newRow("49") << int(QVariant::Vector4D) << QByteArray("QVector4D");
     QTest::newRow("50") << int(QVariant::Quaternion) << QByteArray("QQuaternion");
+    QTest::newRow("51") << int(QVariant::RegularExpression) << QByteArray("QRegularExpression");
 }
 
 void tst_QVariant::typeName()