///|
/// CRC32 checksum implementation (IEEE 802.3 polynomial)
/// Polynomial: 0xEDB88320 (reversed form of 0x04C11DB7)

///|
/// Compute CRC32 checksum of data
pub fn crc32(data : Bytes) -> UInt {
  let mut c = 0xFFFFFFFFU
  for i in 0..> 1) ^ (0xEDB88320U & mask)
    }
  }
  c ^ 0xFFFFFFFFU
}

///|
/// CRC32 lookup table for faster computation
let crc32_table : Array[UInt] = {
  let table = Array::make(256, 0U)
  for i in 0..<256 {
    let mut c = i.reinterpret_as_uint()
    for _ in 0..<8 {
      if (c & 1U) != 0U {
        c = (c >> 1) ^ 0xEDB88320U
      } else {
        c = c >> 1
      }
    }
    table[i] = c
  }
  table
}

///|
/// Compute CRC32 using lookup table (faster for larger data)
pub fn crc32_fast(data : Bytes) -> UInt {
  let mut c = 0xFFFFFFFFU
  for i in 0..> 8) ^ crc32_table[idx]
  }
  c ^ 0xFFFFFFFFU
}

///|
/// Verify CRC32 checksum
pub fn crc32_verify(data : Bytes, expected : UInt) -> Bool {
  crc32(data) == expected
}