serde-generate/runtime/dart/serde/binary_deserializer.dart (115 lines of code) (raw):
// Copyright (c) Facebook, Inc. and its affiliates
// SPDX-License-Identifier: MIT OR Apache-2.0
part of serde;
abstract class BinaryDeserializer {
  BinaryDeserializer(Uint8List input) : input = ByteData.view(input.buffer);
  @protected
  final ByteData input;
  int _offset = 0;
  int get offset {
    return _offset;
  }
  bool deserializeBool() {
    final result = input.getUint8(_offset) != 0;
    _offset += 1;
    return result;
  }
  Unit deserializeUnit() {
    return const Unit();
  }
  int deserializeUint8() {
    final result = input.getUint8(_offset);
    _offset += 1;
    return result;
  }
  int deserializeUint16() {
    final result = input.getUint16(_offset, Endian.little);
    _offset += 2;
    return result;
  }
  int deserializeUint32() {
    final result = input.getUint32(_offset, Endian.little);
    _offset += 4;
    return result;
  }
  Uint64 deserializeUint64() {
    final number = _bytesToBigInt(8, signed: false);
    _offset += 8;
    return Uint64(number);
  }
  int deserializeInt8() {
    final result = input.getInt8(_offset);
    _offset += 1;
    return result;
  }
  int deserializeInt16() {
    final result = input.getInt16(_offset, Endian.little);
    _offset += 2;
    return result;
  }
  int deserializeInt32() {
    final result = input.getInt32(_offset, Endian.little);
    _offset += 4;
    return result;
  }
  int deserializeInt64() {
    final result = input.getInt64(_offset, Endian.little);
    _offset += 8;
    return result;
  }
  double deserializeFloat32() {
    final result = input.getFloat32(_offset, Endian.little);
    _offset += 4;
    return result;
  }
  double deserializeFloat64() {
    final result = input.getFloat64(_offset, Endian.little);
    _offset += 8;
    return result;
  }
  Bytes deserializeBytes() {
    return Bytes(deserializeUint8List());
  }
  Uint8List deserializeUint8List() {
    final len = deserializeLength();
    if (len < 0 || len > maxInt) {
      throw Exception('The length of an array cannot exceed MAXINT');
    }
    final content = Uint8List(len);
    for (var i = 0; i < len; i++) {
      content[i] = deserializeUint8();
    }
    return content;
  }
  bool deserializeOptionTag() {
    return deserializeBool();
  }
  int deserializeChar() {
    return deserializeInt64();
  }
  int deserializeVariantIndex();
  String deserializeString() {
    return String.fromCharCodes(deserializeUint8List());
  }
  int deserializeLength();
  Int128 deserializeInt128() {
    final low = deserializeUint64();
    final high = deserializeUint64();
    return Int128(high.toBigInt(), low.toBigInt());
  }
  Uint128 deserializeUint128() {
    final low = deserializeUint64();
    final high = deserializeUint64();
    return Uint128(high.toBigInt(), low.toBigInt());
  }
  void checkThatKeySlicesAreIncreasing(Slice key1, Slice key2);
  BigInt _bytesToBigInt(int byteLength, {required bool signed}) {
    BigInt number = BigInt.from(0);
    for (int i = 0; (i < byteLength); i++) {
      // big endian
      // number += BigInt.from(bytes[byteLength - i - 1]) << (8 * i);
      // little endian
      number += BigInt.from(input.getUint8(_offset + i)) << (8 * i);
    }
    if (signed) {
      return number.toSigned(byteLength * 8);
    } else {
      return number.toUnsigned(byteLength * 8);
    }
  }
}