From cb93117d06dc1f32a39a8fe9608c7a68566d6781 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 15 Oct 2014 23:02:43 +0200 Subject: [PATCH] QChar: prepare relational operators for constexpr'ification Make sure the relational operators are in a constexpr'able form by removing the use of the const/non-const-overloaded unicode() function, which in the relational operators is resolved to the non-const version, which isn't constexpr'able. Replaced with direct member access for op== and op< (required making them friends) and reformulating the other operators in terms of these two. Since I managed to introduce a bug while doing this change, add a simple test for QChar operators, too. Change-Id: I69f3da849e71abc2a17152f797694950914adebc Reviewed-by: Alex Trotsenko Reviewed-by: Thiago Macieira --- src/corelib/tools/qchar.h | 16 +++++++---- tests/auto/corelib/tools/qchar/tst_qchar.cpp | 29 ++++++++++++++++++++ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/corelib/tools/qchar.h b/src/corelib/tools/qchar.h index dcbe3fb0c2..6854a7ac87 100644 --- a/src/corelib/tools/qchar.h +++ b/src/corelib/tools/qchar.h @@ -493,6 +493,9 @@ private: QChar(char c); QChar(uchar c); #endif + + friend bool operator==(QChar, QChar); + friend bool operator< (QChar, QChar); ushort ucs; }; @@ -534,12 +537,13 @@ inline bool QChar::isUpper(uint ucs4) inline bool QChar::isTitleCase(uint ucs4) { return ucs4 > 127 && QChar::category(ucs4) == Letter_Titlecase; } -inline bool operator==(QChar c1, QChar c2) { return c1.unicode() == c2.unicode(); } -inline bool operator!=(QChar c1, QChar c2) { return c1.unicode() != c2.unicode(); } -inline bool operator<=(QChar c1, QChar c2) { return c1.unicode() <= c2.unicode(); } -inline bool operator>=(QChar c1, QChar c2) { return c1.unicode() >= c2.unicode(); } -inline bool operator<(QChar c1, QChar c2) { return c1.unicode() < c2.unicode(); } -inline bool operator>(QChar c1, QChar c2) { return c1.unicode() > c2.unicode(); } +inline bool operator==(QChar c1, QChar c2) { return c1.ucs == c2.ucs; } +inline bool operator< (QChar c1, QChar c2) { return c1.ucs < c2.ucs; } + +inline bool operator!=(QChar c1, QChar c2) { return !operator==(c1, c2); } +inline bool operator>=(QChar c1, QChar c2) { return !operator< (c1, c2); } +inline bool operator> (QChar c1, QChar c2) { return operator< (c2, c1); } +inline bool operator<=(QChar c1, QChar c2) { return !operator< (c2, c1); } #ifndef QT_NO_DATASTREAM Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, QChar); diff --git a/tests/auto/corelib/tools/qchar/tst_qchar.cpp b/tests/auto/corelib/tools/qchar/tst_qchar.cpp index a4350ea2fe..55c911a5fc 100644 --- a/tests/auto/corelib/tools/qchar/tst_qchar.cpp +++ b/tests/auto/corelib/tools/qchar/tst_qchar.cpp @@ -47,6 +47,8 @@ public slots: void init(); void cleanup(); private slots: + void operators_data(); + void operators(); void toUpper(); void toLower(); void toTitle(); @@ -99,6 +101,33 @@ void tst_QChar::cleanup() #endif } +void tst_QChar::operators_data() +{ + QTest::addColumn("lhs"); + QTest::addColumn("rhs"); + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) + QTest::newRow(qPrintable(QString().sprintf("'\\%d' (op) '\\%d'", i, j))) + << QChar(ushort(i)) << QChar(ushort(j)); + } +} + +void tst_QChar::operators() +{ + QFETCH(QChar, lhs); + QFETCH(QChar, rhs); + +#define CHECK(op) QCOMPARE((lhs op rhs), (lhs.unicode() op rhs.unicode())) + CHECK(==); + CHECK(!=); + CHECK(< ); + CHECK(> ); + CHECK(<=); + CHECK(>=); +#undef CHECK +} + void tst_QChar::toUpper() { QVERIFY(QChar('a').toUpper() == 'A');