diff options
author | Marc Mutz <marc.mutz@kdab.com> | 2014-10-15 23:02:43 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@kdab.com> | 2014-12-10 01:26:51 +0100 |
commit | cb93117d06dc1f32a39a8fe9608c7a68566d6781 (patch) | |
tree | 2e49fc7742bf73ea49f2fbe3ab3f7774fe8f2429 | |
parent | c9db6e52bc9bd9731159fcb4e95fca5cba01bc9c (diff) |
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 <alex1973tr@gmail.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | src/corelib/tools/qchar.h | 16 | ||||
-rw-r--r-- | 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<QChar>("lhs"); + QTest::addColumn<QChar>("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'); |