1use anyhow::{Result, ensure};
17
18#[macro_export]
21macro_rules! to_bits_le {
22 ($($x:expr),*) => ({
23 let mut buffer = vec![];
24 $($x.write_bits_le(&mut buffer);)*
25 buffer
26 });
27 ($($x:expr),*; $size:expr) => ({
28 let mut buffer = Vec::with_capacity($size);
29 $($x.write_bits_le(&mut buffer);)*
30 buffer
31 });
32}
33
34#[macro_export]
37macro_rules! to_bits_raw_le {
38 ($($x:expr),*) => ({
39 let mut buffer = vec![];
40 $($x.write_bits_raw_le(&mut buffer);)*
41 buffer
42 });
43 ($($x:expr),*; $size:expr) => ({
44 let mut buffer = Vec::with_capacity($size);
45 $($x.write_bits_raw_le(&mut buffer);)*
46 buffer
47 });
48}
49
50pub trait ToBits: Sized {
51 fn write_bits_le(&self, vec: &mut Vec<bool>);
53
54 fn write_bits_be(&self, vec: &mut Vec<bool>);
56
57 fn to_bits_le(&self) -> Vec<bool> {
59 let mut bits = Vec::new();
60 self.write_bits_le(&mut bits);
61 bits
62 }
63
64 fn to_bits_be(&self) -> Vec<bool> {
66 let mut bits = Vec::new();
67 self.write_bits_be(&mut bits);
68 bits
69 }
70
71 fn num_bits() -> Option<usize> {
73 None
74 }
75}
76
77pub trait ToBitsRaw: ToBits + Sized {
78 fn write_bits_raw_le(&self, vec: &mut Vec<bool>);
80
81 fn write_bits_raw_be(&self, vec: &mut Vec<bool>);
83
84 fn to_bits_raw_le(&self) -> Vec<bool> {
86 let mut bits = Vec::new();
87 self.write_bits_raw_le(&mut bits);
88 bits
89 }
90
91 fn to_bits_raw_be(&self) -> Vec<bool> {
93 let mut bits = Vec::new();
94 self.write_bits_raw_be(&mut bits);
95 bits
96 }
97}
98
99pub trait FromBits: Sized {
100 fn from_bits_le(bits: &[bool]) -> Result<Self>;
102
103 fn from_bits_be(bits: &[bool]) -> Result<Self>;
105}
106
107macro_rules! to_bits_tuple {
113 (($t0:ident, $i0:tt), $(($ty:ident, $idx:tt)),+) => {
114 impl<$t0: ToBits, $($ty: ToBits),+> ToBits for ($t0, $($ty),+) {
115 #[inline]
117 fn write_bits_le(&self, vec: &mut Vec<bool>) {
118 (&self).write_bits_le(vec);
120 }
121
122 #[inline]
124 fn write_bits_be(&self, vec: &mut Vec<bool>) {
125 (&self).write_bits_be(vec);
127 }
128 }
129
130 impl<'a, $t0: ToBits, $($ty: ToBits),+> ToBits for &'a ($t0, $($ty),+) {
131 #[inline]
133 fn write_bits_le(&self, vec: &mut Vec<bool>) {
134 self.$i0.write_bits_le(vec);
136 $(self.$idx.write_bits_le(vec);)+
137 }
138
139 #[inline]
141 fn write_bits_be(&self, vec: &mut Vec<bool>) {
142 self.$i0.write_bits_be(vec);
144 $(self.$idx.write_bits_be(vec);)+
145 }
146 }
147
148 impl<$t0: ToBitsRaw, $($ty: ToBitsRaw),+> ToBitsRaw for ($t0, $($ty),+) {
149 #[inline]
151 fn write_bits_raw_le(&self, vec: &mut Vec<bool>) {
152 (&self).write_bits_raw_le(vec);
154 }
155
156 #[inline]
158 fn write_bits_raw_be(&self, vec: &mut Vec<bool>) {
159 (&self).write_bits_raw_be(vec);
161 }
162 }
163
164 impl<'a, $t0: ToBitsRaw, $($ty: ToBitsRaw),+> ToBitsRaw for &'a ($t0, $($ty),+) {
165 #[inline]
167 fn write_bits_raw_le(&self, vec: &mut Vec<bool>) {
168 self.$i0.write_bits_raw_le(vec);
170 $(self.$idx.write_bits_raw_le(vec);)+
171 }
172
173 #[inline]
175 fn write_bits_raw_be(&self, vec: &mut Vec<bool>) {
176 self.$i0.write_bits_raw_be(vec);
178 $(self.$idx.write_bits_raw_be(vec);)+
179 }
180 }
181 }
182}
183
184to_bits_tuple!((C0, 0), (C1, 1));
185to_bits_tuple!((C0, 0), (C1, 1), (C2, 2));
186to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3));
187to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4));
188to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5));
189to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6));
190to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7));
191to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7), (C8, 8));
192to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7), (C8, 8), (C9, 9));
193to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7), (C8, 8), (C9, 9), (C10, 10));
194
195impl ToBits for bool {
200 #[inline]
202 fn write_bits_le(&self, vec: &mut Vec<bool>) {
203 vec.push(*self);
204 }
205
206 #[inline]
208 fn write_bits_be(&self, vec: &mut Vec<bool>) {
209 vec.push(*self);
210 }
211}
212
213macro_rules! impl_bits_for_integer {
218 ($int:ty) => {
219 impl ToBits for $int {
220 #[inline]
222 fn write_bits_le(&self, vec: &mut Vec<bool>) {
223 let mut value = *self;
224 for _ in 0..<$int>::BITS {
225 vec.push(value & 1 == 1);
226 value = value.wrapping_shr(1u32);
227 }
228 }
229
230 #[inline]
232 fn write_bits_be(&self, vec: &mut Vec<bool>) {
233 let reversed = self.reverse_bits();
234 reversed.write_bits_le(vec);
235 }
236
237 fn num_bits() -> Option<usize> {
238 Some(<$int>::BITS as usize)
239 }
240 }
241
242 impl FromBits for $int {
243 #[inline]
245 fn from_bits_le(bits: &[bool]) -> Result<Self> {
246 for bit in bits.iter().skip(<$int>::BITS as usize) {
249 ensure!(!bit, "upper bits are not zero");
250 }
251 Ok(bits.iter().take(<$int>::BITS as usize).rev().fold(0, |value, bit| match bit {
253 true => (value.wrapping_shl(1)) ^ 1,
254 false => (value.wrapping_shl(1)) ^ 0,
255 }))
256 }
257
258 #[inline]
260 fn from_bits_be(bits: &[bool]) -> Result<Self> {
261 for bit in bits.iter().take(bits.len().saturating_sub(<$int>::BITS as usize)) {
264 ensure!(!bit, "upper bits are not zero");
265 }
266 Ok(bits.iter().skip(bits.len().saturating_sub(<$int>::BITS as usize)).fold(0, |value, bit| match bit {
268 true => (value.wrapping_shl(1)) ^ 1,
269 false => (value.wrapping_shl(1)) ^ 0,
270 }))
271 }
272 }
273 };
274}
275
276impl_bits_for_integer!(u8);
277impl_bits_for_integer!(u16);
278impl_bits_for_integer!(u32);
279impl_bits_for_integer!(u64);
280impl_bits_for_integer!(u128);
281
282impl_bits_for_integer!(i8);
283impl_bits_for_integer!(i16);
284impl_bits_for_integer!(i32);
285impl_bits_for_integer!(i64);
286impl_bits_for_integer!(i128);
287
288impl ToBits for String {
293 #[inline]
295 fn write_bits_le(&self, vec: &mut Vec<bool>) {
296 self.as_bytes().write_bits_le(vec);
298 }
299
300 #[inline]
302 fn write_bits_be(&self, vec: &mut Vec<bool>) {
303 self.as_bytes().write_bits_be(vec);
305 }
306}
307
308impl<C: ToBits> ToBits for Vec<C> {
313 #[inline]
315 fn write_bits_le(&self, vec: &mut Vec<bool>) {
316 self.as_slice().write_bits_le(vec);
318 }
319
320 #[inline]
322 fn write_bits_be(&self, vec: &mut Vec<bool>) {
323 self.as_slice().write_bits_be(vec);
325 }
326}
327
328impl<C: ToBits, const N: usize> ToBits for [C; N] {
329 #[inline]
331 fn write_bits_le(&self, vec: &mut Vec<bool>) {
332 self.as_slice().write_bits_le(vec)
334 }
335
336 #[inline]
338 fn write_bits_be(&self, vec: &mut Vec<bool>) {
339 self.as_slice().write_bits_be(vec)
341 }
342}
343
344impl<C: ToBits> ToBits for &[C] {
345 #[inline]
347 fn write_bits_le(&self, vec: &mut Vec<bool>) {
348 if let Some(num_bits) = C::num_bits() {
349 vec.reserve(num_bits * self.len());
350 }
351
352 for elem in self.iter() {
353 elem.write_bits_le(vec);
354 }
355 }
356
357 #[inline]
359 fn write_bits_be(&self, vec: &mut Vec<bool>) {
360 if let Some(num_bits) = C::num_bits() {
361 vec.reserve(num_bits * self.len());
362 }
363
364 for elem in self.iter() {
365 elem.write_bits_be(vec);
366 }
367 }
368}
369
370impl<C: ToBitsRaw> ToBitsRaw for Vec<C> {
371 #[inline]
373 fn write_bits_raw_le(&self, vec: &mut Vec<bool>) {
374 self.as_slice().write_bits_raw_le(vec);
376 }
377
378 #[inline]
380 fn write_bits_raw_be(&self, vec: &mut Vec<bool>) {
381 self.as_slice().write_bits_raw_be(vec);
383 }
384}
385
386impl<C: ToBitsRaw, const N: usize> ToBitsRaw for [C; N] {
387 #[inline]
389 fn write_bits_raw_le(&self, vec: &mut Vec<bool>) {
390 self.as_slice().write_bits_raw_le(vec)
392 }
393
394 #[inline]
396 fn write_bits_raw_be(&self, vec: &mut Vec<bool>) {
397 self.as_slice().write_bits_raw_be(vec)
399 }
400}
401
402impl<C: ToBitsRaw> ToBitsRaw for &[C] {
403 #[inline]
405 fn write_bits_raw_le(&self, vec: &mut Vec<bool>) {
406 if let Some(num_bits) = C::num_bits() {
407 vec.reserve(num_bits * self.len());
408 }
409
410 for elem in self.iter() {
411 elem.write_bits_raw_le(vec);
412 }
413 }
414
415 #[inline]
417 fn write_bits_raw_be(&self, vec: &mut Vec<bool>) {
418 if let Some(num_bits) = C::num_bits() {
419 vec.reserve(num_bits * self.len());
420 }
421
422 for elem in self.iter() {
423 elem.write_bits_raw_be(vec);
424 }
425 }
426}
427
428impl FromBits for Vec<u8> {
429 #[inline]
431 fn from_bits_le(bits: &[bool]) -> Result<Self> {
432 bits.chunks(8).map(u8::from_bits_le).collect::<Result<Vec<_>>>()
434 }
435
436 #[inline]
438 fn from_bits_be(bits: &[bool]) -> Result<Self> {
439 bits.chunks(8).map(u8::from_bits_be).collect::<Result<Vec<_>>>()
441 }
442}
443
444#[cfg(test)]
445mod tests {
446 use super::*;
447 use crate::{TestRng, Uniform};
448
449 use anyhow::Result;
450 use rand::{Rng, distributions::Alphanumeric};
451
452 const ITERATIONS: u64 = 10000;
453
454 fn random_string(len: u16, rng: &mut TestRng) -> String {
455 rng.sample_iter(&Alphanumeric).take(len as usize).map(char::from).collect()
456 }
457
458 #[test]
459 fn test_to_bits_le_macro() {
460 let rng = &mut TestRng::default();
461
462 macro_rules! check {
464 ($given:expr) => {{
465 let given = $given;
466
467 let mut expected = Vec::new();
468 given.iter().for_each(|elem| elem.write_bits_le(&mut expected));
469
470 let candidate = to_bits_le!(given);
471 assert_eq!(candidate, expected);
472 }};
473 }
474
475 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<u8>>());
477 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<u16>>());
479 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<u32>>());
481 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<u64>>());
483 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<u128>>());
485 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<i8>>());
487 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<i16>>());
489 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<i32>>());
491 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<i64>>());
493 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<i128>>());
495 check!((0..100).map(|_| random_string(rng.r#gen(), rng)).collect::<Vec<String>>());
497 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<u8>>()).collect::<Vec<_>>());
499 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<u16>>()).collect::<Vec<_>>());
501 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<u32>>()).collect::<Vec<_>>());
503 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<u64>>()).collect::<Vec<_>>());
505 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<u128>>()).collect::<Vec<_>>());
507 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<i8>>()).collect::<Vec<_>>());
509 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<i16>>()).collect::<Vec<_>>());
511 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<i32>>()).collect::<Vec<_>>());
513 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<i64>>()).collect::<Vec<_>>());
515 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<i128>>()).collect::<Vec<_>>());
517 check!(
519 (0..100)
520 .map(|_| (0..128).map(|_| random_string(rng.r#gen(), rng)).collect::<Vec<String>>())
521 .collect::<Vec<_>>()
522 );
523 }
524
525 #[test]
526 fn test_to_bits_le_macro_with_capacity() {
527 let mut expected = Vec::new();
528 1u8.write_bits_le(&mut expected);
529 2u16.write_bits_le(&mut expected);
530 3u32.write_bits_le(&mut expected);
531 4u64.write_bits_le(&mut expected);
532 5u128.write_bits_le(&mut expected);
533 6i8.write_bits_le(&mut expected);
534 7i16.write_bits_le(&mut expected);
535 8i32.write_bits_le(&mut expected);
536 9i64.write_bits_le(&mut expected);
537 10i128.write_bits_le(&mut expected);
538
539 let capacity = expected.len();
540
541 let candidate = to_bits_le![1u8, 2u16, 3u32, 4u64, 5u128, 6i8, 7i16, 8i32, 9i64, 10i128; capacity];
542 assert_eq!(candidate, expected);
543 }
544
545 #[test]
546 fn test_integers() -> Result<()> {
547 macro_rules! check_integer {
548 ($integer:tt, $rng:expr) => {{
549 for _ in 0..ITERATIONS {
550 let expected: $integer = Uniform::rand($rng);
551
552 let bits_le = expected.to_bits_le();
553 assert_eq!(expected, $integer::from_bits_le(&bits_le)?);
554
555 let bits_be = expected.to_bits_be();
556 assert_eq!(expected, $integer::from_bits_be(&bits_be)?);
557 }
558 }};
559 }
560
561 let mut rng = TestRng::default();
562
563 check_integer!(u8, &mut rng);
564 check_integer!(u16, &mut rng);
565 check_integer!(u32, &mut rng);
566 check_integer!(u64, &mut rng);
567 check_integer!(u128, &mut rng);
568
569 check_integer!(i8, &mut rng);
570 check_integer!(i16, &mut rng);
571 check_integer!(i32, &mut rng);
572 check_integer!(i64, &mut rng);
573 check_integer!(i128, &mut rng);
574
575 Ok(())
576 }
577}