///|
/// Computes CRC32C (Castagnoli) with the reflected polynomial.
pub fn crc32c(data : BytesView) -> UInt {
  let mut crc = 0xFFFFFFFFU
  for byte in data {
    crc = crc ^ byte.to_uint()
    for bit = 0; bit < 8; bit = bit + 1 {
      if (crc & 1U) == 1U {
        crc = (crc >> 1) ^ 0x82F63B78U
      } else {
        crc = crc >> 1
      }
    }
  }
  crc ^ 0xFFFFFFFFU
}

///|
/// Incrementally updates a CRC32C state before final xor.
pub fn crc32c_extend(state : UInt, data : BytesView) -> UInt {
  let mut crc = state ^ 0xFFFFFFFFU
  for byte in data {
    crc = crc ^ byte.to_uint()
    for bit = 0; bit < 8; bit = bit + 1 {
      if (crc & 1U) == 1U {
        crc = (crc >> 1) ^ 0x82F63B78U
      } else {
        crc = crc >> 1
      }
    }
  }
  crc ^ 0xFFFFFFFFU
}