crc/crc8/
nolookup.rs

1use crate::crc8::{finalize, init, update_nolookup};
2use crate::*;
3
4impl Crc<u8, NoTable> {
5    pub const fn new(algorithm: &'static Algorithm<u8>) -> Self {
6        Self {
7            algorithm,
8            data: [],
9        }
10    }
11
12    pub const fn checksum(&self, bytes: &[u8]) -> u8 {
13        let mut crc = init(self.algorithm, self.algorithm.init);
14        crc = self.update(crc, bytes);
15        finalize(self.algorithm, crc)
16    }
17
18    const fn update(&self, crc: u8, bytes: &[u8]) -> u8 {
19        update_nolookup(crc, self.algorithm, bytes)
20    }
21
22    pub const fn digest(&self) -> Digest<u8, NoTable> {
23        self.digest_with_initial(self.algorithm.init)
24    }
25
26    /// Construct a `Digest` with a given initial value.
27    ///
28    /// This overrides the initial value specified by the algorithm.
29    /// The effects of the algorithm's properties `refin` and `width`
30    /// are applied to the custom initial value.
31    pub const fn digest_with_initial(&self, initial: u8) -> Digest<u8, NoTable> {
32        let value = init(self.algorithm, initial);
33        Digest::new(self, value)
34    }
35}
36
37impl<'a> Digest<'a, u8, NoTable> {
38    const fn new(crc: &'a Crc<u8, NoTable>, value: u8) -> Self {
39        Digest { crc, value }
40    }
41
42    pub fn update(&mut self, bytes: &[u8]) {
43        self.value = self.crc.update(self.value, bytes);
44    }
45
46    pub const fn finalize(self) -> u8 {
47        finalize(self.crc.algorithm, self.value)
48    }
49}