LCOV - code coverage report

Current view
top level - src/converters - lazy_in_place_list.dart
Test
lcov.info
Date
2025-03-26
Legend
Lines
hit
not hit
Branches
taken
not taken
# not executed
HitTotalCoverage
Lines24324499.6%
Functions00-
Branches00-
Each row represents a line of source code
LineBranchHitsSource code
1import 'dart:math' as math;
2
3import 'package:meta/meta.dart';
4
5import '../typedefs.dart';
6
7/// Wraps a `List<dynamic>` and a `Cast<E>` converter. Items in the list
8/// are converted to `E` on demand i.e. when they are read by the program.
9/// Conversion occurs only once for each item and the original `dynamic` item
10/// is replaced with the conversion result.
11@internal
12class LazyInPlaceList<E> implements List<E> {
132 LazyInPlaceList(this._data, this._cast);
14
15 final List<dynamic> _data;
16 final Cast<E> _cast;
17
181 @override
191 E get first => _get(0);
20
211 @override
222 set first(E value) => _data[0] = value;
23
241 @override
252 bool get isEmpty => _data.isEmpty;
26
271 @override
282 bool get isNotEmpty => _data.isNotEmpty;
29
301 @override
312 Iterator<E> get iterator => _iterate().iterator;
32
331 @override
343 E get last => _get(length - 1);
35
361 @override
374 set last(E value) => _data[length - 1] = value;
38
392 @override
404 int get length => _data.length;
41
421 @override
43 set length(int value) {
442 if (value > length) null as E;
452 _data.length = value;
46 }
47
481 @override
49 Iterable<E> get reversed sync* {
504 for (var i = length - 1; i >= 0; i--) {
511 yield _get(i);
52 }
53 }
54
551 @override
56 E get single {
571 if (isEmpty) throw _ListError.noElement();
583 if (length > 1) throw _ListError.tooMany();
590 return _get(0);
60 }
61
621 @override
63 List<E> operator +(List<E> other) {
643 final l = length, tl = l + other.length;
652 if (tl == l) return toList();
662 final r = List<E>.filled(tl, other[0]);
672 for (var i = 0; i < l; i++) {
682 r[i] = _get(i);
69 }
701 r.setRange(l, tl, other);
71 return r;
72 }
73
742 @override
752 E operator [](int index) => _get(index);
76
771 @override
782 void operator []=(int index, E value) => _data[index] = value;
79
801 @override
812 void add(E value) => _data.add(value);
82
831 @override
842 void addAll(Iterable<E> iterable) => _data.addAll(iterable);
85
862 @override
87 bool any(bool Function(E element) test) {
882 final l = length;
893 for (var i = 0; i < l; i++) {
904 if (test(_get(i))) return true;
91 }
92 return false;
93 }
94
951 @override
96 Map<int, E> asMap() {
972 final r = <int, E>{}, l = length;
982 for (var i = 0; i < l; i++) {
992 r[i] = _get(i);
100 }
101 return r;
102 }
103
1041 @override
1052 List<R> cast<R>() => _forceCast().cast<R>();
106
1071 @override
1082 void clear() => _data.clear();
109
1102 @override
111 bool contains(Object? element) {
1122 final l = length;
1134 for (var i = 0; i < l; i++) {
1144 if (element == _get(i)) return true;
115 }
116 return false;
117 }
118
1191 @override
1201 E elementAt(int index) => _get(index);
121
1221 @override
123 bool every(bool Function(E element) test) {
1241 final l = length;
1252 for (var i = 0; i < l; i++) {
1262 if (!test(_get(i))) return false;
127 }
128 return true;
129 }
130
1311 @override
132 Iterable<U> expand<U>(Iterable<U> Function(E element) toElements) sync* {
1331 final l = length;
1342 for (var i = 0; i < l; i++) {
1352 yield* toElements(_get(i));
136 }
137 }
138
1391 @override
140 void fillRange(int start, int end, [E? fillValue]) =>
1412 _data.fillRange(start, end, fillValue);
142
1431 @override
144 E firstWhere(bool Function(E element) test, {E Function()? orElse}) {
1451 final l = length;
1462 for (var i = 0; i < l; i++) {
1471 final v = _get(i);
1481 if (test(v)) return v;
149 }
1501 if (orElse != null) return orElse();
1511 throw _ListError.noElement();
152 }
153
1541 @override
155 U fold<U>(U initialValue, U Function(U previousValue, E element) combine) {
1561 final l = length;
157 U res = initialValue;
1582 for (var i = 0; i < l; i++) {
1592 res = combine(res, _get(i));
160 }
161 return res;
162 }
163
1641 @override
165 Iterable<E> followedBy(Iterable<E> other) sync* {
1661 final l = length;
1672 for (var i = 0; i < l; i++) {
1681 yield _get(i);
169 }
170 yield* other;
171 }
172
1731 @override
174 void forEach(void Function(E element) action) {
1751 final l = length;
1762 for (var i = 0; i < l; i++) {
1772 action(_get(i));
178 }
179 }
180
1811 @override
182 Iterable<E> getRange(int start, int end) sync* {
1832 RangeError.checkValidRange(start, end, length);
1842 for (var i = start; i < end; i++) {
1851 yield _get(i);
186 }
187 }
188
1891 @override
190 int indexOf(E element, [int start = 0]) {
1911 final l = length;
1922 for (var i = start; i < l; i++) {
1932 if (_get(i) == element) return i;
194 }
1951 return -1;
196 }
197
1981 @override
199 int indexWhere(bool Function(E element) test, [int start = 0]) {
2001 final l = length;
2012 for (var i = start; i < l; i++) {
2022 if (test(_get(i))) return i;
203 }
2041 return -1;
205 }
206
2071 @override
2082 void insert(int index, E element) => _data.insert(index, element);
209
2101 @override
211 void insertAll(int index, Iterable<E> iterable) =>
2122 _data.insertAll(index, iterable);
213
2141 @override
215 String join([String separator = ""]) {
2161 final buffer = StringBuffer();
2171 final l = length;
2181 if (l > 0) {
2193 buffer.write(_get(0).toString());
2202 for (var i = 1; i < l; i++) {
2211 buffer.write(separator);
2223 buffer.write(_get(i).toString());
223 }
224 }
2251 return buffer.toString();
226 }
227
2281 @override
229 int lastIndexOf(E element, [int? start]) {
2304 for (var i = start ?? (length - 1); i >= 0; i--) {
2312 if (element == _get(i)) return i;
232 }
2331 return -1;
234 }
235
2361 @override
237 int lastIndexWhere(bool Function(E element) test, [int? start]) {
2384 for (var i = start ?? (length - 1); i >= 0; i--) {
2392 if (test(_get(i))) return i;
240 }
2411 return -1;
242 }
243
2441 @override
245 E lastWhere(bool Function(E element) test, {E Function()? orElse}) {
2464 for (var i = length - 1; i >= 0; i--) {
2471 final v = _get(i);
2481 if (test(v)) return v;
249 }
2501 if (orElse != null) return orElse();
2511 throw _ListError.noElement();
252 }
253
2541 @override
255 Iterable<U> map<U>(U Function(E e) toElement) sync* {
2561 final l = length;
2572 for (var i = 0; i < l; i++) {
2582 yield toElement(_get(i));
259 }
260 }
261
2621 @override
263 E reduce(E Function(E value, E element) combine) {
2641 final l = length;
2651 if (l == 0) throw _ListError.noElement();
2661 E res = _get(0);
2672 for (var i = 1; i < l; i++) {
2682 res = combine(res, _get(i));
269 }
270 return res;
271 }
272
2731 @override
2742 bool remove(Object? value) => _data.remove(value);
275
2761 @override
277 E removeAt(int index) {
2781 final v = _get(index);
2792 _data.removeAt(index);
280 return v;
281 }
282
2831 @override
284 E removeLast() {
2853 final v = _get(length - 1);
2862 _data.removeLast();
287 return v;
288 }
289
2901 @override
2912 void removeRange(int start, int end) => _data.removeRange(start, end);
292
2931 @override
294 void removeWhere(bool Function(E element) test) {
2952 var i = length - 1;
2961 while (i >= 0) {
2972 if (test(_get(i))) {
2981 final e = i + 1;
2991 i--;
3003 while (i >= 0 && test(_get(i))) {
3011 i--;
302 }
3032 removeRange(i + 1, e);
304 } else {
3051 i--;
306 }
307 }
308 }
309
3101 @override
311 void replaceRange(int start, int end, Iterable<E> replacements) =>
3122 _data.replaceRange(start, end, replacements);
313
3141 @override
315 void retainWhere(bool Function(E element) test) =>
3163 removeWhere((e) => !test(e));
317
3181 @override
3192 void setAll(int index, Iterable<E> iterable) => _data.setAll(index, iterable);
320
3211 @override
322 void setRange(int start, int end, Iterable<E> iterable,
323 [int skipCount = 0]) =>
3242 _data.setRange(start, end, iterable, skipCount);
325
3261 @override
3272 void shuffle([math.Random? random]) => _data.shuffle(random);
328
3291 @override
330 E singleWhere(bool Function(E element) test, {E Function()? orElse}) {
331 late E res;
3321 final l = length;
333 var found = false;
3342 for (var i = 0; i < l; i++) {
3351 final v = _get(i);
3361 if (test(v)) {
3371 if (found) throw _ListError.tooMany();
338 found = true;
339 res = v;
340 }
341 }
342 if (found) return res;
3431 if (orElse != null) return orElse();
3441 throw _ListError.noElement();
345 }
346
3471 @override
348 Iterable<E> skip(int count) sync* {
3491 final l = length;
3502 for (var i = count; i < l; i++) {
3511 yield _get(i);
352 }
353 }
354
3551 @override
356 Iterable<E> skipWhile(bool Function(E value) test) sync* {
357 var i = 0;
3581 final l = length;
3593 while (i < l && test(_get(i))) {
3601 i++;
361 }
3621 while (i < l) {
3631 yield _get(i);
3641 i++;
365 }
366 }
367
3681 @override
369 void sort([int Function(E a, E b)? compare]) {
3701 _forceCast();
371 if (compare == null) {
3722 final d = _data.cast<E>();
3731 d.sort();
374 } else {
3754 _data.sort((a, b) => compare(a as E, b as E));
376 }
377 }
378
3791 @override
380 List<E> sublist(int start, [int? end]) =>
3813 getRange(start, end ?? length).toList();
382
3831 @override
384 Iterable<E> take(int count) sync* {
3852 final c = math.min(count, length);
3862 for (var i = 0; i < c; i++) {
3871 yield _get(i);
388 }
389 }
390
3911 @override
392 Iterable<E> takeWhile(bool Function(E value) test) sync* {
3931 final l = length;
3942 for (var i = 0; i < l; i++) {
3951 final v = _get(i);
3961 if (!test(v)) break;
397 yield v;
398 }
399 }
400
4011 @override
402 List<E> toList({bool growable = true}) {
4031 final l = length;
4041 if (l == 0) return growable ? [] : const [];
4052 final res = List.filled(l, _get(0), growable: growable);
4062 for (var i = 1; i < l; i++) {
4072 res[i] = _get(i);
408 }
409 return res;
410 }
411
4121 @override
413 Set<E> toSet() {
4141 final s = <E>{}, l = length;
4152 for (var i = 0; i < l; i++) {
4162 s.add(_get(i));
417 }
418 return s;
419 }
420
4211 @override
422 String toString() {
4231 _forceCast();
4242 return _data.toString();
425 }
426
4271 @override
428 Iterable<E> where(bool Function(E element) test) sync* {
4291 final l = length;
4302 for (var i = 0; i < l; i++) {
4311 final v = _get(i);
4321 if (test(v)) yield v;
433 }
434 }
435
4361 @override
437 Iterable<U> whereType<U>() sync* {
4381 final l = length;
4392 for (var i = 0; i < l; i++) {
4401 final v = _get(i);
4411 if (v is U) yield v;
442 }
443 }
444
4451 List<dynamic> _forceCast() {
4461 final l = length;
4472 for (var i = 0; i < l; i++) {
4481 _get(i);
449 }
4501 return _data;
451 }
452
4532 E _get(int idx) {
4544 dynamic v = _data[idx];
4552 if (v != null && v is! E) {
4564 v = _cast(v);
4574 _data[idx] = v;
458 }
459 return v;
460 }
461
4621 Iterable<E> _iterate() sync* {
4631 final l = length;
4642 for (var i = 0; i < l; i++) {
4651 yield _get(i);
466 }
467 }
468}
469
470// copied from dart-sdk\lib\internal\iterable.dart
471sealed class _ListError {
4722 static StateError noElement() => StateError("No element");
4732 static StateError tooMany() => StateError("Too many elements");
474}
Choose Features