// number.mbt
//
// 7z 头里的两种复合编码:
// - NUMBER:可变长无符号整数(首字节前导 1 的个数 = 后续小端字节数 0..8);
// - BooleanList:`allDefined` 字节 + 可选位域(每字节 8 项,MSB 在前)。
//
// 依据 py7zr《.7z format specification》"Integers" / "BooleanList" 两节。
// 两者都只被头部解析使用,但后续增量的 FilesInfo 时间/属性字段也要用,
// 因此抽成独立原语,而不是塞在某个解析分支里。

///|
/// 读一个 7z NUMBER(0 .. 2^64-1)。
pub fn ByteReader::read_number(self : ByteReader) -> Int64 raise SevenZError {
  let first = self.read_byte()
  let mut extra = 0
  let mut mask = 0x80
  while extra < 8 && (first & mask) != 0 {
    extra += 1
    mask = mask >> 1
  }
  if extra == 8 {
    // 11111111 + 8 字节小端
    return self.read_u64()
  }
  // extra < 7 时首字节还带 (7-extra) 个有效位;extra == 7 时首字节无有效位
  let hi = if extra < 7 { first & (mask - 1) } else { 0 }
  let mut lo = 0L
  let mut i = 0
  while i < extra {
    lo = lo | (self.read_byte().to_int64() << (8 * i))
    i += 1
  }
  (hi.to_int64() << (8 * extra)) + lo
}

///|
/// 读 `count` 个布尔值(BooleanList)。
pub fn ByteReader::read_booleans(
  self : ByteReader,
  count : Int32,
) -> Array[Bool] raise SevenZError {
  let all_defined = self.read_byte()
  let out : Array[Bool] = []
  if all_defined != 0 {
    for _ in 0.. Array[Bool] raise SevenZError {
  let out : Array[Bool] = []
  push_bits(out, self.read_bytes((count + 7) / 8), count)
  out
}

///|
/// 按 MSB 在前把位域展开成布尔数组。
fn push_bits(out : Array[Bool], bits : Bytes, count : Int32) -> Unit {
  for i in 0..> (i % 8))) != 0)
  }
}

///|
/// 读 `count` 个 CRC-32 摘要(BooleanList 决定哪些位置有值)。
pub fn ByteReader::read_digests(
  self : ByteReader,
  count : Int32,
) -> Array[Int64?] raise SevenZError {
  let defined = self.read_booleans(count)
  let out : Array[Int64?] = []
  for i in 0..