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}