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}