1mod decode_iter;
11mod encode_iter;
12use alloc::vec::Vec;
13use codec::Error as CodecError;
14
15pub mod format {
17 pub use scale_type_resolver::{BitsOrderFormat as OrderFormat, BitsStoreFormat as StoreFormat};
18
19 #[derive(Clone, Copy, PartialEq, Eq, Debug)]
21 pub struct Format {
22 pub store: StoreFormat,
24 pub order: OrderFormat,
28 }
29
30 impl Format {
31 pub fn new(store: StoreFormat, order: OrderFormat) -> Self {
41 Format { store, order }
42 }
43 }
44}
45
46pub use format::Format;
47
48pub fn encode_using_format<I: ExactSizeIterator<Item = bool>>(it: I, format: Format) -> Vec<u8> {
65 let mut out = Vec::new();
66 encode_using_format_to(it, format, &mut out);
67 out
68}
69
70pub fn encode_using_format_to<I: ExactSizeIterator<Item = bool>>(
91 it: I,
92 format: Format,
93 out: &mut Vec<u8>,
94) {
95 use encode_iter::*;
96 use format::{OrderFormat, StoreFormat};
97 match (format.store, format.order) {
98 (StoreFormat::U8, OrderFormat::Lsb0) => encode_iter_lsb0_u8(it, out),
99 (StoreFormat::U8, OrderFormat::Msb0) => encode_iter_msb0_u8(it, out),
100 (StoreFormat::U16, OrderFormat::Lsb0) => encode_iter_lsb0_u16(it, out),
101 (StoreFormat::U16, OrderFormat::Msb0) => encode_iter_msb0_u16(it, out),
102 (StoreFormat::U32, OrderFormat::Lsb0) => encode_iter_lsb0_u32(it, out),
103 (StoreFormat::U32, OrderFormat::Msb0) => encode_iter_msb0_u32(it, out),
104 (StoreFormat::U64, OrderFormat::Lsb0) => encode_iter_lsb0_u64(it, out),
105 (StoreFormat::U64, OrderFormat::Msb0) => encode_iter_msb0_u64(it, out),
106 }
107}
108
109pub fn decode_using_format_from(
138 bytes: &'_ [u8],
139 format: Format,
140) -> Result<Decoder<'_>, CodecError> {
141 use decode_iter::*;
142 use format::{OrderFormat, StoreFormat};
143 let inner = match (format.store, format.order) {
144 (StoreFormat::U8, OrderFormat::Lsb0) => {
145 DecodeInner::DecodeLsb0U8(DecodeLsb0U8::new(bytes)?)
146 }
147 (StoreFormat::U16, OrderFormat::Lsb0) => {
148 DecodeInner::DecodeLsb0U16(DecodeLsb0U16::new(bytes)?)
149 }
150 (StoreFormat::U32, OrderFormat::Lsb0) => {
151 DecodeInner::DecodeLsb0U32(DecodeLsb0U32::new(bytes)?)
152 }
153 (StoreFormat::U64, OrderFormat::Lsb0) => {
154 DecodeInner::DecodeLsb0U64(DecodeLsb0U64::new(bytes)?)
155 }
156 (StoreFormat::U8, OrderFormat::Msb0) => {
157 DecodeInner::DecodeMsb0U8(DecodeMsb0U8::new(bytes)?)
158 }
159 (StoreFormat::U16, OrderFormat::Msb0) => {
160 DecodeInner::DecodeMsb0U16(DecodeMsb0U16::new(bytes)?)
161 }
162 (StoreFormat::U32, OrderFormat::Msb0) => {
163 DecodeInner::DecodeMsb0U32(DecodeMsb0U32::new(bytes)?)
164 }
165 (StoreFormat::U64, OrderFormat::Msb0) => {
166 DecodeInner::DecodeMsb0U64(DecodeMsb0U64::new(bytes)?)
167 }
168 };
169 Ok(Decoder { inner })
170}
171
172#[derive(Clone, Debug)]
210pub struct Decoder<'a> {
211 inner: DecodeInner<'a>,
212}
213
214#[derive(Clone, Debug)]
219enum DecodeInner<'a> {
220 DecodeLsb0U8(decode_iter::DecodeLsb0U8<'a>),
221 DecodeLsb0U16(decode_iter::DecodeLsb0U16<'a>),
222 DecodeLsb0U32(decode_iter::DecodeLsb0U32<'a>),
223 DecodeLsb0U64(decode_iter::DecodeLsb0U64<'a>),
224 DecodeMsb0U8(decode_iter::DecodeMsb0U8<'a>),
225 DecodeMsb0U16(decode_iter::DecodeMsb0U16<'a>),
226 DecodeMsb0U32(decode_iter::DecodeMsb0U32<'a>),
227 DecodeMsb0U64(decode_iter::DecodeMsb0U64<'a>),
228}
229
230macro_rules! decode_iter_arms {
231 ($self:ident, $i:ident => $expr:expr) => {{
232 let Self { inner } = $self;
233 match inner {
234 DecodeInner::DecodeLsb0U8($i) => $expr,
235 DecodeInner::DecodeLsb0U16($i) => $expr,
236 DecodeInner::DecodeLsb0U32($i) => $expr,
237 DecodeInner::DecodeLsb0U64($i) => $expr,
238 DecodeInner::DecodeMsb0U8($i) => $expr,
239 DecodeInner::DecodeMsb0U16($i) => $expr,
240 DecodeInner::DecodeMsb0U32($i) => $expr,
241 DecodeInner::DecodeMsb0U64($i) => $expr,
242 }
243 }};
244}
245
246impl<'a> Iterator for Decoder<'a> {
247 type Item = Result<bool, CodecError>;
248 fn next(&mut self) -> Option<Self::Item> {
249 decode_iter_arms!(self, i => i.next())
250 }
251 fn size_hint(&self) -> (usize, Option<usize>) {
252 decode_iter_arms!(self, i => i.size_hint())
253 }
254}
255impl<'a> ExactSizeIterator for Decoder<'a> {}
256
257impl<'a> Decoder<'a> {
258 pub fn encoded_size(&self) -> usize {
261 decode_iter_arms!(self, i => i.encoded_size())
262 }
263
264 pub fn remaining_bytes(&self) -> &[u8] {
266 decode_iter_arms!(self, i => i.remaining_bytes())
267 }
268}
269
270#[cfg(test)]
271mod test {
272 use super::format::{Format, OrderFormat, StoreFormat};
273 use super::*;
274 use alloc::vec;
275 use bitvec::{
276 order::{BitOrder, Lsb0, Msb0},
277 store::BitStore,
278 vec::BitVec,
279 };
280 use codec::Encode;
281
282 fn assert_iter_matches_bits<S, O>(bits: BitVec<S, O>, format: Format)
283 where
284 S: BitStore,
285 O: BitOrder,
286 BitVec<S, O>: Encode,
287 {
288 let bytes = bits.encode();
290
291 let in_bools: Vec<bool> = bits.clone().into_iter().collect();
293
294 let decoder = decode_using_format_from(&bytes, format).unwrap();
296
297 assert_eq!(
299 decoder.encoded_size(),
300 bytes.len(),
301 "Wrong size (actual vs expected) for {:?}",
302 bits
303 );
304
305 let out_bools: Result<Vec<bool>, _> = decoder.collect();
307 assert_eq!(in_bools, out_bools.expect("can't collect bools"), "Mismatch for {:?}", bits);
308 }
309
310 fn assert_iter_bits_all_formats(bits: Vec<u8>) {
311 let bits: Vec<bool> = bits
312 .into_iter()
313 .map(|n| match n {
314 0 => false,
315 1 => true,
316 _ => panic!("only 0 or 1 bits allowed"),
317 })
318 .collect();
319
320 let b: BitVec<u8, Lsb0> = bits.iter().collect();
321 let f = Format::new(StoreFormat::U8, OrderFormat::Lsb0);
322 assert_iter_matches_bits(b, f);
323
324 let b: BitVec<u16, Lsb0> = bits.iter().collect();
325 let f = Format::new(StoreFormat::U16, OrderFormat::Lsb0);
326 assert_iter_matches_bits(b, f);
327
328 let b: BitVec<u32, Lsb0> = bits.iter().collect();
329 let f = Format::new(StoreFormat::U32, OrderFormat::Lsb0);
330 assert_iter_matches_bits(b, f);
331
332 let b: BitVec<u64, Lsb0> = bits.iter().collect();
333 let f = Format::new(StoreFormat::U64, OrderFormat::Lsb0);
334 assert_iter_matches_bits(b, f);
335
336 let b: BitVec<u8, Msb0> = bits.iter().collect();
337 let f = Format::new(StoreFormat::U8, OrderFormat::Msb0);
338 assert_iter_matches_bits(b, f);
339
340 let b: BitVec<u16, Msb0> = bits.iter().collect();
341 let f = Format::new(StoreFormat::U16, OrderFormat::Msb0);
342 assert_iter_matches_bits(b, f);
343
344 let b: BitVec<u32, Msb0> = bits.iter().collect();
345 let f = Format::new(StoreFormat::U32, OrderFormat::Msb0);
346 assert_iter_matches_bits(b, f);
347
348 let b: BitVec<u64, Msb0> = bits.iter().collect();
349 let f = Format::new(StoreFormat::U64, OrderFormat::Msb0);
350 assert_iter_matches_bits(b, f);
351 }
352
353 #[test]
354 fn test_iter_bits() {
355 assert_iter_bits_all_formats(vec![]);
356 assert_iter_bits_all_formats(vec![0]);
357 assert_iter_bits_all_formats(vec![0, 1]);
358 assert_iter_bits_all_formats(vec![0, 0, 0]);
359 assert_iter_bits_all_formats(vec![0, 1, 1, 0, 1, 1, 0, 1]);
360 assert_iter_bits_all_formats(vec![0, 1, 1, 0, 1, 1, 0, 1, 0]);
361 assert_iter_bits_all_formats(vec![0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1]);
362 assert_iter_bits_all_formats(vec![0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1]);
363 assert_iter_bits_all_formats(vec![
364 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1,
365 1, 0, 1, 0,
366 ]);
367 assert_iter_bits_all_formats(vec![
368 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1,
369 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1,
370 1, 0, 1, 1, 0, 1,
371 ]);
372 assert_iter_bits_all_formats(vec![
373 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1,
374 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1,
375 1, 0, 1, 1, 0, 1, 0,
376 ]);
377 }
378}