encode method

Uint8List encode()

The program as bytes, header first.

Implementation

Uint8List encode() {
  final names = <List<int>>[
    for (final input in inputs) utf8.encode(input.name),
  ];
  final size =
      4 +
      4 +
      16 +
      constants.length * 8 +
      _dimensions.length * (_Dim.count + 1) +
      <int>[
        for (final name in names) 8 + name.length,
      ].fold<int>(0, (a, b) => a + b) +
      code.length * 2;
  final bytes = ByteData(size);
  var at = 0;
  void u8(int v) => bytes.setUint8(at++, v);
  void u16(int v) {
    bytes.setUint16(at, v, Endian.little);
    at += 2;
  }

  expressionBytecodeMagic.forEach(u8);
  u16(expressionBytecodeVersion);
  u16(0);
  for (final v in <int>[
    lanes,
    constants.length,
    _dimensions.length,
    inputs.length,
    instructionCount,
    resultLane,
    resultWidth,
    resultDimension,
  ]) {
    u16(v);
  }
  for (final k in constants) {
    bytes.setFloat64(at, k, Endian.little);
    at += 8;
  }
  for (final dim in _dimensions) {
    for (final e in dim.exponents) {
      bytes.setInt8(at++, e);
    }
    u8(dim.boolean ? 1 : 0);
  }
  for (var i = 0; i < inputs.length; i++) {
    u16(names[i].length);
    names[i].forEach(u8);
    u16(inputs[i].lane);
    u16(inputs[i].width);
    u16(inputs[i]._dim);
  }
  code.forEach(u16);
  return bytes.buffer.asUint8List();
}