encode method
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();
}