length property
The number of elements in this Iterable.
Counting all elements may involve iterating through all elements and can
therefore be slow.
Some iterables have a more efficient way to find the number of elements.
These must override the default implementation of length
.
Implementation
@override
int get length => (_tail - _head) & (_table.length - 1);
Setting the length
changes the number of elements in the list.
The list must be growable.
If newLength
is greater than current length,
new entries are initialized to null
,
so newLength
must not be greater than the current length
if the element type E
is non-nullable.
final maybeNumbers = <int?>[1, null, 3];
maybeNumbers.length = 5;
print(maybeNumbers); // [1, null, 3, null, null]
maybeNumbers.length = 2;
print(maybeNumbers); // [1, null]
final numbers = <int>[1, 2, 3];
numbers.length = 1;
print(numbers); // [1]
numbers.length = 5; // Throws, cannot add `null`s.
Implementation
@override
set length(int value) {
if (value < 0) throw RangeError('Length $value may not be negative.');
if (value > length && null is! E) {
throw UnsupportedError(
'The length can only be increased when the element type is '
'nullable, but the current element type is `$E`.');
}
var delta = value - length;
if (delta >= 0) {
if (_table.length <= value) {
_preGrow(value);
}
_tail = (_tail + delta) & (_table.length - 1);
return;
}
var newTail = _tail + delta; // [delta] is negative.
if (newTail >= 0) {
_table.fillRange(newTail, _tail, null);
} else {
newTail += _table.length;
_table.fillRange(0, _tail, null);
_table.fillRange(newTail, _table.length, null);
}
_tail = newTail;
}