1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
use crate::{BitBuf, StorageMut};
impl<S: StorageMut> BitBuf<S> {
/// Write a [`u8`] in BE-bit-order at `byte_offset` without performing any bound checks
///
/// # Safety
///
/// * This is UB if [`byte_offset >= self.bytes().len()`][Self::bytes]
///
/// # Panics
///
/// * Panics in debug mode if [`byte_offset >= self.bytes().len()`][Self::bytes]
#[inline(always)]
pub unsafe fn write_u8_be_aligned_full_at_unchecked(
&mut self,
byte_offset: usize,
v: u8,
) -> &mut Self {
let bytes = self.bytes_mut();
debug_assert!(
byte_offset < bytes.len(),
"BitBuf::write_u8_be_aligned_full_at_unchecked: index out of bounds! len is {}, offset is {}",
bytes.len(),
byte_offset,
);
unsafe { *bytes.get_unchecked_mut(byte_offset) = v };
self
}
/// Write a [`u8`] in BE-bit-order without performing any bound checks, advancing the internal cursor
///
/// # Safety
///
/// * The internal cursor must be byte-aligned ([`self.is_aligned()`][Self::is_aligned])
/// * This is UB if the internal cursor points past the end of storage (<code>[self.byte_pos()][Self::byte_pos] >= [self.bytes().len()][Self::bytes]</code>)
///
/// # Panics
///
/// * Panics in debug mode if the internal cursor is not byte-aligned ([`!self.is_aligned()`][Self::is_aligned])
/// * Panics in debug mode if the internal cursor points past the end of storage (<code>[self.byte_pos()][Self::byte_pos] >= [self.bytes().len()][Self::bytes]</code>)
#[inline(always)]
pub unsafe fn write_u8_be_aligned_full_unchecked(&mut self, v: u8) -> &mut Self {
debug_assert!(
self.is_aligned(),
"BitBuf::write_u8_be_aligned_full_unchecked called at unaligned bit position: {}",
self.pos(),
);
unsafe { self.write_u8_be_aligned_full_at_unchecked(self.byte_pos(), v) };
self.advance_bytes(1);
self
}
}