QRegularExpression: QMetaType and QVariant support

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>
This commit is contained in:
Giuseppe D'Angelo 2012-03-11 00:26:17 +00:00 committed by Qt by Nokia
parent b8112c8526
commit 08790636f2
8 changed files with 102 additions and 11 deletions

View 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

View 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,

View 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); }
/*!
@ -2126,6 +2140,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

View 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

View 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

View 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")); }
};

View 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()