bilrost/encoding/type_support/
primitives.rs

1use crate::encoding::value_traits::{empty_state_via_default, for_overwrite_via_default};
2use crate::encoding::{EmptyState, ForOverwrite};
3
4empty_state_via_default!(bool);
5empty_state_via_default!(u8);
6empty_state_via_default!(u16);
7empty_state_via_default!(u32);
8empty_state_via_default!(u64);
9empty_state_via_default!(usize);
10empty_state_via_default!(i8);
11empty_state_via_default!(i16);
12empty_state_via_default!(i32);
13empty_state_via_default!(i64);
14empty_state_via_default!(isize);
15
16macro_rules! empty_state_for_float {
17    ($ty:ty) => {
18        impl ForOverwrite<(), $ty> for () {
19            #[inline]
20            fn for_overwrite() -> $ty {
21                0.0
22            }
23        }
24
25        impl EmptyState<(), $ty> for () {
26            #[inline]
27            fn is_empty(val: &$ty) -> bool {
28                // Preserve -0.0. This is actually the original motivation for `EmptyState`.
29                val.to_bits() == 0
30            }
31
32            #[inline]
33            fn clear(val: &mut $ty) {
34                *val = 0.0;
35            }
36        }
37    };
38}
39empty_state_for_float!(f32);
40empty_state_for_float!(f64);
41
42empty_state_via_default!(&'a str, with generics ('a));
43
44for_overwrite_via_default!(&'a [T], with generics ('a, T));
45
46impl<T> EmptyState<(), &[T]> for () {
47    fn is_empty(val: &&[T]) -> bool {
48        <[T]>::is_empty(val)
49    }
50
51    fn clear(val: &mut &[T]) {
52        *val = &[];
53    }
54}
55
56impl<'a, const N: usize> ForOverwrite<(), &'a [u8; N]> for () {
57    fn for_overwrite() -> &'a [u8; N] {
58        &[0; N]
59    }
60}
61
62impl<const N: usize> EmptyState<(), &[u8; N]> for () {
63    fn is_empty(val: &&[u8; N]) -> bool {
64        *val == &[0; N]
65    }
66
67    fn clear(val: &mut &[u8; N]) {
68        *val = &[0; N];
69    }
70}
71
72macro_rules! impls_for_tuple {
73    (($($letters:ident),*), ($($numbers:tt),*)$(,)?) => {
74        impl<$($letters,)*> ForOverwrite<(), ($($letters,)*)> for ()
75        where
76            $((): ForOverwrite<(), $letters>,)*
77        {
78            #[inline]
79            fn for_overwrite() -> ($($letters,)*) {
80                ($(<() as ForOverwrite<(), $letters>>::for_overwrite(),)*)
81            }
82        }
83
84        impl<$($letters,)*> EmptyState<(), ($($letters,)*)> for ()
85        where
86            $((): EmptyState<(), $letters>,)*
87        {
88            #[inline]
89            fn empty() -> ($($letters,)*) {
90                ($(<() as EmptyState<(), $letters>>::empty(),)*)
91            }
92
93            #[inline]
94            fn is_empty(val: &($($letters,)*)) -> bool {
95                true $(&& <() as EmptyState<(), $letters>>::is_empty(&val.$numbers))*
96            }
97
98            #[inline]
99            fn clear(val: &mut ($($letters,)*)) {
100                $(<() as EmptyState<(), $letters>>::clear(&mut val.$numbers);)*
101            }
102        }
103    };
104}
105impls_for_tuple!((A), (0));
106impls_for_tuple!((A, B), (0, 1));
107impls_for_tuple!((A, B, C), (0, 1, 2));
108impls_for_tuple!((A, B, C, D), (0, 1, 2, 3));
109impls_for_tuple!((A, B, C, D, E), (0, 1, 2, 3, 4));
110impls_for_tuple!((A, B, C, D, E, F), (0, 1, 2, 3, 4, 5));
111impls_for_tuple!((A, B, C, D, E, F, G), (0, 1, 2, 3, 4, 5, 6));
112impls_for_tuple!((A, B, C, D, E, F, G, H), (0, 1, 2, 3, 4, 5, 6, 7));
113impls_for_tuple!((A, B, C, D, E, F, G, H, I), (0, 1, 2, 3, 4, 5, 6, 7, 8));
114impls_for_tuple!(
115    (A, B, C, D, E, F, G, H, I, J),
116    (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
117);
118impls_for_tuple!(
119    (A, B, C, D, E, F, G, H, I, J, K),
120    (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
121);
122impls_for_tuple!(
123    (A, B, C, D, E, F, G, H, I, J, K, L),
124    (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
125);
126
127impl ForOverwrite<(), ()> for () {
128    fn for_overwrite() -> Self {}
129}
130
131impl EmptyState<(), ()> for () {
132    fn is_empty(_: &()) -> bool {
133        true
134    }
135
136    fn clear(_: &mut ()) {}
137}