11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
30
31
33QQmlChangeSet::QQmlChangeSet()
39
40
42QQmlChangeSet::QQmlChangeSet(
const QQmlChangeSet &changeSet)
43 : m_removes(changeSet.m_removes)
44 , m_inserts(changeSet.m_inserts)
45 , m_changes(changeSet.m_changes)
46 , m_difference(changeSet.m_difference)
51
52
54QQmlChangeSet::~QQmlChangeSet()
59
60
62QQmlChangeSet &QQmlChangeSet::operator =(
const QQmlChangeSet &changeSet)
64 m_removes = changeSet.m_removes;
65 m_inserts = changeSet.m_inserts;
66 m_changes = changeSet.m_changes;
67 m_difference = changeSet.m_difference;
72
73
75void QQmlChangeSet::insert(
int index,
int count)
77 insert(QVector<Change>() << Change(index, count));
81
82
84void QQmlChangeSet::remove(
int index,
int count)
86 QVector<Change> removes;
87 removes.append(Change(index, count));
88 remove(&removes,
nullptr);
92
93
94
95
96
98void QQmlChangeSet::move(
int from,
int to,
int count,
int moveId)
100 QVector<Change> removes;
101 removes.append(Change(from, count, moveId));
102 QVector<Change> inserts;
103 inserts.append(Change(to, count, moveId));
104 remove(&removes, &inserts);
109
110
112void QQmlChangeSet::change(
int index,
int count)
114 QVector<Change> changes;
115 changes.append(Change(index, count));
120
121
123void QQmlChangeSet::apply(
const QQmlChangeSet &changeSet)
125 QVector<Change> r = changeSet.m_removes;
126 QVector<Change> i = changeSet.m_inserts;
127 QVector<Change> c = changeSet.m_changes;
134
135
136
137
138
140void QQmlChangeSet::remove(
const QVector<Change> &removes, QVector<Change> *inserts)
142 QVector<Change> r = removes;
146void QQmlChangeSet::remove(QVector<Change> *removes, QVector<Change> *inserts)
150 QVector<Change>::iterator insert = m_inserts.begin();
151 QVector<Change>::iterator change = m_changes.begin();
152 QVector<Change>::iterator rit = removes->begin();
153 for (; rit != removes->end(); ++rit) {
154 int index = rit->index + removeCount;
155 int count = rit->count;
159 for (; change != m_changes.end() && change->end() < rit->index; ++change)
160 change->index -= removeCount;
162 for (; change != m_changes.end() && change->index > rit->end(); ++change) {
163 change->count -= qMin(change->end(), rit->end()) - qMax(change->index, rit->index);
164 if (change->count == 0) {
165 change = m_changes.erase(change);
166 }
else if (rit->index < change->index) {
167 change->index = rit->index;
173 for (; insert != m_inserts.end() && insert->end() <= index; ++insert) {
174 insertCount += insert->count;
175 insert->index -= removeCount;
178 rit->index -= insertCount;
181 while (insert != m_inserts.end() && insert->index < index + count) {
182 int offset = index - insert->index;
183 const int difference = qMin(insert->end(), index + count) - qMax(insert->index, index);
188 if (offset < 0 && rit->moveId != -1) {
189 rit = removes->insert(rit, Change(
190 rit->index, -offset, rit->moveId, rit->offset));
192 rit->count -= -offset;
193 rit->offset += -offset;
196 removeCount += -offset;
198 }
else if (offset > 0 && insert->moveId != -1) {
199 insert = m_inserts.insert(insert, Change(
200 insert->index - removeCount, offset, insert->moveId, insert->offset));
202 insert->index += offset;
203 insert->count -= offset;
204 insert->offset += offset;
205 rit->index -= offset;
206 insertCount += offset;
211 if (rit->moveId != -1 && difference > 0 && inserts) {
212 for (QVector<Change>::iterator iit = inserts->begin(); iit != inserts->end(); ++iit) {
213 if (iit->moveId != rit->moveId
214 || rit->offset > iit->offset + iit->count
215 || iit->offset > rit->offset + difference) {
220 const int overlapOffset = rit->offset - iit->offset;
221 if (overlapOffset > 0) {
222 iit = inserts->insert(iit, Change(
223 iit->index, overlapOffset, iit->moveId, iit->offset));
225 iit->index += overlapOffset;
226 iit->count -= overlapOffset;
227 iit->offset += overlapOffset;
229 if (iit->offset >= rit->offset
230 && iit->offset + iit->count <= rit->offset + difference) {
233 iit->moveId = insert->moveId;
234 iit->offset = insert->offset + qMax(0, -overlapOffset);
239 = qMin(iit->offset + iit->count, rit->offset + difference)
240 - qMax(iit->offset, rit->offset);
241 iit = inserts->insert(iit, Change(
245 insert->offset + qMax(0, -overlapOffset)));
249 iit->offset += count;
255 insert->count -= difference;
256 insert->offset += difference;
257 rit->count -= difference;
258 rit->offset += difference;
262 removeCount += difference;
264 if (insert->count == 0) {
265 insert = m_inserts.erase(insert);
266 }
else if (rit->count == -offset || rit->count == 0) {
267 insert->index += difference;
270 insert->index -= removeCount - difference;
271 rit->index -= insert->count;
272 insertCount += insert->count;
276 removeCount += rit->count;
278 for (; insert != m_inserts.end(); ++insert)
279 insert->index -= removeCount;
282 QVector<Change>::iterator remove = m_removes.begin();
283 for (rit = removes->begin(); rit != removes->end(); ++rit) {
287 for (QVector<Change>::iterator next = rit + 1; next != removes->end()
288 && next->index == rit->index
289 && next->moveId == -1
290 && rit->moveId == -1; ++next) {
291 next->count += rit->count;
294 int index = rit->index + removeCount;
297 for (; remove != m_removes.end() && index > remove->index; ++remove)
298 remove->index -= removeCount;
299 while (remove != m_removes.end() && index + rit->count >= remove->index) {
301 const int offset = remove->index - index;
302 QVector<Change>::iterator rend = remove;
303 for (; rend != m_removes.end()
305 && rend->moveId == -1
306 && index + rit->count >= rend->index; ++rend) {
307 count += rend->count;
309 if (remove != rend) {
313 if (rend == m_removes.end()) {
314 difference = rit->count;
315 }
else if (rit->index + rit->count < rend->index - removeCount) {
316 difference = rit->count;
317 }
else if (rend->moveId != -1) {
318 difference = rend->index - removeCount - rit->index;
323 rit->count -= difference;
324 removeCount += difference;
325 remove->index = rit->index;
326 remove->count = count;
327 remove = m_removes.erase(++remove, rend);
332 remove = m_removes.insert(remove, Change(
333 rit->index, offset, rit->moveId, rit->offset));
335 rit->count -= offset;
336 rit->offset += offset;
337 removeCount += offset;
340 remove->index = rit->index;
346 if (rit->count > 0) {
347 remove = m_removes.insert(remove, *rit);
350 removeCount += rit->count;
352 for (; remove != m_removes.end(); ++remove)
353 remove->index -= removeCount;
354 m_difference -= removeCount;
358
359
361void QQmlChangeSet::insert(
const QVector<Change> &inserts)
364 QVector<Change>::iterator insert = m_inserts.begin();
365 QVector<Change>::iterator change = m_changes.begin();
366 for (QVector<Change>::const_iterator iit = inserts.begin(); iit != inserts.end(); ++iit) {
369 int index = iit->index - insertCount;
371 Change current = *iit;
373 for (QVector<Change>::const_iterator next = iit + 1; next != inserts.end()
374 && next->index == iit->index + iit->count
375 && next->moveId == -1
376 && iit->moveId == -1; ++next) {
377 current.count += next->count;
383 for (; change != m_changes.end() && change->index >= index; ++change)
384 change->index += insertCount;
387 if (change != m_changes.end() && change->index < index + iit->count) {
388 int offset = index - change->index;
389 change = m_changes.insert(change, Change(change->index + insertCount, offset));
391 change->index += iit->count + offset;
392 change->count -= offset;
397 for (; insert != m_inserts.end() && index > insert->index + insert->count; ++insert)
398 insert->index += insertCount;
399 if (insert == m_inserts.end()) {
400 insert = m_inserts.insert(insert, current);
403 const int offset = index - insert->index;
408 insert = m_inserts.insert(insert, current);
410 }
else if (iit->moveId == -1 && insert->moveId == -1) {
413 if (offset < insert->count) {
414 insert->index -= current.count;
415 insert->count += current.count;
417 insert->index += insertCount;
418 insert->count += current.count;
421 }
else if (offset < insert->count) {
425 insert = m_inserts.insert(insert, Change(
426 insert->index + insertCount, offset, insert->moveId, insert->offset));
428 insert->index += offset;
429 insert->count -= offset;
430 insert->offset += offset;
432 insert = m_inserts.insert(insert, current);
435 insert->index += insertCount;
437 insert = m_inserts.insert(insert, current);
441 insertCount += current.count;
443 for (; insert != m_inserts.end(); ++insert)
444 insert->index += insertCount;
445 m_difference += insertCount;
449
450
451
453void QQmlChangeSet::move(
const QVector<Change> &removes,
const QVector<Change> &inserts)
455 QVector<Change> r = removes;
456 QVector<Change> i = inserts;
462
463
465void QQmlChangeSet::change(
const QVector<Change> &changes)
467 QVector<Change> c = changes;
471void QQmlChangeSet::change(QVector<Change> *changes)
473 QVector<Change>::iterator insert = m_inserts.begin();
474 QVector<Change>::iterator change = m_changes.begin();
475 for (QVector<Change>::iterator cit = changes->begin(); cit != changes->end(); ++cit) {
476 for (; insert != m_inserts.end() && insert->end() < cit->index; ++insert) {}
477 for (; insert != m_inserts.end() && insert->index < cit->end(); ++insert) {
478 const int offset = insert->index - cit->index;
479 const int count = cit->count + cit->index - insert->index - insert->count;
481 cit->index = insert->index + insert->count;
484 cit = changes->insert(++cit, Change(insert->index + insert->count, count));
490 for (; change != m_changes.end() && change->index + change->count < cit->index; ++change) {}
491 if (change == m_changes.end() || change->index > cit->index + cit->count) {
492 if (cit->count > 0) {
493 change = m_changes.insert(change, *cit);
497 if (cit->index < change->index) {
498 change->count += change->index - cit->index;
499 change->index = cit->index;
502 if (cit->index + cit->count > change->index + change->count) {
503 change->count = cit->index + cit->count - change->index;
504 QVector<Change>::iterator cbegin = change;
505 QVector<Change>::iterator cend = ++cbegin;
506 for (; cend != m_changes.end() && cend->index <= change->index + change->count; ++cend) {
507 if (cend->index + cend->count > change->index + change->count)
508 change->count = cend->index + cend->count - change->index;
510 if (cbegin != cend) {
511 change = m_changes.erase(cbegin, cend);
520
521
522
523
527 QDebugStateSaver stateSaver(debug);
528 debug.nospace() <<
"QQmlChangeSet(";
529 const QVector<QQmlChangeSet::Change> &removes = set.removes();
530 for (
const QQmlChangeSet::Change &remove : removes)
531 debug << remove <<
' ';
532 const QVector<QQmlChangeSet::Change> &inserts = set.inserts();
533 for (
const QQmlChangeSet::Change &insert : inserts)
534 debug << insert <<
' ';
535 const QVector<QQmlChangeSet::Change> &changes = set.changes();
536 for (
const QQmlChangeSet::Change &change : changes)
537 debug << change <<
' ';
538 return debug.nospace() <<
')';
542
543
544
545
549 QDebugStateSaver stateSaver(debug);
550 return debug.nospace() <<
"Change(" << change.index <<
',' << change.count <<
')';
QDebug operator<<(QDebug dbg, const QFileInfo &fi)