use flipperzero_sys as sys;
#[derive(Clone)]
pub struct Crc32 {
state: u32,
}
impl Crc32 {
pub fn new() -> Self {
Self { state: 0 }
}
pub fn new_with_initial(init: u32) -> Self {
Self { state: init }
}
pub fn update(&mut self, buf: &[u8]) {
self.state = unsafe { sys::crc32_calc_buffer(self.state, buf.as_ptr().cast(), buf.len()) };
}
pub fn finalize(self) -> u32 {
self.state
}
pub fn reset(&mut self) {
self.state = 0;
}
}
impl Default for Crc32 {
fn default() -> Self {
Self::new()
}
}
#[flipperzero_test::tests]
mod tests {
use super::Crc32;
#[test]
fn crc32fast() {
let mut fz = Crc32::new();
let mut rs = crc32fast::Hasher::new();
for i in 0..100 {
let buf = [i; 50];
fz.update(&buf);
rs.update(&buf);
}
assert_eq!(fz.finalize(), rs.finalize());
}
#[test]
fn crc32fast_with_init() {
for init in 0..5 {
let mut fz = Crc32::new_with_initial(init);
let mut rs = crc32fast::Hasher::new_with_initial(init);
for i in 0..100 {
let buf = [i; 50];
fz.update(&buf);
rs.update(&buf);
}
assert_eq!(fz.finalize(), rs.finalize());
}
}
}