diff options
author | Oswald Buddenhagen <oswald.buddenhagen@nokia.com> | 2010-01-28 20:07:18 (GMT) |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@nokia.com> | 2010-02-16 18:10:38 (GMT) |
commit | c03b21d272f617b037ad9d0ccaa2f442638bf302 (patch) | |
tree | 81ee508df0a38dc2decd6017f39e777af0416574 /src | |
parent | 5723f1bcb538a5624cbed871c34507ff26285878 (diff) | |
download | Qt-c03b21d272f617b037ad9d0ccaa2f442638bf302.zip Qt-c03b21d272f617b037ad9d0ccaa2f442638bf302.tar.gz Qt-c03b21d272f617b037ad9d0ccaa2f442638bf302.tar.bz2 |
optimize QList::mid()
instead of append()ing each element separately, reserve enough space and
do a low-level node copy.
obviously, the gain for small simple types is the biggest.
Reviewed-by: joao
Reviewed-by: denis
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/tools/qlist.h | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 3b9eefa..8c75c98 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -589,11 +589,20 @@ Q_OUTOFLINE_TEMPLATE QList<T> QList<T>::mid(int pos, int alength) const alength = size() - pos; if (pos == 0 && alength == size()) return *this; - QList<T> cpy; if (pos + alength > size()) alength = size() - pos; - for (int i = pos; i < pos + alength; ++i) - cpy += at(i); + QList<T> cpy; + cpy.reserve(alength); + cpy.d->end = alength; + QT_TRY { + cpy.node_copy(reinterpret_cast<Node *>(cpy.p.begin()), + reinterpret_cast<Node *>(cpy.p.end()), + reinterpret_cast<Node *>(p.begin() + pos)); + } QT_CATCH(...) { + // restore the old end + cpy.d->end = 0; + QT_RETHROW; + } return cpy; } |