RangesMatcher constructor

RangesMatcher(
  1. List<Range> ranges
)

Implementation

factory RangesMatcher(List<Range> ranges) {
  if (ranges.isEmpty) {
    throw ArgumentError.value(ranges, 'ranges', 'Must not be empty');
  }

  ranges = ranges.toList();
  ranges.sort();
  Range.check(ranges);
  final list = Uint64List(ranges.length << 1);
  final starts = Uint64List(ranges.length);
  final ends = Uint64List(ranges.length);
  var index1 = 0;
  var index2 = 0;
  for (final range in ranges) {
    final start = range.start;
    final end = range.end;
    list[index1++] = start;
    list[index1++] = end;
    starts[index2] = start;
    ends[index2] = end;
    index2++;
  }

  switch (list.length >> 1) {
    case 1:
      return _Ranges1Matcher(list[0], list[1]);
    case 2:
      return _Ranges2Matcher(list[0], list[1], list[2], list[3]);
    case 3:
      return _Ranges3Matcher(
          list[0], list[1], list[2], list[3], list[4], list[5]);
    case 4:
      return _Ranges4Matcher(list[0], list[1], list[2], list[3], list[4],
          list[5], list[6], list[7]);
    case 5:
      return _Ranges5Matcher(list[0], list[1], list[2], list[3], list[4],
          list[5], list[6], list[7], list[8], list[9]);
    case 6:
      return _Ranges6Matcher(list[0], list[1], list[2], list[3], list[4],
          list[5], list[6], list[7], list[8], list[9], list[10], list[11]);
    case 7:
      return _Ranges7Matcher(
          list[0],
          list[1],
          list[2],
          list[3],
          list[4],
          list[5],
          list[6],
          list[7],
          list[8],
          list[9],
          list[10],
          list[11],
          list[12],
          list[13]);
    case 8:
      return _Ranges8Matcher(
          list[0],
          list[1],
          list[2],
          list[3],
          list[4],
          list[5],
          list[6],
          list[7],
          list[8],
          list[9],
          list[10],
          list[11],
          list[12],
          list[13],
          list[14],
          list[15]);
  }

  return _RangesMatcher(starts, ends);
}