diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2016-04-25 14:43:43 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2016-04-28 07:26:52 +0000 |
commit | 9366a8be1eb7cfa5a5cb3650ae6230b46bb7e538 (patch) | |
tree | 8fc57b6e91f62d129b657b04f468a30f6f4a8449 /src/corelib/tools | |
parent | b393641888f18e3accf094c91808e2189c2138cc (diff) |
Add an early-out to QVector::operator+= and QHash::unite for empty LHS
If the container being added to is default constructed and has never
been modified, we don't have to do all the checking and iterating.
Instead we can just assign with operator=.
If the LHS is merely empty, we could lose reserve()d capacity, so only
do this for a shared-null LHS.
Change-Id: If1e3342662d10833babc7ab847ada0285073723b
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
Diffstat (limited to 'src/corelib/tools')
-rw-r--r-- | src/corelib/tools/qhash.h | 14 | ||||
-rw-r--r-- | src/corelib/tools/qvector.h | 36 |
2 files changed, 29 insertions, 21 deletions
diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h index 5e3016d313..b15dc7b07b 100644 --- a/src/corelib/tools/qhash.h +++ b/src/corelib/tools/qhash.h @@ -554,11 +554,15 @@ QHash<Key, T>::createNode(uint ah, const Key &akey, const T &avalue, Node **anex template <class Key, class T> Q_INLINE_TEMPLATE QHash<Key, T> &QHash<Key, T>::unite(const QHash &other) { - QHash copy(other); - const_iterator it = copy.constEnd(); - while (it != copy.constBegin()) { - --it; - insertMulti(it.key(), it.value()); + if (d == &QHashData::shared_null) { + *this = other; + } else { + QHash copy(other); + const_iterator it = copy.constEnd(); + while (it != copy.constBegin()) { + --it; + insertMulti(it.key(), it.value()); + } } return *this; } diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index 13ae121450..806a127cc2 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -793,24 +793,28 @@ QVector<T> &QVector<T>::fill(const T &from, int asize) template <typename T> QVector<T> &QVector<T>::operator+=(const QVector &l) { - uint newSize = d->size + l.d->size; - const bool isTooSmall = newSize > d->alloc; - if (!isDetached() || isTooSmall) { - QArrayData::AllocationOptions opt(isTooSmall ? QArrayData::Grow : QArrayData::Default); - reallocData(d->size, isTooSmall ? newSize : d->alloc, opt); - } + if (d == Data::sharedNull()) { + *this = l; + } else { + uint newSize = d->size + l.d->size; + const bool isTooSmall = newSize > d->alloc; + if (!isDetached() || isTooSmall) { + QArrayData::AllocationOptions opt(isTooSmall ? QArrayData::Grow : QArrayData::Default); + reallocData(d->size, isTooSmall ? newSize : d->alloc, opt); + } - if (d->alloc) { - T *w = d->begin() + newSize; - T *i = l.d->end(); - T *b = l.d->begin(); - while (i != b) { - if (QTypeInfo<T>::isComplex) - new (--w) T(*--i); - else - *--w = *--i; + if (d->alloc) { + T *w = d->begin() + newSize; + T *i = l.d->end(); + T *b = l.d->begin(); + while (i != b) { + if (QTypeInfo<T>::isComplex) + new (--w) T(*--i); + else + *--w = *--i; + } + d->size = newSize; } - d->size = newSize; } return *this; } |