serde-generate/runtime/dart/serde/binary_serializer.dart (111 lines of code) (raw):
// Copyright (c) Facebook, Inc. and its affiliates
// SPDX-License-Identifier: MIT OR Apache-2.0
part of serde;
abstract class BinarySerializer {
final List<int> output = List<int>.empty(growable: true);
Uint8List get bytes {
return Uint8List.fromList(output);
}
int get offset {
return output.length;
}
void serializeUint8List(Uint8List val) {
serializeLength(val.length);
output.addAll(val);
}
void serializeBytes(Bytes val) {
serializeLength(val.content.length);
output.addAll(val.content);
}
void serializeBool(bool val) {
output.addAll(Uint8List.fromList([val ? 1 : 0]));
}
void serializeUint8(int val) {
if (val.bitLength > 8) {
throw Exception(
'The integer literal $val can\'t be represented in 8 bits.');
}
output.addAll(Uint8List.fromList([val]));
}
void serializeUint16(int val) {
if (val.bitLength > 16) {
throw Exception(
'The integer literal $val can\'t be represented in 16 bits.');
}
final bdata = ByteData(2)..setUint16(0, val, Endian.little);
output.addAll(bdata.buffer.asUint8List());
}
void serializeUint32(int val) {
if (val.bitLength > 32) {
throw Exception(
'The integer literal $val can\'t be represented in 32 bits.');
}
final bdata = ByteData(4)..setUint32(0, val, Endian.little);
output.addAll(bdata.buffer.asUint8List());
}
void serializeUint64(Uint64 val) {
BigInt number = val.toBigInt();
final _byteMask = BigInt.from(0xFF);
int bytes = 8;
var bdata = Uint8List(bytes);
for (int i = 0; i < bytes; i++) {
// little endian
bdata[i] = (number & _byteMask).toInt();
number = number >> 8;
}
output.addAll(bdata.buffer.asUint8List());
}
void serializeInt8(int value) {
if (value.bitLength > 7) {
throw Exception(
'The integer literal $value can\'t be represented in 8 bits.');
}
final bdata = ByteData(1)..setInt8(0, value);
output.addAll(bdata.buffer.asUint8List());
}
void serializeInt16(int value) {
if (value.bitLength > 15) {
throw Exception(
'The integer literal $value can\'t be represented in 16 bits.');
}
final bdata = ByteData(2)..setInt16(0, value, Endian.little);
output.addAll(bdata.buffer.asUint8List());
}
void serializeInt32(int value) {
if (value.bitLength > 31) {
throw Exception(
'The integer literal $value can\'t be represented in 32 bits.');
}
final bdata = ByteData(4)..setInt32(0, value, Endian.little);
output.addAll(bdata.buffer.asUint8List());
}
void serializeInt64(int value) {
final bdata = ByteData(8)..setInt64(0, value, Endian.little);
output.addAll(bdata.buffer.asUint8List());
}
void serializeFloat32(double value) {
final bdata = ByteData(4)..setFloat32(0, value, Endian.little);
output.addAll(bdata.buffer.asUint8List());
}
void serializeFloat64(double value) {
final bdata = ByteData(8)..setFloat64(0, value, Endian.little);
output.addAll(bdata.buffer.asUint8List());
}
void serializeOptionTag(bool value) {
output.addAll(Uint8List.fromList([value ? 1 : 0]));
}
void serializeUnit(Unit value) {}
void serializeChar(int value) {
serializeInt64(value);
}
void serializeVariantIndex(int index);
void serializeString(String str) {
serializeUint8List(Uint8List.fromList(str.codeUnits));
}
void serializeLength(int len);
void serializeInt128(Int128 value) {
serializeInt64(value.low.toInt());
serializeInt64(value.high.toInt());
}
void serializeUint128(Uint128 value) {
serializeUint64(Uint64(value.low));
serializeUint64(Uint64(value.high));
}
}