expandRunEnds function

List<ArrowValue?> expandRunEnds(
  1. ArrowRunEndEncodedType type,
  2. List<int> runEnds,
  3. List<ArrowValue?> runValues, {
  4. int? maxLength,
})

Expands a run-end encoding to logical rows, validating run ends.

When maxLength is given, run ends are fully validated against it before any expansion, so untrusted input cannot force a large allocation.

Implementation

List<ArrowValue?> expandRunEnds(
  ArrowRunEndEncodedType type,
  List<int> runEnds,
  List<ArrowValue?> runValues, {
  int? maxLength,
}) {
  if (runEnds.length != runValues.length) {
    throw ArgumentError('runEnds and runValues lengths differ');
  }
  _checkRunEnds(type, runEnds, runValues, maxLength);
  final rows = <ArrowValue?>[];
  var previous = 0;
  for (var i = 0; i < runEnds.length; i++) {
    rows.addAll(List.filled(runEnds[i] - previous, runValues[i]));
    previous = runEnds[i];
  }
  return rows;
}