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 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}