1use crate::Vec;
17
18use anyhow::{Result, ensure};
19
20#[macro_export]
23macro_rules! to_bits_le {
24 ($($x:expr),*) => ({
25 let mut buffer = $crate::vec![];
26 $($x.write_bits_le(&mut buffer);)*
27 buffer
28 });
29 ($($x:expr),*; $size:expr) => ({
30 let mut buffer = $crate::Vec::with_capacity($size);
31 $($x.write_bits_le(&mut buffer);)*
32 buffer
33 });
34}
35
36pub trait ToBits: Sized {
37 fn write_bits_le(&self, vec: &mut Vec<bool>);
39
40 fn write_bits_be(&self, vec: &mut Vec<bool>);
42
43 fn to_bits_le(&self) -> Vec<bool> {
45 let mut bits = Vec::new();
46 self.write_bits_le(&mut bits);
47 bits
48 }
49
50 fn to_bits_be(&self) -> Vec<bool> {
52 let mut bits = Vec::new();
53 self.write_bits_be(&mut bits);
54 bits
55 }
56
57 fn num_bits() -> Option<usize> {
59 None
60 }
61}
62
63pub trait FromBits: Sized {
64 fn from_bits_le(bits: &[bool]) -> Result<Self>;
66
67 fn from_bits_be(bits: &[bool]) -> Result<Self>;
69}
70
71macro_rules! to_bits_tuple {
77 (($t0:ident, $i0:tt), $(($ty:ident, $idx:tt)),+) => {
78 impl<$t0: ToBits, $($ty: ToBits),+> ToBits for ($t0, $($ty),+) {
79 #[inline]
81 fn write_bits_le(&self, vec: &mut Vec<bool>) {
82 (&self).write_bits_le(vec);
84 }
85
86 #[inline]
88 fn write_bits_be(&self, vec: &mut Vec<bool>) {
89 (&self).write_bits_be(vec);
91 }
92 }
93
94 impl<'a, $t0: ToBits, $($ty: ToBits),+> ToBits for &'a ($t0, $($ty),+) {
95 #[inline]
97 fn write_bits_le(&self, vec: &mut Vec<bool>) {
98 self.$i0.write_bits_le(vec);
100 $(self.$idx.write_bits_le(vec);)+
101 }
102
103 #[inline]
105 fn write_bits_be(&self, vec: &mut Vec<bool>) {
106 self.$i0.write_bits_be(vec);
108 $(self.$idx.write_bits_be(vec);)+
109 }
110 }
111 }
112}
113
114to_bits_tuple!((C0, 0), (C1, 1));
115to_bits_tuple!((C0, 0), (C1, 1), (C2, 2));
116to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3));
117to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4));
118to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5));
119to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6));
120to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7));
121to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7), (C8, 8));
122to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7), (C8, 8), (C9, 9));
123to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7), (C8, 8), (C9, 9), (C10, 10));
124
125impl ToBits for bool {
130 #[inline]
132 fn write_bits_le(&self, vec: &mut Vec<bool>) {
133 vec.push(*self);
134 }
135
136 #[inline]
138 fn write_bits_be(&self, vec: &mut Vec<bool>) {
139 vec.push(*self);
140 }
141}
142
143macro_rules! impl_bits_for_integer {
148 ($int:ty) => {
149 impl ToBits for $int {
150 #[inline]
152 fn write_bits_le(&self, vec: &mut Vec<bool>) {
153 let mut value = *self;
154 for _ in 0..<$int>::BITS {
155 vec.push(value & 1 == 1);
156 value = value.wrapping_shr(1u32);
157 }
158 }
159
160 #[inline]
162 fn write_bits_be(&self, vec: &mut Vec<bool>) {
163 let reversed = self.reverse_bits();
164 reversed.write_bits_le(vec);
165 }
166
167 fn num_bits() -> Option<usize> {
168 Some(<$int>::BITS as usize)
169 }
170 }
171
172 impl FromBits for $int {
173 #[inline]
175 fn from_bits_le(bits: &[bool]) -> Result<Self> {
176 for bit in bits.iter().skip(<$int>::BITS as usize) {
179 ensure!(!bit, "upper bits are not zero");
180 }
181 Ok(bits.iter().take(<$int>::BITS as usize).rev().fold(0, |value, bit| match bit {
183 true => (value.wrapping_shl(1)) ^ 1,
184 false => (value.wrapping_shl(1)) ^ 0,
185 }))
186 }
187
188 #[inline]
190 fn from_bits_be(bits: &[bool]) -> Result<Self> {
191 for bit in bits.iter().take(bits.len().saturating_sub(<$int>::BITS as usize)) {
194 ensure!(!bit, "upper bits are not zero");
195 }
196 Ok(bits.iter().skip(bits.len().saturating_sub(<$int>::BITS as usize)).fold(0, |value, bit| match bit {
198 true => (value.wrapping_shl(1)) ^ 1,
199 false => (value.wrapping_shl(1)) ^ 0,
200 }))
201 }
202 }
203 };
204}
205
206impl_bits_for_integer!(u8);
207impl_bits_for_integer!(u16);
208impl_bits_for_integer!(u32);
209impl_bits_for_integer!(u64);
210impl_bits_for_integer!(u128);
211
212impl_bits_for_integer!(i8);
213impl_bits_for_integer!(i16);
214impl_bits_for_integer!(i32);
215impl_bits_for_integer!(i64);
216impl_bits_for_integer!(i128);
217
218impl ToBits for String {
223 #[inline]
225 fn write_bits_le(&self, vec: &mut Vec<bool>) {
226 self.as_bytes().write_bits_le(vec);
228 }
229
230 #[inline]
232 fn write_bits_be(&self, vec: &mut Vec<bool>) {
233 self.as_bytes().write_bits_be(vec);
235 }
236}
237
238impl<C: ToBits> ToBits for Vec<C> {
243 #[inline]
245 fn write_bits_le(&self, vec: &mut Vec<bool>) {
246 self.as_slice().write_bits_le(vec);
248 }
249
250 #[inline]
252 fn write_bits_be(&self, vec: &mut Vec<bool>) {
253 self.as_slice().write_bits_be(vec);
255 }
256}
257
258impl<C: ToBits, const N: usize> ToBits for [C; N] {
259 #[inline]
261 fn write_bits_le(&self, vec: &mut Vec<bool>) {
262 self.as_slice().write_bits_le(vec)
264 }
265
266 #[inline]
268 fn write_bits_be(&self, vec: &mut Vec<bool>) {
269 self.as_slice().write_bits_be(vec)
271 }
272}
273
274impl<C: ToBits> ToBits for &[C] {
275 #[inline]
277 fn write_bits_le(&self, vec: &mut Vec<bool>) {
278 if let Some(num_bits) = C::num_bits() {
279 vec.reserve(num_bits * self.len());
280 }
281
282 for elem in self.iter() {
283 elem.write_bits_le(vec);
284 }
285 }
286
287 #[inline]
289 fn write_bits_be(&self, vec: &mut Vec<bool>) {
290 if let Some(num_bits) = C::num_bits() {
291 vec.reserve(num_bits * self.len());
292 }
293
294 for elem in self.iter() {
295 elem.write_bits_be(vec);
296 }
297 }
298}
299
300impl FromBits for Vec<u8> {
301 #[inline]
303 fn from_bits_le(bits: &[bool]) -> Result<Self> {
304 bits.chunks(8).map(u8::from_bits_le).collect::<Result<Vec<_>>>()
306 }
307
308 #[inline]
310 fn from_bits_be(bits: &[bool]) -> Result<Self> {
311 bits.chunks(8).map(u8::from_bits_be).collect::<Result<Vec<_>>>()
313 }
314}
315
316#[cfg(test)]
317mod tests {
318 use super::*;
319 use crate::{TestRng, Uniform};
320
321 use anyhow::Result;
322 use rand::{Rng, distributions::Alphanumeric};
323
324 const ITERATIONS: u64 = 10000;
325
326 fn random_string(len: u16, rng: &mut TestRng) -> String {
327 rng.sample_iter(&Alphanumeric).take(len as usize).map(char::from).collect()
328 }
329
330 #[test]
331 fn test_to_bits_le_macro() {
332 let rng = &mut TestRng::default();
333
334 macro_rules! check {
336 ($given:expr) => {{
337 let given = $given;
338
339 let mut expected = Vec::new();
340 given.iter().for_each(|elem| elem.write_bits_le(&mut expected));
341
342 let candidate = to_bits_le!(given);
343 assert_eq!(candidate, expected);
344 }};
345 }
346
347 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<u8>>());
349 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<u16>>());
351 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<u32>>());
353 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<u64>>());
355 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<u128>>());
357 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<i8>>());
359 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<i16>>());
361 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<i32>>());
363 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<i64>>());
365 check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<i128>>());
367 check!((0..100).map(|_| random_string(rng.gen(), rng)).collect::<Vec<String>>());
369 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<u8>>()).collect::<Vec<_>>());
371 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<u16>>()).collect::<Vec<_>>());
373 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<u32>>()).collect::<Vec<_>>());
375 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<u64>>()).collect::<Vec<_>>());
377 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<u128>>()).collect::<Vec<_>>());
379 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<i8>>()).collect::<Vec<_>>());
381 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<i16>>()).collect::<Vec<_>>());
383 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<i32>>()).collect::<Vec<_>>());
385 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<i64>>()).collect::<Vec<_>>());
387 check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<i128>>()).collect::<Vec<_>>());
389 check!(
391 (0..100)
392 .map(|_| (0..128).map(|_| random_string(rng.gen(), rng)).collect::<Vec<String>>())
393 .collect::<Vec<_>>()
394 );
395 }
396
397 #[test]
398 fn test_to_bits_le_macro_with_capacity() {
399 let mut expected = Vec::new();
400 1u8.write_bits_le(&mut expected);
401 2u16.write_bits_le(&mut expected);
402 3u32.write_bits_le(&mut expected);
403 4u64.write_bits_le(&mut expected);
404 5u128.write_bits_le(&mut expected);
405 6i8.write_bits_le(&mut expected);
406 7i16.write_bits_le(&mut expected);
407 8i32.write_bits_le(&mut expected);
408 9i64.write_bits_le(&mut expected);
409 10i128.write_bits_le(&mut expected);
410
411 let capacity = expected.len();
412
413 let candidate = to_bits_le![1u8, 2u16, 3u32, 4u64, 5u128, 6i8, 7i16, 8i32, 9i64, 10i128; capacity];
414 assert_eq!(candidate, expected);
415 }
416
417 #[test]
418 fn test_integers() -> Result<()> {
419 macro_rules! check_integer {
420 ($integer:tt, $rng:expr) => {{
421 for _ in 0..ITERATIONS {
422 let expected: $integer = Uniform::rand($rng);
423
424 let bits_le = expected.to_bits_le();
425 assert_eq!(expected, $integer::from_bits_le(&bits_le)?);
426
427 let bits_be = expected.to_bits_be();
428 assert_eq!(expected, $integer::from_bits_be(&bits_be)?);
429 }
430 }};
431 }
432
433 let mut rng = TestRng::default();
434
435 check_integer!(u8, &mut rng);
436 check_integer!(u16, &mut rng);
437 check_integer!(u32, &mut rng);
438 check_integer!(u64, &mut rng);
439 check_integer!(u128, &mut rng);
440
441 check_integer!(i8, &mut rng);
442 check_integer!(i16, &mut rng);
443 check_integer!(i32, &mut rng);
444 check_integer!(i64, &mut rng);
445 check_integer!(i128, &mut rng);
446
447 Ok(())
448 }
449}