Do not use QTypeInfo::isStatic anymore
... except in QList.
When dafa3618
introduced isRelocatable and QTypeInfoQuery, the
intention was to decouple the memory layout of QList from the
reallocation optimizations in QVector. This never happened, as
QVector (and QVarLengthArray) continue to use isStatic to this
day.
Fix by porting both QVector and QVLA to QTypeInfoQuery and
isRelocatable.
Change-Id: I6951f2cf21f0cbb24e2dbd38f80f1bd82007d394
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
4df229ce50
commit
19085350fb
@ -126,6 +126,7 @@ class QList
|
||||
public:
|
||||
struct MemoryLayout
|
||||
: std::conditional<
|
||||
// must stay isStatic until ### Qt 6 for BC reasons (don't use !isRelocatable)!
|
||||
QTypeInfo<T>::isStatic || QTypeInfo<T>::isLarge,
|
||||
QListData::IndirectLayout,
|
||||
typename std::conditional<
|
||||
|
@ -352,7 +352,7 @@ Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::realloc(int asize, int a
|
||||
a = Prealloc;
|
||||
}
|
||||
s = 0;
|
||||
if (QTypeInfo<T>::isStatic) {
|
||||
if (!QTypeInfoQuery<T>::isRelocatable) {
|
||||
QT_TRY {
|
||||
// copy all the old elements
|
||||
while (s < copySize) {
|
||||
@ -445,7 +445,7 @@ Q_OUTOFLINE_TEMPLATE typename QVarLengthArray<T, Prealloc>::iterator QVarLengthA
|
||||
if (n != 0) {
|
||||
resize(s + n);
|
||||
const T copy(t);
|
||||
if (QTypeInfo<T>::isStatic) {
|
||||
if (!QTypeInfoQuery<T>::isRelocatable) {
|
||||
T *b = ptr + offset;
|
||||
T *j = ptr + s;
|
||||
T *i = j - n;
|
||||
|
@ -553,7 +553,7 @@ void QVector<T>::reallocData(const int asize, const int aalloc, QArrayData::Allo
|
||||
T *srcEnd = asize > d->size ? d->end() : d->begin() + asize;
|
||||
T *dst = x->begin();
|
||||
|
||||
if (QTypeInfo<T>::isStatic || (isShared && QTypeInfo<T>::isComplex)) {
|
||||
if (!QTypeInfoQuery<T>::isRelocatable || (isShared && QTypeInfo<T>::isComplex)) {
|
||||
// we can not move the data, we need to copy construct it
|
||||
while (srcBegin != srcEnd) {
|
||||
new (dst++) T(*srcBegin++);
|
||||
@ -598,7 +598,7 @@ void QVector<T>::reallocData(const int asize, const int aalloc, QArrayData::Allo
|
||||
}
|
||||
if (d != x) {
|
||||
if (!d->ref.deref()) {
|
||||
if (QTypeInfo<T>::isStatic || !aalloc || (isShared && QTypeInfo<T>::isComplex)) {
|
||||
if (!QTypeInfoQuery<T>::isRelocatable || !aalloc || (isShared && QTypeInfo<T>::isComplex)) {
|
||||
// data was copy constructed, we need to call destructors
|
||||
// or if !alloc we did nothing to the old 'd'.
|
||||
freeData(d);
|
||||
@ -697,7 +697,7 @@ typename QVector<T>::iterator QVector<T>::insert(iterator before, size_type n, c
|
||||
const T copy(t);
|
||||
if (!isDetached() || d->size + n > int(d->alloc))
|
||||
reallocData(d->size, d->size + n, QArrayData::Grow);
|
||||
if (QTypeInfo<T>::isStatic) {
|
||||
if (!QTypeInfoQuery<T>::isRelocatable) {
|
||||
T *b = d->end();
|
||||
T *i = d->end() + n;
|
||||
while (i != b)
|
||||
@ -746,7 +746,7 @@ typename QVector<T>::iterator QVector<T>::erase(iterator abegin, iterator aend)
|
||||
detach();
|
||||
abegin = d->begin() + itemsUntouched;
|
||||
aend = abegin + itemsToErase;
|
||||
if (QTypeInfo<T>::isStatic) {
|
||||
if (!QTypeInfoQuery<T>::isRelocatable) {
|
||||
iterator moveBegin = abegin + itemsToErase;
|
||||
iterator moveEnd = d->end();
|
||||
while (moveBegin != moveEnd) {
|
||||
|
Loading…
Reference in New Issue
Block a user