1#[macro_export]
76macro_rules! fields {
77 (
78 $(
79 $buffer_type:path [$raw_data:ident] {
80 $(
81 $field:tt [$position_start:literal $(..= $position_end:literal)? , $rw:tt, $value_type:tt $(<$generic:tt>)?] $({
82 $(input_converter:$input_converter:expr;)?
83 $(output_converter:$output_converter:expr)?
84 })?
85 ),+ $(,)?
86 }
87 )+
88 ) => {
89 $(
90 $(
91 impl $crate::field::Field<$buffer_type> for $field {
92 type ValueType = $value_type $(<$generic>)?;
93 }
94 $crate::fields!(
95 __ops: $rw, $buffer_type, $value_type, $field, $raw_data, $position_start $(..= $position_end)? $(
96 $(input_converter:$input_converter;)?
97 $(output_converter:$output_converter;)?
98 )?
99 );
100 )+
101 )+
102 };
103 (__ops: ro, $buffer_type:ty, $value_type:tt, $field:ident, $raw_data:ident, $position_start:literal $(..= $position_end:literal)?
104 $(output_converter:$output_converter:expr)?
105 ) => {
106 impl $crate::field::FieldReader<$buffer_type> for $field {
107 #[inline]
108 fn read(buffer: &$buffer_type) -> Self::ValueType {
109 use $crate::IntoBits;
110 use $crate::BitsOps;
111 let x = buffer.$raw_data.bits($position_start $(..= $position_end)?).read();
112 let y = $crate::fields!{
113 __output_converter: x, $value_type $(,$output_converter)?
114 };
115 y
116 }
117 }
118 };
119 (__ops: rw, $buffer_type:path, $value_type:tt, $field:ident, $raw_data:ident, $position_start:literal $(..= $position_end:literal)?
120 $(input_converter:$input_converter:expr;)?
121 $(output_converter:$output_converter:expr;)?
122 ) => {
123 $crate::fields!{
124 __ops: ro, $buffer_type, $value_type, $field, $raw_data, $position_start $(..= $position_end)? $(output_converter:$output_converter)?
125 }
126 impl $crate::field::FieldWriter<$buffer_type> for $field {
127 #[inline]
128 fn write(buffer: &mut $buffer_type, value: Self::ValueType){
129 use $crate::IntoBits;
130 use $crate::BitsOps;
131 buffer.$raw_data = buffer.$raw_data.bits($position_start $(..= $position_end)?).write(
132 $crate::fields!{
133 __input_converter: value, $value_type $(,$input_converter)?
134 }
135 );
136 }
137 #[inline]
138 fn revert(buffer: &mut $buffer_type) {
139 use $crate::IntoBits;
140 use $crate::BitsOps;
141 buffer.$raw_data = buffer.$raw_data.bits($position_start $(..= $position_end)?).revert();
142 }
143 }
144 };
145 (__output_converter: $var:ident, bool) => {
146 ($var == 1)
147 };
148 (__output_converter: $var:ident, $value_type:tt) => {
149 $var as $value_type
150 };
151 ($__converter:tt: $var:ident, $value_type:tt) => {
152 $var.into()
153 };
154 ($__converter:tt: $var:ident, $value_type:tt, $converter:expr) => {
155 $converter($var)
156 };
157}
158
159#[macro_export]
163macro_rules! fields_ex {
164 (
165 $(
166 $buffer_type:path [$raw_data:ident] {
167 $(
168 $(#[$doc:meta])*
169 $Vis:vis $field:ident [$position_start:literal $(..= $position_end:literal)? , $rw:tt, $value_type:tt $(<$generic:tt>)?] $({
170 $(input_converter:$input_converter:expr;)?
171 $(output_converter:$output_converter:expr)?
172 })?
173 ),+ $(,)?
174 }
175 )+
176 ) => {
177 $(
178 $(
179 $(#[$doc])*
180 $Vis struct $field;
181 impl $crate::field::Field<$buffer_type> for $field {
182 type ValueType = $value_type $(<$generic>)?;
183 }
184 $crate::fields!(
185 __ops: $rw, $buffer_type, $value_type, $field, $raw_data, $position_start $(..= $position_end)? $(
186 $(input_converter:$input_converter;)?
187 $(output_converter:$output_converter;)?
188 )?
189 );
190 )+
191 )+
192 };
193}
194
195pub trait BufferWriter {
202 fn write<T>(&mut self, value: T::ValueType) -> &mut Self
203 where
204 T: Field<Self> + FieldWriter<Self>,
205 {
206 T::write(self, value);
207 self
208 }
209 fn revert<T>(&mut self) -> &mut Self
210 where
211 T: Field<Self> + FieldWriter<Self>,
212 {
213 T::revert(self);
214 self
215 }
216}
217pub trait BufferReader {
224 fn read<T: Field<Self> + FieldReader<Self>>(&self) -> T::ValueType {
225 T::read(self)
226 }
227 fn output<T: Field<Self> + FieldReader<Self>>(&self, out: &mut T::ValueType) -> &Self {
228 *out = T::read(self);
229 self
230 }
231}
232
233pub trait Field<BufferType>
238where
239 BufferType: ?Sized,
240{
241 type ValueType;
242}
243
244pub trait FieldWriter<BufferType>: Field<BufferType>
248where
249 BufferType: ?Sized,
250{
251 fn write(buffer: &mut BufferType, value: Self::ValueType);
252 fn revert(buffer: &mut BufferType);
253}
254pub trait FieldReader<BufferType>: Field<BufferType>
258where
259 BufferType: ?Sized,
260{
261 fn read(buffer: &BufferType) -> Self::ValueType;
262}