lightpack/
size.rs

1//! The [`Size`] trait and primitive implementations.
2
3/// Types that have an encoded size.
4pub trait Size {
5    /// The type's encoded size in bytes.
6    const SIZE: usize;
7}
8
9impl Size for u8 {
10    const SIZE: usize = 1;
11}
12
13impl Size for u16 {
14    const SIZE: usize = 2;
15}
16
17impl Size for u32 {
18    const SIZE: usize = 4;
19}
20
21impl Size for u64 {
22    const SIZE: usize = 8;
23}
24
25impl Size for i8 {
26    const SIZE: usize = 1;
27}
28
29impl Size for i16 {
30    const SIZE: usize = 2;
31}
32
33impl Size for i32 {
34    const SIZE: usize = 4;
35}
36
37impl Size for i64 {
38    const SIZE: usize = 8;
39}
40
41impl Size for f32 {
42    const SIZE: usize = 4;
43}
44
45impl Size for f64 {
46    const SIZE: usize = 8;
47}
48
49impl Size for bool {
50    const SIZE: usize = 1;
51}
52
53impl Size for char {
54    const SIZE: usize = 4;
55}
56
57impl Size for () {
58    const SIZE: usize = 0;
59}
60
61// TODO: Abstract over the tuple size with a macro
62
63impl<T1> Size for (T1,) where T1: Size {
64    const SIZE: usize = T1::SIZE;
65}
66
67impl<T1, T2> Size for (T1, T2) where T1: Size, T2: Size {
68    const SIZE: usize = T1::SIZE + T2::SIZE;
69}
70
71impl<T1, T2, T3> Size for (T1, T2, T3) where T1: Size, T2: Size, T3: Size {
72    const SIZE: usize = T1::SIZE + T2::SIZE + T3::SIZE;
73}
74
75impl<T1, T2, T3, T4> Size for (T1, T2, T3, T4) where T1: Size, T2: Size, T3: Size, T4: Size {
76    const SIZE: usize = T1::SIZE + T2::SIZE + T3::SIZE + T4::SIZE;
77}
78
79impl<T> Size for &T where T: Size {
80    const SIZE: usize = T::SIZE;
81}
82
83impl<T> Size for &mut T where T: Size {
84    const SIZE: usize = T::SIZE;
85}
86
87impl<T> Size for Option<T> where T: Size {
88    const SIZE: usize = T::SIZE + 1;
89}
90
91impl<T, const N: usize> Size for [T; N] where T: Size {
92    const SIZE: usize = T::SIZE * N;
93}