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