summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools/qvector.h
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-06-02 15:51:15 +0200
committerLars Knoll <lars.knoll@qt.io>2020-06-09 16:51:16 +0200
commitd2833a3ce5af725d66ef9338f2a61b766dd3cb2d (patch)
tree3b74823b5f2da7cfd179e4faeed1697c4ff14d09 /src/corelib/tools/qvector.h
parentfd856532d7472ccc6daf6a95d5c28264d9e6adca (diff)
Ensure left/right/mid behave in a compatible way
QString and QStringRef did bounds checking for left/right/mid, whereas QStringView was asserting on out of bounds. Relax the behavior for QStringView and do bounds checking on pos/n as well. This removes a source of potentially hidden errors when porting from QStringRef (or QString) to QStringView. Unfortunately, one difference remains, where QByteArray::left/right() behaves differently (and somewhat more sane) than QString and QStringRef. We're keeping the difference here, as it has been around for many years. Mark left/right/mid as obsolete and to be replaced with the new first/last/slice methods. Change-Id: I18c203799ba78c928a4610a6038089f27696c22e Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'src/corelib/tools/qvector.h')
-rw-r--r--src/corelib/tools/qvector.h8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h
index c2cdcba41d..b502a86442 100644
--- a/src/corelib/tools/qvector.h
+++ b/src/corelib/tools/qvector.h
@@ -710,8 +710,10 @@ int QVector<T>::lastIndexOf(const T &t, int from) const noexcept
template <typename T>
inline QVector<T> QVector<T>::mid(int pos, int len) const
{
+ qsizetype p = pos;
+ qsizetype l = len;
using namespace QtPrivate;
- switch (QContainerImplHelper::mid(d.size, &pos, &len)) {
+ switch (QContainerImplHelper::mid(d.size, &p, &l)) {
case QContainerImplHelper::Null:
case QContainerImplHelper::Empty:
return QVector();
@@ -722,8 +724,8 @@ inline QVector<T> QVector<T>::mid(int pos, int len) const
}
// Allocate memory
- DataPointer copied(Data::allocate(len));
- copied->copyAppend(constBegin() + pos, constBegin() + pos + len);
+ DataPointer copied(Data::allocate(l));
+ copied->copyAppend(constBegin() + p, constBegin() + p + l);
return copied;
}