1#![allow(unused)]
2
3use crate::ByteOrder;
4
5pub unsafe trait Fieldset: Sized {
9 const METADATA: FieldsetMetadata;
11 const ZERO: Self;
13
14 fn as_slice_mut(&mut self) -> &mut [u8] {
16 unsafe {
17 core::slice::from_raw_parts_mut(
18 (self as *mut Self).cast::<u8>(),
19 core::mem::size_of::<Self>(),
20 )
21 }
22 }
23}
24
25unsafe impl<T: Fieldset, const N: usize> Fieldset for [T; N] {
26 const METADATA: FieldsetMetadata = T::METADATA;
27 const ZERO: Self = [T::ZERO; N];
28}
29
30#[doc(hidden)]
31pub trait NotFieldset {}
32impl NotFieldset for () {}
33
34#[derive(Debug, Clone, PartialEq, Eq, Hash)]
36#[cfg_attr(feature = "defmt", derive(defmt::Format))]
37#[non_exhaustive]
38pub struct FieldsetMetadata {
39 pub byte_order: ByteOrder,
41}
42
43impl FieldsetMetadata {
44 pub const DEFAULT: Self = Self {
47 byte_order: ByteOrder::LE,
48 };
49
50 pub const fn new() -> Self {
52 Self::DEFAULT
53 }
54
55 pub const fn with_byte_order(self, byte_order: ByteOrder) -> Self {
57 Self { byte_order, ..self }
58 }
59}
60
61impl Default for FieldsetMetadata {
62 fn default() -> Self {
63 Self::DEFAULT
64 }
65}
66
67#[doc(hidden)]
68pub trait ToTuple {
69 type Tuple;
70 fn to_tuple(self) -> Self::Tuple;
71}
72
73#[doc(hidden)]
74pub trait Append<T> {
75 type Appended;
76 fn append(self, val: T) -> Self::Appended;
77}
78
79impl<A> Append<A> for () {
80 type Appended = Fs1<A>;
81
82 fn append(self, val: A) -> Self::Appended {
83 Fs1(val)
84 }
85}
86
87macro_rules! impl_append {
88 ($name:ident -> None, $(($tname:ident: $tnum:tt)),+) => {
89 };
91 ($name:ident -> $next:ident, $(($tname:ident: $tnum:tt)),+) => {
92 impl<$($tname),*, NEW> Append<NEW> for $name<$($tname),*> {
93 type Appended = $next<$($tname),* , NEW>;
94 fn append(self, val: NEW) -> Self::Appended {
95 $next($(self.$tnum),*, val)
96 }
97 }
98 };
99}
100
101macro_rules! create_fsn {
102 ($name:ident -> $next:ident, $(($tname:ident: $tnum:tt)),+) => {
103 #[derive(Debug)]
105 #[repr(C)]
106 #[doc(hidden)]
107 pub struct $name<$($tname),*>($($tname),*);
108
109 unsafe impl<$($tname: Fieldset),*> Fieldset for $name<$($tname),*> {
110 const METADATA: FieldsetMetadata = A::METADATA;
111 const ZERO: Self = Self($($tname::ZERO),*);
112 }
113
114 impl<$($tname),*> ToTuple for $name<$($tname),*> {
115 type Tuple = ($($tname),*,);
116 fn to_tuple(self) -> Self::Tuple {
117 (
118 $(self.$tnum),*,
119 )
120 }
121 }
122 impl<'a, $($tname),*> ToTuple for &'a mut $name<$($tname),*> {
123 type Tuple = ($(&'a mut $tname),*,);
124 fn to_tuple(self) -> Self::Tuple {
125 (
126 $(&mut self.$tnum),*,
127 )
128 }
129 }
130
131 impl_append!($name -> $next, $(($tname: $tnum)),+);
132 }
133}
134
135create_fsn!(Fs1 -> Fs2, (A: 0));
136create_fsn!(Fs2 -> Fs3, (A: 0), (B: 1));
137create_fsn!(Fs3 -> Fs4, (A: 0), (B: 1), (C: 2));
138create_fsn!(Fs4 -> Fs5, (A: 0), (B: 1), (C: 2), (D: 3));
139create_fsn!(Fs5 -> Fs6, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4));
140create_fsn!(Fs6 -> Fs7, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5));
141create_fsn!(Fs7 -> Fs8, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6));
142create_fsn!(Fs8 -> Fs9, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7));
143create_fsn!(Fs9 -> Fs10, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8));
144create_fsn!(Fs10 -> Fs11, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9));
145create_fsn!(Fs11 -> Fs12, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10));
146create_fsn!(Fs12 -> Fs13, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11));
147create_fsn!(Fs13 -> Fs14, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12));
148create_fsn!(Fs14 -> Fs15, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13));
149create_fsn!(Fs15 -> Fs16, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14));
150create_fsn!(Fs16 -> Fs17, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15));
151create_fsn!(Fs17 -> Fs18, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16));
152create_fsn!(Fs18 -> Fs19, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17));
153create_fsn!(Fs19 -> Fs20, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18));
154create_fsn!(Fs20 -> Fs21, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18), (T: 19));
155create_fsn!(Fs21 -> Fs22, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18), (T: 19), (U: 20));
156create_fsn!(Fs22 -> Fs23, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18), (T: 19), (U: 20), (V: 21));
157create_fsn!(Fs23 -> Fs24, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18), (T: 19), (U: 20), (V: 21), (W: 22));
158create_fsn!(Fs24 -> Fs25, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18), (T: 19), (U: 20), (V: 21), (W: 22), (X: 23));
159create_fsn!(Fs25 -> Fs26, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18), (T: 19), (U: 20), (V: 21), (W: 22), (X: 23), (Y: 24));
160create_fsn!(Fs26 -> None, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18), (T: 19), (U: 20), (V: 21), (W: 22), (X: 23), (Y: 24), (Z: 25));