fennec_modbus/protocol/codec/
bit_size.rs1pub trait BitSize {
2 const N_BITS: u16;
4
5 #[expect(clippy::cast_possible_truncation)]
7 const N_BYTES: u8 = {
8 let n_bytes = Self::N_BITS.div_ceil(8);
9 assert!(n_bytes <= u8::MAX as u16, "value type exceeds 255 bytes");
10 n_bytes as u8
11 };
12
13 const N_WORDS: u16 = Self::N_BITS.div_ceil(16);
15}
16
17impl<T: BitSize, const N: usize> BitSize for &[T; N] {
18 #[expect(clippy::cast_possible_truncation)]
19 const N_BITS: u16 = match (T::N_BITS as usize).checked_mul(N) {
20 Some(n_bits) if n_bits <= u16::MAX as usize => n_bits as u16,
21 _ => panic!("array size overflow"),
22 };
23}
24
25impl<T: BitSize, const N: usize> BitSize for [T; N] {
26 const N_BITS: u16 = <&[T; N]>::N_BITS;
27}
28
29macro_rules! impl_for {
30 ($type:ty, $n_bits:literal) => {
31 impl BitSize for $type {
32 const N_BITS: u16 = $n_bits;
33 }
34 };
35}
36
37impl_for!(u8, 8);
38impl_for!(i8, 8);
39
40impl_for!(u16, 16);
41impl_for!(i16, 16);
42
43impl_for!(u32, 32);
44impl_for!(i32, 32);
45impl_for!(f32, 32);
46
47impl_for!(u64, 64);
48impl_for!(i64, 64);
49impl_for!(f64, 64);
50
51impl_for!(u128, 128);
52impl_for!(i128, 128);