@@ -939,6 +939,7 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
939
939
940
940
bool _check (Iterable collection) {
941
941
_reset ();
942
+
942
943
if (collection is UnmodifiableListView && identical (_iterable, collection)) {
943
944
// Short circuit and assume that the list has not been modified.
944
945
return false ;
@@ -988,11 +989,9 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
988
989
*/
989
990
void _reset () {
990
991
if (isDirty) {
991
- // Record the state of the collection for a possible _revertToPreviousState()
992
- for (ItemRecord <V > record = _previousItHead = _itHead;
993
- record != null ;
994
- record = record._next) {
995
- record._nextPrevious = record._next;
992
+ // Record the state of the collection for a possible `_revertToPreviousState()`
993
+ for (ItemRecord <V > r = _previousItHead = _itHead; r != null ; r = r._next) {
994
+ r._nextPrevious = r._next;
996
995
}
997
996
_undoDeltas ();
998
997
}
@@ -1043,33 +1042,37 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
1043
1042
return record..item = item;
1044
1043
}
1045
1044
1046
- if (item is num && (item as num ).isNaN && record.item is num && (record.item as num ).isNaN){
1045
+ if (item is num && (item as num ).isNaN && record.item is num && (record.item as num ).isNaN) {
1047
1046
// we need this for JavaScript since in JS NaN !== NaN.
1048
1047
return record;
1049
1048
}
1050
1049
}
1051
1050
1052
- // find the previous record so that we know where to insert after.
1053
- ItemRecord <V > prev = record == null ? _itTail : record._prev;
1051
+ // The previous record after which we will append the current one.
1052
+ ItemRecord <V > previousRecord;
1053
+
1054
+ if (record == null ) {
1055
+ previousRecord = _itTail;
1056
+ } else {
1057
+ previousRecord = record._prev;
1058
+ // Remove the record from the collection since we know it does not match the item.
1059
+ _remove (record);
1060
+ }
1054
1061
1055
- // Remove the record from the collection since we know it does not match the
1056
- // item.
1057
- if (record != null ) _collection_remove (record);
1058
1062
// Attempt to see if we have seen the item before.
1059
1063
record = _movedItems.get (item, index);
1060
1064
if (record != null ) {
1061
1065
// We have seen this before, we need to move it forward in the collection.
1062
- _collection_moveAfter (record, prev , index);
1066
+ _moveAfter (record, previousRecord , index);
1063
1067
} else {
1064
1068
// Never seen it, check evicted list.
1065
1069
record = _removedItems.get (item);
1066
1070
if (record != null ) {
1067
- // It is an item which we have earlier evict it, reinsert it back into
1068
- // the list.
1069
- _collection_reinsertAfter (record, prev, index);
1071
+ // It is an item which we have evicted earlier: reinsert it back into the list.
1072
+ _collection_reinsertAfter (record, previousRecord, index);
1070
1073
} else {
1071
- // It is a new item add it.
1072
- record = _collection_addAfter (new ItemRecord <V >(item), prev , index);
1074
+ // It is a new item: add it.
1075
+ record = _addAfter (new ItemRecord <V >(item), previousRecord , index);
1073
1076
}
1074
1077
}
1075
1078
return record;
@@ -1101,14 +1104,13 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
1101
1104
* position. This is incorrect, since a better way to think of it is as insert
1102
1105
* of 'b' rather then switch 'a' with 'b' and then add 'a' at the end.
1103
1106
*/
1104
- ItemRecord <V > verifyReinsertion (ItemRecord record, dynamic item,
1105
- int index) {
1107
+ ItemRecord <V > verifyReinsertion (ItemRecord record, item, int index) {
1106
1108
ItemRecord <V > reinsertRecord = _removedItems.get (item);
1107
1109
if (reinsertRecord != null ) {
1108
1110
record = _collection_reinsertAfter (reinsertRecord, record._prev, index);
1109
1111
} else if (record.currentIndex != index) {
1110
1112
record.currentIndex = index;
1111
- _moves_add (record);
1113
+ _addToMoves (record);
1112
1114
}
1113
1115
return record;
1114
1116
}
@@ -1122,7 +1124,7 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
1122
1124
// Anything after that needs to be removed;
1123
1125
while (record != null ) {
1124
1126
ItemRecord <V > nextRecord = record._next;
1125
- _removals_add ( _collection_unlink (record));
1127
+ _addToRemovals ( _unlink (record));
1126
1128
record = nextRecord;
1127
1129
}
1128
1130
_removedItems.clear ();
@@ -1154,24 +1156,24 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
1154
1156
next._prevRemoved = prev;
1155
1157
}
1156
1158
1157
- _collection_insertAfter (record, insertPrev, index);
1158
- _moves_add (record);
1159
+ _insertAfter (record, insertPrev, index);
1160
+ _addToMoves (record);
1159
1161
return record;
1160
1162
}
1161
1163
1162
- ItemRecord <V > _collection_moveAfter (ItemRecord <V > record,
1163
- ItemRecord <V > prev ,
1164
+ ItemRecord <V > _moveAfter (ItemRecord <V > record,
1165
+ ItemRecord <V > prevRecord ,
1164
1166
int index) {
1165
- _collection_unlink (record);
1166
- _collection_insertAfter (record, prev , index);
1167
- _moves_add (record);
1167
+ _unlink (record);
1168
+ _insertAfter (record, prevRecord , index);
1169
+ _addToMoves (record);
1168
1170
return record;
1169
1171
}
1170
1172
1171
- ItemRecord <V > _collection_addAfter (ItemRecord <V > record,
1172
- ItemRecord <V > prev ,
1173
+ ItemRecord <V > _addAfter (ItemRecord <V > record,
1174
+ ItemRecord <V > prevRecord ,
1173
1175
int index) {
1174
- _collection_insertAfter (record, prev , index);
1176
+ _insertAfter (record, prevRecord , index);
1175
1177
1176
1178
if (_additionsTail == null ) {
1177
1179
assert (_additionsHead == null );
@@ -1184,38 +1186,37 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
1184
1186
return record;
1185
1187
}
1186
1188
1187
- ItemRecord <V > _collection_insertAfter (ItemRecord <V > record,
1188
- ItemRecord <V > prev ,
1189
+ ItemRecord <V > _insertAfter (ItemRecord <V > record,
1190
+ ItemRecord <V > prevRecord ,
1189
1191
int index) {
1190
- assert (record != prev );
1192
+ assert (record != prevRecord );
1191
1193
assert (record._next == null );
1192
1194
assert (record._prev == null );
1193
1195
1194
- ItemRecord <V > next = prev == null ? _itHead : prev ._next;
1196
+ ItemRecord <V > next = prevRecord == null ? _itHead : prevRecord ._next;
1195
1197
assert (next != record);
1196
- assert (prev != record);
1198
+ assert (prevRecord != record);
1197
1199
record._next = next;
1198
- record._prev = prev ;
1200
+ record._prev = prevRecord ;
1199
1201
if (next == null ) {
1200
1202
_itTail = record;
1201
1203
} else {
1202
1204
next._prev = record;
1203
1205
}
1204
- if (prev == null ) {
1206
+ if (prevRecord == null ) {
1205
1207
_itHead = record;
1206
1208
} else {
1207
- prev ._next = record;
1209
+ prevRecord ._next = record;
1208
1210
}
1209
1211
1210
1212
_movedItems.put (record);
1211
1213
record.currentIndex = index;
1212
1214
return record;
1213
1215
}
1214
1216
1215
- ItemRecord <V > _collection_remove (ItemRecord record) =>
1216
- _removals_add (_collection_unlink (record));
1217
+ ItemRecord <V > _remove (ItemRecord record) => _addToRemovals (_unlink (record));
1217
1218
1218
- ItemRecord <V > _collection_unlink (ItemRecord record) {
1219
+ ItemRecord <V > _unlink (ItemRecord record) {
1219
1220
_movedItems.remove (record);
1220
1221
1221
1222
var prev = record._prev;
@@ -1238,7 +1239,7 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
1238
1239
return record;
1239
1240
}
1240
1241
1241
- ItemRecord <V > _moves_add (ItemRecord <V > record) {
1242
+ ItemRecord <V > _addToMoves (ItemRecord <V > record) {
1242
1243
assert (record._nextMoved == null );
1243
1244
if (_movesTail == null ) {
1244
1245
assert (_movesHead == null );
@@ -1251,9 +1252,9 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
1251
1252
return record;
1252
1253
}
1253
1254
1254
- ItemRecord <V > _removals_add (ItemRecord <V > record) {
1255
- record.currentIndex = null ;
1255
+ ItemRecord <V > _addToRemovals (ItemRecord <V > record) {
1256
1256
_removedItems.put (record);
1257
+ record.currentIndex = null ;
1257
1258
1258
1259
if (_removalsTail == null ) {
1259
1260
assert (_removalsHead == null );
@@ -1325,35 +1326,37 @@ class ItemRecord<V> extends CollectionChangeItem<V> {
1325
1326
1326
1327
/// A linked list of [ItemRecord] s with the same [ItemRecord.item]
1327
1328
class _DuplicateItemRecordList {
1328
- ItemRecord head, tail ;
1329
+ ItemRecord _head, _tail ;
1329
1330
1330
1331
/**
1331
1332
* Add the [record] before the [insertBefore] in the list of duplicates or at the end of the list
1332
1333
* when no [insertBefore] is specified.
1333
1334
*
1334
1335
* Note: by design all records in the list of duplicates hold the save value in [record.item] .
1335
1336
*/
1336
- void add (ItemRecord record, ItemRecord previousRecord) {
1337
- assert (previousRecord == null || previousRecord.item == record.item);
1338
- if (head == null ) {
1339
- assert (previousRecord == null );
1340
- head = tail = record;
1337
+ void add (ItemRecord record, ItemRecord insertBefore) {
1338
+ assert (insertBefore == null || insertBefore.item == record.item);
1339
+ if (_head == null ) {
1340
+ /// pushing the first [ItemRecord] to the list
1341
+ assert (insertBefore == null );
1342
+ _head = _tail = record;
1341
1343
record._nextDup = null ;
1342
1344
record._prevDup = null ;
1343
1345
} else {
1344
- assert (record.item == head.item);
1345
- if (previousRecord == null ) {
1346
- tail._nextDup = record;
1347
- record._prevDup = tail;
1346
+ // adding a duplicate [ItemRecord] to the list
1347
+ assert (record.item == _head.item);
1348
+ if (insertBefore == null ) {
1349
+ _tail._nextDup = record;
1350
+ record._prevDup = _tail;
1348
1351
record._nextDup = null ;
1349
- tail = record;
1352
+ _tail = record;
1350
1353
} else {
1351
- var prev = previousRecord ._prevDup;
1352
- var next = previousRecord ;
1354
+ var prev = insertBefore ._prevDup;
1355
+ var next = insertBefore ;
1353
1356
record._prevDup = prev;
1354
1357
record._nextDup = next;
1355
1358
if (prev == null ) {
1356
- head = record;
1359
+ _head = record;
1357
1360
} else {
1358
1361
prev._nextDup = record;
1359
1362
}
@@ -1366,13 +1369,12 @@ class _DuplicateItemRecordList {
1366
1369
/// [hideIndex]
1367
1370
ItemRecord get (item, int hideIndex) {
1368
1371
ItemRecord record;
1369
- for (record = head; record != null ; record = record._nextDup) {
1370
- if ((hideIndex == null || hideIndex < record.currentIndex) &&
1371
- identical (record.item, key)) {
1372
+ for (record = _head; record != null ; record = record._nextDup) {
1373
+ if ((hideIndex == null || hideIndex < record.currentIndex) && identical (record.item, item)) {
1372
1374
return record;
1373
1375
}
1374
1376
}
1375
- return record ;
1377
+ return null ;
1376
1378
}
1377
1379
1378
1380
/**
@@ -1382,8 +1384,8 @@ class _DuplicateItemRecordList {
1382
1384
*/
1383
1385
bool remove (ItemRecord record) {
1384
1386
assert (() {
1385
- // verify that the record being removed is someplace in the list.
1386
- for (ItemRecord cursor = head ; cursor != null ; cursor = cursor._nextDup) {
1387
+ // verify that the record being removed is in the list.
1388
+ for (ItemRecord cursor = _head ; cursor != null ; cursor = cursor._nextDup) {
1387
1389
if (identical (cursor, record)) return true ;
1388
1390
}
1389
1391
return false ;
@@ -1392,16 +1394,16 @@ class _DuplicateItemRecordList {
1392
1394
var prev = record._prevDup;
1393
1395
var next = record._nextDup;
1394
1396
if (prev == null ) {
1395
- head = next;
1397
+ _head = next;
1396
1398
} else {
1397
1399
prev._nextDup = next;
1398
1400
}
1399
1401
if (next == null ) {
1400
- tail = prev;
1402
+ _tail = prev;
1401
1403
} else {
1402
1404
next._prevDup = prev;
1403
1405
}
1404
- return head == null ;
1406
+ return _head == null ;
1405
1407
}
1406
1408
}
1407
1409
@@ -1414,9 +1416,8 @@ class _DuplicateItemRecordList {
1414
1416
class DuplicateMap {
1415
1417
final map = < dynamic , _DuplicateItemRecordList > {};
1416
1418
1417
- void put (ItemRecord record, [ItemRecord beforeRecord = null ]) {
1418
- map.putIfAbsent (record.item, () => new _DuplicateItemRecordList ())
1419
- .add (record, beforeRecord);
1419
+ void put (ItemRecord record, [ItemRecord insertBefore = null ]) {
1420
+ map.putIfAbsent (record.item, () => new _DuplicateItemRecordList ()).add (record, insertBefore);
1420
1421
}
1421
1422
1422
1423
/**
@@ -1437,8 +1438,9 @@ class DuplicateMap {
1437
1438
* The list of duplicates also is removed from the map if it gets empty.
1438
1439
*/
1439
1440
ItemRecord remove (ItemRecord record) {
1441
+ assert (map.containsKey (record.item));
1440
1442
_DuplicateItemRecordList recordList = map[record.item];
1441
- assert (recordList != null );
1443
+ // Remove the list of duplicates when it gets empty
1442
1444
if (recordList.remove (record)) map.remove (record.item);
1443
1445
return record;
1444
1446
}
@@ -1449,5 +1451,5 @@ class DuplicateMap {
1449
1451
map.clear ();
1450
1452
}
1451
1453
1452
- String toString () => "$ runtimeType ($map )" ;
1454
+ String toString () => "DuplicateMap ($map )" ;
1453
1455
}
0 commit comments