- m_sizeHintCache.reserve(currentCount + count);
- while (count > 0) {
- m_sizeHintCache.insert(index, QSizeF());
- ++index;
- --count;
+ m_sizeHintCache.reserve(currentCount + insertedCount);
+
+ // We build the new list from the end to the beginning to mimize the
+ // number of moves.
+ m_sizeHintCache.insert(m_sizeHintCache.end(), insertedCount, QSizeF());
+
+ int sourceIndex = currentCount - 1;
+ int targetIndex = m_sizeHintCache.count() - 1;
+ int itemsToInsertBeforeCurrentRange = insertedCount;
+
+ for (int rangeIndex = itemRanges.count() - 1; rangeIndex >= 0; --rangeIndex) {
+ const KItemRange& range = itemRanges.at(rangeIndex);
+ itemsToInsertBeforeCurrentRange -= range.count;
+
+ // First: move all existing items that must be put behind 'range'.
+ while (targetIndex >= itemsToInsertBeforeCurrentRange + range.index + range.count) {
+ m_sizeHintCache[targetIndex] = m_sizeHintCache[sourceIndex];
+ --sourceIndex;
+ --targetIndex;
+ }
+
+ // Then: insert QSizeF() for the items which are inserted into 'range'.
+ while (targetIndex >= itemsToInsertBeforeCurrentRange + range.index) {
+ m_sizeHintCache[targetIndex] = QSizeF();
+ --targetIndex;
+ }