// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

part of dart.scalarlist;

/**
 * A random-access sequence of bytes that also provides random access to
 * the fixed-width integers and floating point numbers represented by
 * those bytes. Byte arrays may be used to pack and unpack data from
 * external sources (such as networks or files systems), and to process
 * large quantities of numerical data more efficiently than would be possible
 * with ordinary [List] implementations. Byte arrays can save space, by
 * eliminating the need for object headers, and time, by eliminating the
 * need for data copies. Finally, Byte arrays may be used to intentionally
 * reinterpret the bytes representing one arithmetic type as another.
 * For example this code fragment determine what 64-bit signed integer
 * is represented by the bytes of a 64-bit floating point number:
 *
 *     var ba = new Uint8List(8).asByteArray();
 *     ba.setFloat64(0, 3.14159265358979323846);
 *     int huh = ba.getInt64(0);
 */
abstract class ByteArray {
  /**
   * Returns the length of this byte array, in bytes.
   */
  int lengthInBytes();

  // TODO(lrn): Change the signature to match String.substring.
  /**
   * Returns a [ByteArray] _view_ of a portion of this byte array.
   * The returned byte array consists of [length] bytes starting
   * at position [start] in this byte array. The returned byte array
   * is backed by the same data as this byte array. In other words,
   * changes to the returned byte array are visible in this byte array
   * and vice-versa.
   *
   * Throws [RangeError] if [start] or [length] are negative, or
   * if `start + length` is greater than the length of this byte array.
   *
   * Throws [ArgumentError] if [length] is negative.
   */
  ByteArray subByteArray([int start, int length]);

  /**
   * Returns the (possibly negative) integer represented by the byte at the
   * specified [byteOffset] in this byte array, in two's complement binary
   * representation. The return value will be between -128 and 127, inclusive.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * greater than or equal to the length of this byte array.
   */
  int getInt8(int byteOffset);

  /**
   * Sets the byte at the specified [byteOffset] in this byte array to the
   * two's complement binary representation of the specified [value], which
   * must fit in a single byte. In other words, [value] must be between
   * -128 and 127, inclusive.
   *
   * Returns `byteOffset + 1`, which is the offset of the first byte in the
   * array after the byte that was set by this call. This return value can
   * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * greater than or equal to the length of this byte array.
   *
   * Throws [ArgumentError] if [value] is less than -128 or
   * greater than 127.
   */
  int setInt8(int byteOffset, int value);

  /**
   * Returns the positive integer represented by the byte at the specified
   * [byteOffset] in this byte array, in unsigned binary form. The
   * return value will be between 0 and 255, inclusive.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * greater than or equal to the length of this byte array.
   */
  int getUint8(int byteOffset);

  /**
   * Sets the byte at the specified [byteOffset] in this byte array to the
   * unsigned binary representation of the specified [value], which must fit
   * in a single byte. in other words, [value] must be between 0 and 255,
   * inclusive.
   *
   * Returns `byteOffset + 1`, which is the offset of the first byte in the
   * array after the byte that was set by this call. This return value can
   * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
   *
   * Throws [RangeError] if [byteOffset] is negative,
   * or greater than or equal to the length of this byte array.
   *
   * Throws [ArgumentError] if [value] is negative or
   * greater than 255.
   */
  int setUint8(int byteOffset, int value);

  /**
   * Returns the (possibly negative) integer represented by the two bytes at
   * the specified [byteOffset] in this byte array, in two's complement binary
   * form. The return value will be between 2<sup>15</sup> and 2<sup>15 - 1,
   * inclusive.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 2` is greater than the length of this byte array.
   */
  int getInt16(int byteOffset);

  /**
   * Sets the two bytes starting at the specified [byteOffset] in this
   * byte array to the two's complement binary representation of the specified
   * [value], which must fit in two bytes. In other words, [value] must lie
   * between 2<sup>15</sup> and 2<sup>15 - 1, inclusive.
   *
   * Returns `byteOffset + 2`, which is the offset of the first byte in the
   * array after the last byte that was set by this call. This return value can
   * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 2` is greater than the length of this byte array.
   *
   * Throws [ArgumentError] if [value] is less than 2<sup>15</sup>
   * or greater than 2<sup>15 - 1.
   */
  int setInt16(int byteOffset, int value);

  /**
   * Returns the positive integer represented by the two bytes starting
   * at the specified [byteOffset] in this byte array, in unsigned binary
   * form. The return value will be between 0 and  2<sup>16 - 1, inclusive.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 2` is greater than the length of this byte array.
   */
  int getUint16(int byteOffset);

  /**
   * Sets the two bytes starting at the specified [byteOffset] in this byte
   * array to the unsigned binary representation of the specified [value],
   * which must fit in two bytes. in other words, [value] must be between
   * 0 and 2<sup>16 - 1, inclusive.
   *
   * Returns `byteOffset + 2`, which is the offset of the first byte in the
   * array after the last byte that was set by this call. This return value can
   * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 2` is greater than the length of this byte array.
   *
   * Throws [ArgumentError] if [value] is negative or
   * greater than 2<sup>16 - 1.
   */
  int setUint16(int byteOffset, int value);

  /**
   * Returns the (possibly negative) integer represented by the four bytes at
   * the specified [byteOffset] in this byte array, in two's complement binary
   * form. The return value will be between 2<sup>31</sup> and 2<sup>31 - 1,
   * inclusive.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 4` is greater than the length of this byte array.
   */
  int getInt32(int byteOffset);

  /**
   * Sets the four bytes starting at the specified [byteOffset] in this
   * byte array to the two's complement binary representation of the specified
   * [value], which must fit in four bytes. In other words, [value] must lie
   * between 2<sup>31</sup> and 2<sup>31 - 1, inclusive.
   *
   * Returns `byteOffset + 4`, which is the offset of the first byte in the
   * array after the last byte that was set by this call. This return value can
   * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 4` is greater than the length of this byte array.
   *
   * Throws [ArgumentError] if [value] is less than 2<sup>31</sup>
   * or greater than 2<sup>31 - 1.
   */
  int setInt32(int byteOffset, int value);

  /**
   * Returns the positive integer represented by the four bytes starting
   * at the specified [byteOffset] in this byte array, in unsigned binary
   * form. The return value will be between 0 and  2<sup>32 - 1, inclusive.
   *
   */
  int getUint32(int byteOffset);

  /**
   * Sets the four bytes starting at the specified [byteOffset] in this byte
   * array to the unsigned binary representation of the specified [value],
   * which must fit in four bytes. in other words, [value] must be between
   * 0 and 2<sup>32 - 1, inclusive.
   *
   * Returns `byteOffset + 4`, which is the offset of the first byte in the
   * array after the last byte that was set by this call. This return value can
   * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 4` is greater than the length of this byte array.
   *
   * Throws [ArgumentError] if [value] is negative or
   * greater than 2<sup>32 - 1.
   */
  int setUint32(int byteOffset, int value);

  /**
   * Returns the (possibly negative) integer represented by the eight bytes at
   * the specified [byteOffset] in this byte array, in two's complement binary
   * form. The return value will be between 2<sup>63</sup> and 2<sup>63 - 1,
   * inclusive.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 8` is greater than the length of this byte array.
   */
  int getInt64(int byteOffset);

  /**
   * Sets the eight bytes starting at the specified [byteOffset] in this
   * byte array to the two's complement binary representation of the specified
   * [value], which must fit in eight bytes. In other words, [value] must lie
   * between 2<sup>63</sup> and 2<sup>63 - 1, inclusive.
   *
   * Returns `byteOffset + 8`, which is the offset of the first byte in the
   * array after the last byte that was set by this call. This return value can
   * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 8` is greater than the length of this byte array.
   *
   * Throws [ArgumentError] if [value] is less than 2<sup>63</sup>
   * or greater than 2<sup>63 - 1.
   */
  int setInt64(int byteOffset, int value);

  /**
   * Returns the positive integer represented by the eight bytes starting
   * at the specified [byteOffset] in this byte array, in unsigned binary
   * form. The return value will be between 0 and  2<sup>64 - 1, inclusive.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 8` is greater than the length of this byte array.
   */
  int getUint64(int byteOffset);

  /**
   * Sets the eight bytes starting at the specified [byteOffset] in this byte
   * array to the unsigned binary representation of the specified [value],
   * which must fit in eight bytes. in other words, [value] must be between
   * 0 and 2<sup>64 - 1, inclusive.
   *
   * Returns `byteOffset + 8`, which is the offset of the first byte in the
   * array after the last byte that was set by this call. This return value can
   * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 8` is greater than the length of this byte array.
   *
   * Throws [ArgumentError] if [value] is negative or
   * greater than 2<sup>64 - 1.
   */
  int setUint64(int byteOffset, int value);

  /**
   * Returns the Float32x4 number represented by the 16 bytes at
   * the specified [byteOffset] in this byte array.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 16` is greater than the length of this byte array.
   */
  Float32x4 getFloat32x4(int byteOffset);

  /**
   * Sets the sixteen bytes starting at the specified [byteOffset] in this
   * byte array to the Float32x4 representation of the specified [value].
   *
   *
   * Returns `byteOffset + 16`, which is the offset of the first byte in the
   * array after the last byte that was set by this call. This return value can
   * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 16` is greater than the length of this byte array.
   */
  int setFloat32x4(int byteOffset, Float32x4 value);


  /**
   * Returns the floating point number represented by the four bytes at
   * the specified [byteOffset] in this byte array, in IEEE 754
   * single-precision binary floating-point format (binary32).
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 4` is greater than the length of this byte array.
   */
  double getFloat32(int byteOffset);

  /**
   * Sets the four bytes starting at the specified [byteOffset] in this
   * byte array to the IEEE 754 single-precision binary floating-point
   * (binary32) representation of the specified [value].
   *
   * **Note that this method can lose precision.** The input [value] is
   * a 64-bit floating point value, which will be converted to 32-bit
   * floating point value by IEEE 754 rounding rules before it is stored.
   * If [value] cannot be represented exactly as a binary32, it will be
   * converted to the nearest binary32 value.  If two binary32 values are
   * equally close, the one whose least significant bit is zero will be used.
   * Note that finite (but large) values can be converted to infinity, and
   * small non-zero values can be converted to zero.
   *
   * Returns `byteOffset + 4`, which is the offset of the first byte in the
   * array after the last byte that was set by this call. This return value can
   * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 4` is greater than the length of this byte array.
   */
  int setFloat32(int byteOffset, double value);

  /**
   * Returns the floating point number represented by the eight bytes at
   * the specified [byteOffset] in this byte array, in IEEE 754
   * double-precision binary floating-point format (binary64).
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 8` is greater than the length of this byte array.
   */
  double getFloat64(int byteOffset);

  /**
   * Sets the eight bytes starting at the specified [byteOffset] in this
   * byte array to the IEEE 754 double-precision binary floating-point
   * (binary64) representation of the specified [value].
   *
   * Returns `byteOffset + 8`, which is the offset of the first byte in the
   * array after the last byte that was set by this call. This return value can
   * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
   *
   * Throws [RangeError] if [byteOffset] is negative, or
   * `byteOffset + 8` is greater than the length of this byte array.
   */
  int setFloat64(int byteOffset, double value);
}

/**
 * A "mixin interface" that allows a type, typically but not necessarily
 * a [List], to be viewed as a [ByteArray].
 */
abstract class ByteArrayViewable {
  /**
   * Returns the number of bytes in the representation of each element in
   * this list, or the number bytes in the representation of the entire
   * object if it is not a list.
   */
  int bytesPerElement();

  /**
   * Returns the length of this view, in bytes.
   */
  int lengthInBytes();

  /**
   * Returns the byte array view of this object. This view allows the
   * byte representation of the object to be read and written directly.
   */
  ByteArray asByteArray([int start, int length]);
}


/**
 * A fixed-length list of 8-bit signed integers that is viewable as a
 * [ByteArray]. For long lists, this implementation will be considerably
 * more space- and time-efficient than the default [List] implementation.
 */
abstract class Int8List implements List<int>, ByteArrayViewable {
  /**
   * Creates an [Int8List] of the specified length (in elements), all of
   * whose elements are initially zero.
   */
  external factory Int8List(int length);

  /**
   * Creates an [Int8List] _view_ of the specified region in the specified
   * byte [array]. Changes in the [Int8List] will be visible in the byte
   * array and vice versa. If the [start] index of the region is not specified,
   * it defaults to zero (the first byte in the byte array). If the length is
   * not specified, it defaults to null, which indicates that the view extends
   * to the end of the byte array.
   */
  external factory Int8List.view(ByteArray array, [int start = 0, int length]);
}


/**
 * A fixed-length list of 8-bit unsigned integers that is viewable as a
 * [ByteArray]. For long lists, this implementation will be considerably
 * more space- and time-efficient than the default [List] implementation.
 */
abstract class Uint8List implements List<int>, ByteArrayViewable {
  /**
   * Creates a [Uint8List] of the specified length (in elements), all of
   * whose elements are initially zero.
   */
  external factory Uint8List(int length);

  /**
   * Creates a [Uint8List] _view_ of the specified region in the specified
   * byte [array]. Changes in the [Uint8List] will be visible in the byte
   * array and vice versa. If the [start] index of the region is not specified,
   * it defaults to zero (the first byte in the byte array). If the length is
   * not specified, it defaults to null, which indicates that the view extends
   * to the end of the byte array.
   */
  external factory Uint8List.view(ByteArray array, [int start = 0, int length]);
}


/**
 * A fixed-length list of 8-bit unsigned integers that is viewable as a
 * [ByteArray]. For long lists, this implementation will be considerably
 * more space- and time-efficient than the default [List] implementation.
 * Indexed store clamps the value to range 0..0xFF.
 */
abstract class Uint8ClampedList implements List<int>, ByteArrayViewable {
  /**
   * Creates a [Uint8ClampedList] of the specified length (in elements), all of
   * whose elements are initially zero.
   */
  external factory Uint8ClampedList(int length);

  /**
   * Creates a [Uint8ClampedList] _view_ of the specified region in the
   * specified byte [array]. Changes in the [Uint8List] will be visible in the
   * byte array and vice versa. If the [start] index of the region is not
   * specified, it defaults to zero (the first byte in the byte array). If the
   * length is not specified, it defaults to null, which indicates that the view
   * extends to the end of the byte array.
   */
  external factory Uint8ClampedList.view(ByteArray array,
                                         [int start = 0, int length]);
}


/**
 * A fixed-length list of 16-bit signed integers that is viewable as a
 * [ByteArray]. For long lists, this implementation will be considerably
 * more space- and time-efficient than the default [List] implementation.
 */
abstract class Int16List implements List<int>, ByteArrayViewable {
  /**
   * Creates an [Int16List] of the specified length (in elements), all of
   * whose elements are initially zero.
   */
  external factory Int16List(int length);

  /**
   * Creates an [Int16List] _view_ of the specified region in the specified
   * byte [array]. Changes in the [Int16List] will be visible in the byte
   * array and vice versa. If the [start] index of the region is not specified,
   * it defaults to zero (the first byte in the byte array). If the length is
   * not specified, it defaults to null, which indicates that the view extends
   * to the end of the byte array.
   *
   * Throws [ArgumentError] if the length of the specified region
   * is not divisible by 2 (the size of an "int16" in bytes), or if the
   * [start] of the region is not divisible by 2. If, however, [array]
   * is a view of another byte array, this constructor will throw
   * [ArgumentError] if the implicit starting position in the
   * "ultimately backing" byte array is not divisible by 2. In plain terms,
   * this constructor throws [ArgumentError] if the specified
   * region does not contain an integral number of "int16s," or if it
   * is not "int16-aligned."
   */
  external factory Int16List.view(ByteArray array, [int start = 0, int length]);
}


/**
 * A fixed-length list of 16-bit unsigned integers that is viewable as a
 * [ByteArray]. For long lists, this implementation will be considerably
 * more space- and time-efficient than the default [List] implementation.
 */
abstract class Uint16List implements List<int>, ByteArrayViewable {
  /**
   * Creates a [Uint16List] of the specified length (in elements), all
   * of whose elements are initially zero.
   */
  external factory Uint16List(int length);

  /**
   * Creates a [Uint16List] _view_ of the specified region in
   * the specified byte [array]. Changes in the [Uint16List] will be
   * visible in the byte array and vice versa. If the [start] index of the
   * region is not specified, it defaults to zero (the first byte in the byte
   * array). If the length is not specified, it defaults to null, which
   * indicates that the view extends to the end of the byte array.
   *
   * Throws [ArgumentError] if the length of the specified region
   * is not divisible by 2 (the size of a "uint16" in bytes), or if the
   * [start] of the region is not divisible by 2. If, however, [array]
   * is a view of another byte array, this constructor will throw
   * [ArgumentError] if the implicit starting position in the
   * "ultimately backing" byte array is not divisible by 2. In plain terms,
   * this constructor throws [ArgumentError] if the specified
   * region does not contain an integral number of "uint16s," or if it
   * is not "uint16-aligned."
   */
  external factory Uint16List.view(ByteArray array,
                                   [int start = 0, int length]);
}


/**
 * A fixed-length list of 32-bit signed integers that is viewable as a
 * [ByteArray]. For long lists, this implementation will be considerably
 * more space- and time-efficient than the default [List] implementation.
 */
abstract class Int32List implements List<int>, ByteArrayViewable {
  /**
   * Creates an [Int32List] of the specified length (in elements), all of
   * whose elements are initially zero.
   */
  external factory Int32List(int length);

  /**
   * Creates an [Int32List] _view_ of the specified region in the specified
   * byte [array]. Changes in the [Int32List] will be visible in the byte
   * array and vice versa. If the [start] index of the region is not specified,
   * it defaults to zero (the first byte in the byte array). If the length is
   * not specified, it defaults to null, which indicates that the view extends
   * to the end of the byte array.
   *
   * Throws [ArgumentError] if the length of the specified region
   * is not divisible by 4 (the size of an "int32" in bytes), or if the
   * [start] of the region is not divisible by 4. If, however, [array]
   * is a view of another byte array, this constructor will throw
   * [ArgumentError] if the implicit starting position in the
   * "ultimately backing" byte array is not divisible by 4. In plain terms,
   * this constructor throws [ArgumentError] if the specified
   * region does not contain an integral number of "int32s," or if it
   * is not "int32-aligned."
   */
  external factory Int32List.view(ByteArray array, [int start = 0, int length]);
}


/**
 * A fixed-length list of 32-bit unsigned integers that is viewable as a
 * [ByteArray]. For long lists, this implementation will be considerably
 * more space- and time-efficient than the default [List] implementation.
 */
abstract class Uint32List implements List<int>, ByteArrayViewable {
  /**
   * Creates a [Uint32List] of the specified length (in elements), all
   * of whose elements are initially zero.
   */
  external factory Uint32List(int length);

  /**
   * Creates a [Uint32List] _view_ of the specified region in
   * the specified byte [array]. Changes in the [Uint32] will be
   * visible in the byte array and vice versa. If the [start] index of the
   * region is not specified, it defaults to zero (the first byte in the byte
   * array). If the length is not specified, it defaults to null, which
   * indicates that the view extends to the end of the byte array.
   *
   * Throws [ArgumentError] if the length of the specified region
   * is not divisible by 4 (the size of a "uint32" in bytes), or if the
   * [start] of the region is not divisible by 4. If, however, [array]
   * is a view of another byte array, this constructor will throw
   * [ArgumentError] if the implicit starting position in the
   * "ultimately backing" byte array is not divisible by 4. In plain terms,
   * this constructor throws [ArgumentError] if the specified
   * region does not contain an integral number of "uint32s," or if it
   * is not "uint32-aligned."
   */
  external factory Uint32List.view(ByteArray array,
                                   [int start = 0, int length]);
}


/**
 * A fixed-length list of 64-bit signed integers that is viewable as a
 * [ByteArray]. For long lists, this implementation will be considerably
 * more space- and time-efficient than the default [List] implementation.
 */
abstract class Int64List implements List<int>, ByteArrayViewable {
  /**
   * Creates an [Int64List] of the specified length (in elements), all of
   * whose elements are initially zero.
   */
  external factory Int64List(int length);

  /**
   * Creates an [Int64List] _view_ of the specified region in the specified
   * byte [array]. Changes in the [Int64List] will be visible in the byte
   * array and vice versa. If the [start] index of the region is not specified,
   * it defaults to zero (the first byte in the byte array). If the length is
   * not specified, it defaults to null, which indicates that the view extends
   * to the end of the byte array.
   *
   * Throws [ArgumentError] if the length of the specified region
   * is not divisible by 8 (the size of an "int64" in bytes), or if the
   * [start] of the region is not divisible by 8. If, however, [array]
   * is a view of another byte array, this constructor will throw
   * [ArgumentError] if the implicit starting position in the
   * "ultimately backing" byte array is not divisible by 8. In plain terms,
   * this constructor throws [ArgumentError] if the specified
   * region does not contain an integral number of "int64s," or if it
   * is not "int64-aligned."
   */
  external factory Int64List.view(ByteArray array, [int start = 0, int length]);
}


/**
 * A fixed-length list of 64-bit unsigned integers that is viewable as a
 * [ByteArray]. For long lists, this implementation will be considerably
 * more space- and time-efficient than the default [List] implementation.
 */
abstract class Uint64List implements List<int>, ByteArrayViewable {
  /**
   * Creates a [Uint64List] of the specified length (in elements), all
   * of whose elements are initially zero.
   */
  external factory Uint64List(int length);

  /**
   * Creates an [Uint64List] _view_ of the specified region in
   * the specified byte [array]. Changes in the [Uint64List] will be
   * visible in the byte array and vice versa. If the [start] index of the
   * region is not specified, it defaults to zero (the first byte in the byte
   * array). If the length is not specified, it defaults to null, which
   * indicates that the view extends to the end of the byte array.
   *
   * Throws [ArgumentError] if the length of the specified region
   * is not divisible by 8 (the size of a "uint64" in bytes), or if the
   * [start] of the region is not divisible by 8. If, however, [array]
   * is a view of another byte array, this constructor will throw
   * [ArgumentError] if the implicit starting position in the
   * "ultimately backing" byte array is not divisible by 8. In plain terms,
   * this constructor throws [ArgumentError] if the specified
   * region does not contain an integral number of "uint64s," or if it
   * is not "uint64-aligned."
   */
  external factory Uint64List.view(ByteArray array,
                                   [int start = 0, int length]);
}


/**
 * A fixed-length list of IEEE 754 single-precision binary floating-point
 * numbers  that is viewable as a [ByteArray]. For long lists, this
 * implementation will be considerably more space- and time-efficient than
 * the default [List] implementation.
 */
abstract class Float32List implements List<double>, ByteArrayViewable {
  /**
   * Creates a [Float32List] of the specified length (in elements), all of
   * whose elements are initially zero.
   */
  external factory Float32List(int length);

  /**
   * Creates a [Float32List] _view_ of the specified region in the specified
   * byte [array]. Changes in the [Float32List] will be visible in the byte
   * array and vice versa. If the [start] index of the region is not specified,
   * it defaults to zero (the first byte in the byte array). If the length is
   * not specified, it defaults to null, which indicates that the view extends
   * to the end of the byte array.
   *
   * Throws [ArgumentError] if the length of the specified region
   * is not divisible by 4 (the size of a "float32" in bytes), or if the
   * [start] of the region is not divisible by 4. If, however, [array]
   * is a view of another byte array, this constructor will throw
   * [ArgumentError] if the implicit starting position in the
   * "ultimately backing" byte array is not divisible by 4. In plain terms,
   * this constructor throws [ArgumentError] if the specified
   * region does not contain an integral number of "float32s," or if it
   * is not "float32-aligned."
   */
  external factory Float32List.view(ByteArray array,
                                    [int start = 0, int length]);
}


/**
 * A fixed-length list of IEEE 754 double-precision binary floating-point
 * numbers  that is viewable as a [ByteArray]. For long lists, this
 * implementation will be considerably more space- and time-efficient than
 * the default [List] implementation.
 */
abstract class Float64List implements List<double>, ByteArrayViewable {
  /**
   * Creates a [Float64List] of the specified length (in elements), all of
   * whose elements are initially zero.
   */
  external factory Float64List(int length);

  /**
   * Creates a [Float64List] _view_ of the specified region in the specified
   * byte [array]. Changes in the [Float64List] will be visible in the byte
   * array and vice versa. If the [start] index of the region is not specified,
   * it defaults to zero (the first byte in the byte array). If the length is
   * not specified, it defaults to null, which indicates that the view extends
   * to the end of the byte array.
   *
   * Throws [ArgumentError] if the length of the specified region
   * is not divisible by 8 (the size of a "float64" in bytes), or if the
   * [start] of the region is not divisible by 8. If, however, [array]
   * is a view of another byte array, this constructor will throw
   * [ArgumentError] if the implicit starting position in the
   * "ultimately backing" byte array is not divisible by 8. In plain terms,
   * this constructor throws [ArgumentError] if the specified
   * region does not contain an integral number of "float64s," or if it
   * is not "float64-aligned."
   */
  external factory Float64List.view(ByteArray array,
                                    [int start = 0, int length]);
}
