bits_io/buf/
bit_buf_mut_impls.rs

1use bytes::BufMut;
2
3use super::{bit_buf_mut::BitBufMut, bits_mut::BitsMut};
4use crate::{buf::util::bytes_needed, prelude::*};
5
6impl BitBufMut for BitsMut {
7    fn remaining_mut(&self) -> usize {
8        usize::MAX - self.bit_len
9    }
10
11    fn chunk_mut(&mut self) -> &mut BitSlice {
12        if self.capacity == self.bit_len {
13            self.reserve(64);
14        }
15        self.spare_capacity_mut()
16    }
17
18    fn chunk_mut_bytes(&mut self) -> &mut bytes::buf::UninitSlice {
19        assert!(self.byte_aligned_mut());
20        if self.capacity == self.bit_len {
21            self.reserve(64);
22        }
23        self.inner.chunk_mut()
24    }
25
26    fn advance_mut(&mut self, cnt: usize) {
27        assert!(cnt <= self.remaining_mut(), "advance_mut past end");
28        let current_byte_len = bytes_needed(self.bit_len);
29        self.bit_len += cnt;
30        let new_byte_len = bytes_needed(self.bit_len);
31        // Every time we cross into a new byte, we need to advance the underlying instance's
32        // position as well.
33        if new_byte_len > current_byte_len {
34            unsafe {
35                self.inner.advance_mut(new_byte_len - current_byte_len);
36            }
37        }
38    }
39
40    fn byte_aligned_mut(&self) -> bool {
41        self.bit_start % 8 == 0 && self.bit_len % 8 == 0
42    }
43}