summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-11-12 16:41:58 +0100
committerLars Knoll <lars.knoll@qt.io>2020-11-17 11:47:36 +0100
commit996255baae06310b09892f4376fb8b3227ecbb70 (patch)
tree4f9bc12f20763c9e12865d533853d0a1cdd5bbe4 /src/corelib
parentc0e1a38f69cb3bc43649c7a45896b1fcf807279a (diff)
Fix signature of QArrayDataOps::erase()
Bring it in line with the other methods that also take a pointer and a size. Also use truncate() in removeAll() as that's more efficient for the use case. Change-Id: Ib1073b7c048ceb96fb6391b308ef8feb77896866 Reviewed-by: Andrei Golubev <andrei.golubev@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/text/qbytearray.cpp4
-rw-r--r--src/corelib/text/qstring.cpp2
-rw-r--r--src/corelib/tools/qarraydataops.h16
-rw-r--r--src/corelib/tools/qlist.h6
4 files changed, 17 insertions, 11 deletions
diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp
index bc2f73a67d..e1bf2cdc2b 100644
--- a/src/corelib/text/qbytearray.cpp
+++ b/src/corelib/text/qbytearray.cpp
@@ -2044,7 +2044,9 @@ QByteArray &QByteArray::remove(qsizetype pos, qsizetype len)
if (len <= 0 || pos < 0 || size_t(pos) >= size_t(size()))
return *this;
detach();
- d->erase(d.begin() + pos, d.begin() + qMin(pos + len, size()));
+ if (pos + len > d->size)
+ len = d->size - pos;
+ d->erase(d.begin() + pos, len);
d.data()[d.size] = '\0';
return *this;
}
diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp
index 499d8dcade..4e220c4453 100644
--- a/src/corelib/text/qstring.cpp
+++ b/src/corelib/text/qstring.cpp
@@ -2985,7 +2985,7 @@ QString &QString::remove(qsizetype pos, qsizetype len)
resize(pos); // truncate
} else if (len > 0) {
detach();
- d->erase(d.begin() + pos, d.begin() + pos + len);
+ d->erase(d.begin() + pos, len);
d.data()[d.size] = u'\0';
}
return *this;
diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h
index 1efa94ebd1..950b26d1a2 100644
--- a/src/corelib/tools/qarraydataops.h
+++ b/src/corelib/tools/qarraydataops.h
@@ -216,8 +216,9 @@ public:
new (where) T(std::move(tmp));
}
- void erase(T *b, T *e)
+ void erase(T *b, qsizetype n)
{
+ T *e = b + n;
Q_ASSERT(this->isMutable());
Q_ASSERT(b < e);
Q_ASSERT(b >= this->begin() && b < this->end());
@@ -231,7 +232,7 @@ public:
this->ptr = e;
else if (e != this->end())
::memmove(static_cast<void *>(b), static_cast<void *>(e), (static_cast<T *>(this->end()) - e) * sizeof(T));
- this->size -= (e - b);
+ this->size -= n;
}
void eraseFirst() noexcept
@@ -592,8 +593,9 @@ public:
Inserter(this, pos).insertOne(i, std::move(tmp));
}
- void erase(T *b, T *e)
+ void erase(T *b, qsizetype n)
{
+ T *e = b + n;
Q_ASSERT(this->isMutable());
Q_ASSERT(b < e);
Q_ASSERT(b >= this->begin() && b < this->end());
@@ -616,7 +618,7 @@ public:
++e;
}
}
- this->size -= (e - b);
+ this->size -= n;
std::destroy(b, e);
}
@@ -818,8 +820,10 @@ public:
Inserter(this, pos).insertOne(i, std::move(tmp));
}
- void erase(T *b, T *e)
+ void erase(T *b, qsizetype n)
{
+ T *e = b + n;
+
Q_ASSERT(this->isMutable());
Q_ASSERT(b < e);
Q_ASSERT(b >= this->begin() && b < this->end());
@@ -836,7 +840,7 @@ public:
} else if (e != this->end()) {
memmove(static_cast<void *>(b), static_cast<const void *>(e), (static_cast<const T *>(this->end()) - e)*sizeof(T));
}
- this->size -= (e - b);
+ this->size -= n;
}
void reallocate(qsizetype alloc, QArrayData::AllocationOption option)
diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h
index daf9d43fd9..4511e1282a 100644
--- a/src/corelib/tools/qlist.h
+++ b/src/corelib/tools/qlist.h
@@ -341,7 +341,7 @@ public:
inline reference emplaceFront(Args&&... args);
iterator insert(qsizetype i, parameter_type t)
- { return insert(i, 1, t); }
+ { return emplace(i, t); }
iterator insert(qsizetype i, qsizetype n, parameter_type t);
iterator insert(const_iterator before, parameter_type t)
{
@@ -448,7 +448,7 @@ public:
const AT &tCopy = CopyProxy(t);
const iterator e = end(), it = std::remove(begin() + index, e, tCopy);
const qsizetype result = std::distance(it, e);
- d->erase(it, e);
+ d->truncate(d->size - result);
return result;
}
template <typename AT = T>
@@ -661,7 +661,7 @@ inline void QList<T>::remove(qsizetype i, qsizetype n)
return;
d.detach();
- d->erase(d->begin() + i, d->begin() + i + n);
+ d->erase(d->begin() + i, n);
}
template <typename T>