Coverage Report

Created: 2025-07-01 06:28

/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
}