Do not shift the data pointer when removing all elements from QList

Because leaving the pointer untouched is a much more expected behavior

The tests for this (and not only) logic can be found in the following commit

Change-Id: Iec9eec9bbce04c9fd90cb6be9627c135cd989b7f
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
(cherry picked from commit 38bba2a87c6c5c2b8100870add6d0d7ad559e669)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Andrei Golubev 2021-04-25 12:36:46 +02:00 committed by Qt Cherry-pick Bot
parent 802388d074
commit 36e0a4a98f

View File

@ -231,10 +231,12 @@ public:
// are invalidated. However, erasing from the beginning effectively // are invalidated. However, erasing from the beginning effectively
// means that all iterators are invalidated. We can use this freedom to // means that all iterators are invalidated. We can use this freedom to
// erase by moving towards the end. // erase by moving towards the end.
if (b == this->begin()) if (b == this->begin() && e != this->end()) {
this->ptr = e; this->ptr = e;
else if (e != this->end()) } else if (e != this->end()) {
::memmove(static_cast<void *>(b), static_cast<void *>(e), (static_cast<T *>(this->end()) - e) * sizeof(T)); ::memmove(static_cast<void *>(b), static_cast<void *>(e),
(static_cast<T *>(this->end()) - e) * sizeof(T));
}
this->size -= n; this->size -= n;
} }
@ -610,7 +612,7 @@ public:
// are invalidated. However, erasing from the beginning effectively // are invalidated. However, erasing from the beginning effectively
// means that all iterators are invalidated. We can use this freedom to // means that all iterators are invalidated. We can use this freedom to
// erase by moving towards the end. // erase by moving towards the end.
if (b == this->begin()) { if (b == this->begin() && e != this->end()) {
this->ptr = e; this->ptr = e;
} else { } else {
const T *const end = this->end(); const T *const end = this->end();
@ -839,7 +841,7 @@ public:
// erase by moving towards the end. // erase by moving towards the end.
std::destroy(b, e); std::destroy(b, e);
if (b == this->begin()) { if (b == this->begin() && e != this->end()) {
this->ptr = e; this->ptr = e;
} else if (e != this->end()) { } else if (e != this->end()) {
memmove(static_cast<void *>(b), static_cast<const void *>(e), (static_cast<const T *>(this->end()) - e)*sizeof(T)); memmove(static_cast<void *>(b), static_cast<const void *>(e), (static_cast<const T *>(this->end()) - e)*sizeof(T));