daachorse/
intpack.rs

1use alloc::vec::Vec;
2
3use crate::serializer::Serializable;
4
5#[derive(Clone, Copy, Default, Eq, PartialEq, Debug, Hash)]
6pub struct U24(u32);
7
8impl U24 {
9    #[inline(always)]
10    pub const fn get(self) -> u32 {
11        self.0
12    }
13
14    pub const MAX: u32 = 0x00ff_ffff;
15}
16
17impl TryFrom<u32> for U24 {
18    type Error = &'static str;
19
20    #[inline(always)]
21    fn try_from(value: u32) -> Result<Self, Self::Error> {
22        if value <= Self::MAX {
23            Ok(Self(value))
24        } else {
25            Err("value must be smaller than 2^24")
26        }
27    }
28}
29
30#[derive(Clone, Copy, Default, Eq, PartialEq, Debug, Hash)]
31pub struct U24nU8(u32);
32
33impl U24nU8 {
34    #[inline(always)]
35    pub const fn a(self) -> U24 {
36        U24(self.0 >> 8)
37    }
38
39    #[inline(always)]
40    pub fn b(self) -> u8 {
41        u8::try_from(self.0 & u32::from(u8::MAX)).unwrap()
42    }
43
44    #[inline(always)]
45    pub fn set_a(&mut self, a: U24) {
46        self.0 = a.get() << 8 | u32::from(self.b());
47    }
48
49    #[inline(always)]
50    pub fn set_b(&mut self, b: u8) {
51        self.0 = self.a().get() << 8 | u32::from(b);
52    }
53}
54
55impl Serializable for U24nU8 {
56    #[inline(always)]
57    fn serialize_to_vec(&self, dst: &mut Vec<u8>) {
58        self.0.serialize_to_vec(dst);
59    }
60
61    #[inline(always)]
62    fn deserialize_from_slice(src: &[u8]) -> (Self, &[u8]) {
63        let (x, src) = u32::deserialize_from_slice(src);
64        (Self(x), src)
65    }
66
67    #[inline(always)]
68    fn serialized_bytes() -> usize {
69        u32::serialized_bytes()
70    }
71}