#![cfg(feature = "std")]
#![doc = include_str!("../../doc/field/io.md")]
use core::mem;
use std::io::{
self,
Read,
Write,
};
use super::BitField;
use crate::{
mem::bits_of,
order::BitOrder,
slice::BitSlice,
store::BitStore,
vec::BitVec,
};
#[doc = include_str!("../../doc/field/io/Read_BitSlice.md")]
impl<T, O> Read for &BitSlice<T, O>
where
T: BitStore,
O: BitOrder,
BitSlice<T, O>: BitField,
{
#[inline]
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
let mut count = 0;
self.chunks_exact(bits_of::<u8>())
.zip(buf.iter_mut())
.for_each(|(byte, slot)| {
*slot = byte.load_be();
count += 1;
});
*self = unsafe { self.get_unchecked(count * bits_of::<u8>() ..) };
Ok(count)
}
}
#[doc = include_str!("../../doc/field/io/Write_BitSlice.md")]
impl<T, O> Write for &mut BitSlice<T, O>
where
T: BitStore,
O: BitOrder,
BitSlice<T, O>: BitField,
{
#[inline]
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
let mut count = 0;
unsafe { self.chunks_exact_mut(bits_of::<u8>()).remove_alias() }
.zip(buf.iter().copied())
.for_each(|(slot, byte)| {
slot.store_be(byte);
count += 1;
});
*self = unsafe {
mem::take(self).get_unchecked_mut(count * bits_of::<u8>() ..)
};
Ok(count)
}
#[inline]
#[cfg(not(tarpaulin_include))]
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}
#[doc = include_str!("../../doc/field/io/Read_BitVec.md")]
impl<T, O> Read for BitVec<T, O>
where
T: BitStore,
O: BitOrder,
BitSlice<T, O>: BitField,
{
#[inline]
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
let bytes_read = self.as_bitslice().read(buf)?;
let bits = bytes_read * bits_of::<u8>();
self.shift_left(bits);
self.truncate(self.len() - bits);
Ok(bytes_read)
}
}
#[doc = include_str!("../../doc/field/io/Write_BitVec.md")]
impl<T, O> Write for BitVec<T, O>
where
O: BitOrder,
T: BitStore,
BitSlice<T, O>: BitField,
{
#[inline]
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
let len = self.len();
self.resize(len + buf.len() * bits_of::<u8>(), false);
unsafe { self.get_unchecked_mut(len ..) }.write(buf)
}
#[inline]
#[cfg(not(tarpaulin_include))]
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}