copyRange method - List class - dart:core library (original) (raw)

copyRange<T> static method

void copyRange<T>(

  1. List<T> target,
  2. int at,
  3. List<T> source, [
  4. int? start,
  5. int? end, ])

Copy a range of one list into another list.

This is a utility function that can be used to implement methods likesetRange.

The range from start to end must be a valid range of source, and there must be room for end - start elements from position at. If start is omitted, it defaults to zero. If end is omitted, it defaults to source.length.

If source and target are the same list, overlapping source and target ranges are respected so that the target range ends up containing the initial content of the source range. Otherwise the order of element copying is not guaranteed.

Implementation

static void copyRange<T>(
  List<T> target,
  int at,
  List<T> source, [
  int? start,
  int? end,
]) {
  start ??= 0;
  end = RangeError.checkValidRange(start, end, source.length);
  if (end == null) {
    // TODO(dart-lang/language#440): Remove when promotion works.
    throw "unreachable";
  }
  int length = end - start;
  if (target.length < at + length) {
    throw ArgumentError.value(
      target,
      "target",
      "Not big enough to hold <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi><mi>e</mi><mi>n</mi><mi>g</mi><mi>t</mi><mi>h</mi><mi>e</mi><mi>l</mi><mi>e</mi><mi>m</mi><mi>e</mi><mi>n</mi><mi>t</mi><mi>s</mi><mi>a</mi><mi>t</mi><mi>p</mi><mi>o</mi><mi>s</mi><mi>i</mi><mi>t</mi><mi>i</mi><mi>o</mi><mi>n</mi></mrow><annotation encoding="application/x-tex">length elements at position </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">t</span><span class="mord mathnormal">h</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">e</span><span class="mord mathnormal">m</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span class="mord mathnormal">t</span><span class="mord mathnormal">s</span><span class="mord mathnormal">a</span><span class="mord mathnormal">tp</span><span class="mord mathnormal">os</span><span class="mord mathnormal">i</span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</span><span class="mord mathnormal">n</span></span></span></span>at",
    );
  }
  if (!identical(source, target) || start >= at) {
    for (int i = 0; i < length; i++) {
      target[at + i] = source[start + i];
    }
  } else {
    for (int i = length; --i >= 0;) {
      target[at + i] = source[start + i];
    }
  }
}