length property

  1. @override
int get length
override

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);
  1. @override
set length (int value)
override

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;
}