Add a dedicated QListData::realloc_grow for growing QList
This hides the call to ::grow to now two places in the source code, so it will be easier to fix the inefficient call to qAllocMore. Change-Id: I5d1e6f7607404caa96e4ffff13e80a3e4cb0ee93 Reviewed-by: Ulf Hermann <ulf.hermann@theqtcompany.com> Reviewed-by: Alex Trotsenko <alex1973tr@gmail.com>
This commit is contained in:
parent
dafa3618d2
commit
d9d9420d8d
@ -1,6 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2015 The Qt Company Ltd.
|
** Copyright (C) 2015 The Qt Company Ltd.
|
||||||
|
** Copyright (C) 2015 Intel Corporation.
|
||||||
** Contact: http://www.qt.io/licensing/
|
** Contact: http://www.qt.io/licensing/
|
||||||
**
|
**
|
||||||
** This file is part of the QtCore module of the Qt Toolkit.
|
** This file is part of the QtCore module of the Qt Toolkit.
|
||||||
@ -148,6 +149,17 @@ void QListData::realloc(int alloc)
|
|||||||
d->begin = d->end = 0;
|
d->begin = d->end = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QListData::realloc_grow(int growth)
|
||||||
|
{
|
||||||
|
Q_ASSERT(!d->ref.isShared());
|
||||||
|
int alloc = grow(d->alloc + growth);
|
||||||
|
Data *x = static_cast<Data *>(::realloc(d, DataHeaderSize + alloc * sizeof(void *)));
|
||||||
|
Q_CHECK_PTR(x);
|
||||||
|
|
||||||
|
d = x;
|
||||||
|
d->alloc = alloc;
|
||||||
|
}
|
||||||
|
|
||||||
void QListData::dispose(Data *d)
|
void QListData::dispose(Data *d)
|
||||||
{
|
{
|
||||||
Q_ASSERT(!d->ref.isShared());
|
Q_ASSERT(!d->ref.isShared());
|
||||||
@ -167,7 +179,7 @@ void **QListData::append(int n)
|
|||||||
::memcpy(d->array, d->array + b, e * sizeof(void *));
|
::memcpy(d->array, d->array + b, e * sizeof(void *));
|
||||||
d->begin = 0;
|
d->begin = 0;
|
||||||
} else {
|
} else {
|
||||||
realloc(grow(d->alloc + n));
|
realloc_grow(n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
d->end = e + n;
|
d->end = e + n;
|
||||||
@ -191,7 +203,7 @@ void **QListData::prepend()
|
|||||||
Q_ASSERT(!d->ref.isShared());
|
Q_ASSERT(!d->ref.isShared());
|
||||||
if (d->begin == 0) {
|
if (d->begin == 0) {
|
||||||
if (d->end >= d->alloc / 3)
|
if (d->end >= d->alloc / 3)
|
||||||
realloc(grow(d->alloc + 1));
|
realloc_grow(1);
|
||||||
|
|
||||||
if (d->end < d->alloc / 3)
|
if (d->end < d->alloc / 3)
|
||||||
d->begin = d->alloc - 2 * d->end;
|
d->begin = d->alloc - 2 * d->end;
|
||||||
@ -218,7 +230,7 @@ void **QListData::insert(int i)
|
|||||||
if (d->begin == 0) {
|
if (d->begin == 0) {
|
||||||
if (d->end == d->alloc) {
|
if (d->end == d->alloc) {
|
||||||
// If the array is full, we expand it and move some items rightward
|
// If the array is full, we expand it and move some items rightward
|
||||||
realloc(grow(d->alloc + 1));
|
realloc_grow(1);
|
||||||
} else {
|
} else {
|
||||||
// If there is free space at the end of the array, we move some items rightward
|
// If there is free space at the end of the array, we move some items rightward
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,7 @@ struct Q_CORE_EXPORT QListData {
|
|||||||
Data *detach(int alloc);
|
Data *detach(int alloc);
|
||||||
Data *detach_grow(int *i, int n);
|
Data *detach_grow(int *i, int n);
|
||||||
void realloc(int alloc);
|
void realloc(int alloc);
|
||||||
|
void realloc_grow(int growth);
|
||||||
inline void dispose() { dispose(d); }
|
inline void dispose() { dispose(d); }
|
||||||
static void dispose(Data *d);
|
static void dispose(Data *d);
|
||||||
static const Data shared_null;
|
static const Data shared_null;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user