use crate::BooleanTrait;
pub trait ToBits {
type Boolean: BooleanTrait;
fn to_bits_le(&self) -> Vec<Self::Boolean> {
let mut bits = vec![];
self.write_bits_le(&mut bits);
bits
}
fn write_bits_le(&self, vec: &mut Vec<Self::Boolean>);
fn to_bits_be(&self) -> Vec<Self::Boolean> {
let mut bits = vec![];
self.write_bits_be(&mut bits);
bits
}
fn write_bits_be(&self, vec: &mut Vec<Self::Boolean>);
}
pub trait ToBitsRaw: ToBits {
fn to_bits_raw_le(&self) -> Vec<Self::Boolean> {
let mut bits = vec![];
self.write_bits_raw_le(&mut bits);
bits
}
fn write_bits_raw_le(&self, vec: &mut Vec<Self::Boolean>);
fn to_bits_raw_be(&self) -> Vec<Self::Boolean> {
let mut bits = vec![];
self.write_bits_raw_be(&mut bits);
bits
}
fn write_bits_raw_be(&self, vec: &mut Vec<Self::Boolean>);
}
impl<C: ToBits<Boolean = B>, B: BooleanTrait> ToBits for Vec<C> {
type Boolean = B;
#[inline]
fn write_bits_le(&self, vec: &mut Vec<Self::Boolean>) {
self.as_slice().write_bits_le(vec);
}
#[inline]
fn write_bits_be(&self, vec: &mut Vec<Self::Boolean>) {
self.as_slice().write_bits_be(vec);
}
}
impl<C: ToBits<Boolean = B>, B: BooleanTrait, const N: usize> ToBits for [C; N] {
type Boolean = B;
#[inline]
fn write_bits_le(&self, vec: &mut Vec<Self::Boolean>) {
self.as_slice().write_bits_le(vec);
}
#[inline]
fn write_bits_be(&self, vec: &mut Vec<Self::Boolean>) {
self.as_slice().write_bits_be(vec);
}
}
impl<C: ToBits<Boolean = B>, B: BooleanTrait> ToBits for &[C] {
type Boolean = B;
#[inline]
fn write_bits_le(&self, vec: &mut Vec<Self::Boolean>) {
for elem in self.iter() {
elem.write_bits_le(vec);
}
}
#[inline]
fn write_bits_be(&self, vec: &mut Vec<Self::Boolean>) {
for elem in self.iter() {
elem.write_bits_be(vec);
}
}
}
impl<C: ToBitsRaw<Boolean = B>, B: BooleanTrait> ToBitsRaw for Vec<C> {
#[inline]
fn write_bits_raw_le(&self, vec: &mut Vec<Self::Boolean>) {
self.as_slice().write_bits_raw_le(vec);
}
#[inline]
fn write_bits_raw_be(&self, vec: &mut Vec<Self::Boolean>) {
self.as_slice().write_bits_raw_be(vec);
}
}
impl<C: ToBitsRaw<Boolean = B>, B: BooleanTrait, const N: usize> ToBitsRaw for [C; N] {
#[inline]
fn write_bits_raw_le(&self, vec: &mut Vec<Self::Boolean>) {
self.as_slice().write_bits_raw_le(vec);
}
#[inline]
fn write_bits_raw_be(&self, vec: &mut Vec<Self::Boolean>) {
self.as_slice().write_bits_raw_be(vec);
}
}
impl<C: ToBitsRaw<Boolean = B>, B: BooleanTrait> ToBitsRaw for &[C] {
#[inline]
fn write_bits_raw_le(&self, vec: &mut Vec<Self::Boolean>) {
for elem in self.iter() {
elem.write_bits_raw_le(vec);
}
}
#[inline]
fn write_bits_raw_be(&self, vec: &mut Vec<Self::Boolean>) {
for elem in self.iter() {
elem.write_bits_raw_be(vec);
}
}
}
macro_rules! to_bits_tuple {
(($t0:ident, $i0:tt), $(($ty:ident, $idx:tt)),+) => {
impl<B: BooleanTrait, $t0: ToBits<Boolean = B>, $($ty: ToBits<Boolean = B>),+> ToBits for ($t0, $($ty),+) {
type Boolean = B;
#[inline]
fn write_bits_le(&self, vec: &mut Vec<Self::Boolean>) {
(&self).write_bits_le(vec);
}
#[inline]
fn write_bits_be(&self, vec: &mut Vec<Self::Boolean>) {
(&self).write_bits_be(vec);
}
}
impl<'a, B: BooleanTrait, $t0: ToBits<Boolean = B>, $($ty: ToBits<Boolean = B>),+> ToBits for &'a ($t0, $($ty),+) {
type Boolean = B;
#[inline]
fn write_bits_le(&self, vec: &mut Vec<Self::Boolean>) {
self.$i0.write_bits_le(vec);
$(self.$idx.write_bits_le(vec);)+
}
#[inline]
fn write_bits_be(&self, vec: &mut Vec<Self::Boolean>) {
self.$i0.write_bits_be(vec);
$(self.$idx.write_bits_be(vec);)+
}
}
impl<B: BooleanTrait, $t0: ToBitsRaw<Boolean = B>, $($ty: ToBitsRaw<Boolean = B>),+> ToBitsRaw for ($t0, $($ty),+) {
#[inline]
fn write_bits_raw_le(&self, vec: &mut Vec<Self::Boolean>) {
(&self).write_bits_raw_le(vec);
}
#[inline]
fn write_bits_raw_be(&self, vec: &mut Vec<Self::Boolean>) {
(&self).write_bits_raw_be(vec);
}
}
impl<'a, B: BooleanTrait, $t0: ToBitsRaw<Boolean = B>, $($ty: ToBitsRaw<Boolean = B>),+> ToBitsRaw for &'a ($t0, $($ty),+) {
#[inline]
fn write_bits_raw_le(&self, vec: &mut Vec<Self::Boolean>) {
self.$i0.write_bits_raw_le(vec);
$(self.$idx.write_bits_raw_le(vec);)+
}
#[inline]
fn write_bits_raw_be(&self, vec: &mut Vec<Self::Boolean>) {
self.$i0.write_bits_raw_be(vec);
$(self.$idx.write_bits_raw_be(vec);)+
}
}
}
}
to_bits_tuple!((C0, 0), (C1, 1));
to_bits_tuple!((C0, 0), (C1, 1), (C2, 2));
to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3));
to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4));
to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5));
to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6));
to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7));
to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7), (C8, 8));
to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7), (C8, 8), (C9, 9));
to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7), (C8, 8), (C9, 9), (C10, 10));