bitvec/field/
io.rs
1#![cfg(feature = "std")]
2#![doc = include_str!("../../doc/field/io.md")]
3
4use core::mem;
5use std::io::{
6 self,
7 Read,
8 Write,
9};
10
11use super::BitField;
12use crate::{
13 mem::bits_of,
14 order::BitOrder,
15 slice::BitSlice,
16 store::BitStore,
17 vec::BitVec,
18};
19
20#[doc = include_str!("../../doc/field/io/Read_BitSlice.md")]
21impl<T, O> Read for &BitSlice<T, O>
22where
23 T: BitStore,
24 O: BitOrder,
25 BitSlice<T, O>: BitField,
26{
27 #[inline]
28 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
29 let mut count = 0;
30 self.chunks_exact(bits_of::<u8>())
31 .zip(buf.iter_mut())
32 .for_each(|(byte, slot)| {
33 *slot = byte.load_be();
34 count += 1;
35 });
36 *self = unsafe { self.get_unchecked(count * bits_of::<u8>() ..) };
37 Ok(count)
38 }
39}
40
41#[doc = include_str!("../../doc/field/io/Write_BitSlice.md")]
42impl<T, O> Write for &mut BitSlice<T, O>
43where
44 T: BitStore,
45 O: BitOrder,
46 BitSlice<T, O>: BitField,
47{
48 #[inline]
49 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
50 let mut count = 0;
51 unsafe { self.chunks_exact_mut(bits_of::<u8>()).remove_alias() }
52 .zip(buf.iter().copied())
53 .for_each(|(slot, byte)| {
54 slot.store_be(byte);
55 count += 1;
56 });
57 *self = unsafe {
58 mem::take(self).get_unchecked_mut(count * bits_of::<u8>() ..)
59 };
60 Ok(count)
61 }
62
63 #[inline]
64 #[cfg(not(tarpaulin_include))]
65 fn flush(&mut self) -> io::Result<()> {
66 Ok(())
67 }
68}
69
70#[doc = include_str!("../../doc/field/io/Read_BitVec.md")]
71impl<T, O> Read for BitVec<T, O>
72where
73 T: BitStore,
74 O: BitOrder,
75 BitSlice<T, O>: BitField,
76{
77 #[inline]
78 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
79 let bytes_read = self.as_bitslice().read(buf)?;
80 let bits = bytes_read * bits_of::<u8>();
81 self.shift_left(bits);
82 self.truncate(self.len() - bits);
83 Ok(bytes_read)
84 }
85}
86
87#[doc = include_str!("../../doc/field/io/Write_BitVec.md")]
88impl<T, O> Write for BitVec<T, O>
89where
90 O: BitOrder,
91 T: BitStore,
92 BitSlice<T, O>: BitField,
93{
94 #[inline]
95 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
96 let len = self.len();
97 self.resize(len + buf.len() * bits_of::<u8>(), false);
98 unsafe { self.get_unchecked_mut(len ..) }.write(buf)
99 }
100
101 #[inline]
102 #[cfg(not(tarpaulin_include))]
103 fn flush(&mut self) -> io::Result<()> {
104 Ok(())
105 }
106}