Make mid() and midRef() properly return empty, non-null objects
authorGiuseppe D'Angelo <dangelog@gmail.com>
Mon, 23 Jan 2012 12:02:36 +0000 (12:02 +0000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 24 Jan 2012 16:36:11 +0000 (17:36 +0100)
If we request a substring starting at the very end of the string,
QString::mid should return an empty string, not a null string.
For instance, QString("abc").mid(3, 0) used to return a null
one, while this patch makes it return an empty one. The
same thing applies to QString::midRef() and QByteArray::mid().

Change-Id: Ie9efd7a0622d429efd0fb682c19856c19e9469af
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
dist/changes-5.0.0
src/corelib/tools/qbytearray.cpp
src/corelib/tools/qstring.cpp
tests/auto/corelib/tools/qstring/tst_qstring.cpp
tests/auto/other/collections/tst_collections.cpp

index 1b67f87..bbd1c23 100644 (file)
@@ -221,6 +221,11 @@ QtCore
   altering the watchlist in both the singular and QStringList overloads of
   addPath and removePath.
 
+* QString::mid, QString::midRef and QByteArray::mid, if the position passed
+  is equal to the length (that is, right after the last character/byte),
+  now return an empty QString, QStringRef or QByteArray respectively.
+  in Qt 4 they returned a null QString or a null QStringRef.
+
 QtGui
 -----
 * Accessibility has been refactored. The hierachy of accessible objects is implemented via
index 0ca2f47..364f58f 100644 (file)
@@ -2660,7 +2660,7 @@ QByteArray QByteArray::right(int len) const
 
 QByteArray QByteArray::mid(int pos, int len) const
 {
-    if (d == &shared_null.ba || d == &shared_empty.ba || pos >= d->size)
+    if (d == &shared_null.ba || d == &shared_empty.ba || pos > d->size)
         return QByteArray();
     if (len < 0)
         len = d->size - pos;
index 3e92df7..d6090cc 100644 (file)
@@ -3385,7 +3385,7 @@ QString QString::right(int n) const
 
 QString QString::mid(int position, int n) const
 {
-    if (d == &shared_null.str || position >= d->size)
+    if (d == &shared_null.str || position > d->size)
         return QString();
     if (n < 0)
         n = d->size - position;
@@ -8024,7 +8024,7 @@ QStringRef QString::rightRef(int n) const
     Returns a substring reference to \a n characters of this string,
     starting at the specified \a position.
 
-    If the \a position exceeds the length of the string, an empty
+    If the \a position exceeds the length of the string, a null
     reference is returned.
 
     If there are less than \a n characters available in the string,
@@ -8041,7 +8041,7 @@ QStringRef QString::rightRef(int n) const
 
 QStringRef QString::midRef(int position, int n) const
 {
-    if (d == &shared_null.str || position >= d->size)
+    if (d == &shared_null.str || position > d->size)
         return QStringRef();
     if (n < 0)
         n = d->size - position;
index eda34b0..b9951c1 100644 (file)
@@ -1417,6 +1417,10 @@ void tst_QString::mid()
 
     QCOMPARE(a.mid(3,3),(QString)"DEF");
     QCOMPARE(a.mid(0,0),(QString)"");
+    QVERIFY(!a.mid(15,0).isNull());
+    QVERIFY(a.mid(15,0).isEmpty());
+    QVERIFY(!a.mid(15,1).isNull());
+    QVERIFY(a.mid(15,1).isEmpty());
     QVERIFY(a.mid(9999).isNull());
     QVERIFY(a.mid(9999,1).isNull());
 
@@ -1439,6 +1443,10 @@ void tst_QString::midRef()
 
     QCOMPARE(a.midRef(3,3).toString(),(QString)"DEF");
     QCOMPARE(a.midRef(0,0).toString(),(QString)"");
+    QVERIFY(!a.midRef(15,0).toString().isNull());
+    QVERIFY(a.midRef(15,0).toString().isEmpty());
+    QVERIFY(!a.midRef(15,1).toString().isNull());
+    QVERIFY(a.midRef(15,1).toString().isEmpty());
     QVERIFY(a.midRef(9999).toString().isEmpty());
     QVERIFY(a.midRef(9999,1).toString().isEmpty());
 
index 4edb9d2..528d3b1 100644 (file)
@@ -1310,8 +1310,8 @@ void tst_Collections::byteArray()
     QVERIFY(hello.mid(0, hello.size()+1) == hello);
 
     QVERIFY(hello.mid(hello.size()-0) == "");
-
-    QVERIFY(hello.mid(hello.size()-0).isNull()); // weird but valid 3.x semantics
+    QVERIFY(hello.mid(hello.size()-0).isEmpty());
+    QVERIFY(!hello.mid(hello.size()-0).isNull());
     QVERIFY(hello.mid(hello.size()-1) == "o");
     QVERIFY(hello.mid(hello.size()-2) == "lo");
     QVERIFY(hello.mid(hello.size()-200) == "hello");
@@ -2030,8 +2030,8 @@ void tst_Collections::qstring()
     QVERIFY(hello.mid(0, hello.size()+1) == hello);
 
     QVERIFY(hello.mid(hello.size()-0) == "");
-
-    QVERIFY(hello.mid(hello.size()-0).isNull());
+    QVERIFY(hello.mid(hello.size()-0).isEmpty());
+    QVERIFY(!hello.mid(hello.size()-0).isNull());
     QVERIFY(hello.mid(hello.size()-1) == "o");
     QVERIFY(hello.mid(hello.size()-2) == "lo");
     QVERIFY(hello.mid(hello.size()-200) == "hello");