performance: Override .elementAt in CachingIterable (#152477)
Add a more efficient override of `Iterable.elementAt` in `CachingIterable`. Closes #152476
This commit is contained in:
parent
cadac6bca3
commit
d836ca5a68
@ -181,6 +181,22 @@ class CachingIterable<E> extends IterableBase<E> {
|
|||||||
return _results.length;
|
return _results.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
E elementAt(int index) {
|
||||||
|
RangeError.checkNotNegative(index, 'index');
|
||||||
|
while (_results.length <= index) {
|
||||||
|
if (!_fillNext()) {
|
||||||
|
throw IndexError.withLength(
|
||||||
|
index,
|
||||||
|
_results.length,
|
||||||
|
indexable: this,
|
||||||
|
name: 'index',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _results[index];
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<E> toList({ bool growable = true }) {
|
List<E> toList({ bool growable = true }) {
|
||||||
_precacheEntireList();
|
_precacheEntireList();
|
||||||
|
@ -107,4 +107,19 @@ void main() {
|
|||||||
expect(expanded2, equals(<int>[1, 1, 2, 2, 3, 3, 4, 4, 5, 5]));
|
expect(expanded2, equals(<int>[1, 1, 2, 2, 3, 3, 4, 4, 5, 5]));
|
||||||
expect(yieldCount, equals(5));
|
expect(yieldCount, equals(5));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('The Caching Iterable: elementAt correctness', () {
|
||||||
|
final Iterable<int> integers = CachingIterable<int>(range(1, 5).iterator);
|
||||||
|
expect(yieldCount, equals(0));
|
||||||
|
|
||||||
|
expect(() => integers.elementAt(-1), throwsRangeError);
|
||||||
|
|
||||||
|
expect(integers.elementAt(1), equals(2));
|
||||||
|
expect(integers.elementAt(0), equals(1));
|
||||||
|
expect(integers.elementAt(2), equals(3));
|
||||||
|
expect(integers.elementAt(4), equals(5));
|
||||||
|
expect(integers.elementAt(3), equals(4));
|
||||||
|
|
||||||
|
expect(() => integers.elementAt(5), throwsRangeError);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user