variable_len_reader/util/
read_buf.rs1macro_rules! impl_read_buf {
2 () => {
3 #[inline]
4 fn len(&self) -> usize {
5 self.buf.as_ref().len()
6 }
7
8 #[inline]
9 pub fn buf(&self) -> &[u8] {
10 self.buf.as_ref()
11 }
12
13 #[inline]
14 pub fn buf_mut(&mut self) -> &mut [u8] {
15 self.buf.as_mut()
16 }
17
18 #[inline]
19 pub fn position(&self) -> usize {
20 self.position
21 }
22
23 #[inline]
24 pub fn advance(&mut self, cnt: usize) {
25 let new = self.position.checked_add(cnt).expect("advance overflow");
26 assert!(
27 self.len() >= new,
28 "position ({}) must not become larger than buf.len ({})",
29 new, self.len()
30 );
31 self.position = new;
32 }
33
34 #[inline]
35 pub fn left(&self) -> usize {
36 self.len() - self.position
37 }
38
39 #[inline]
40 pub fn reset(&mut self) {
41 self.position = 0;
42 }
43
44 #[inline]
45 pub fn set_position(&mut self, position: usize) {
46 assert!(
47 self.len() >= position,
48 "position ({}) must not become larger than buf.len ({})",
49 position, self.len()
50 );
51 self.position = position;
52 }
53
54
55 #[inline]
56 pub fn set(&mut self, val: u8) {
57 self.buf.as_mut()[self.position] = val;
58 }
59
60 #[inline]
61 pub fn put(&mut self, val: u8) {
62 assert!(
63 self.left() >= 1,
64 "no more writable bytes in buffer"
65 );
66 self.set(val);
67 self.position += 1;
68 }
69
70 #[inline]
71 pub fn set_slice(&mut self, slice: &[u8]) {
72 assert!(
73 self.left() >= slice.len(),
74 "not enough writable bytes in buffer"
75 );
76 self.buf.as_mut()[self.position..self.position + slice.len()].copy_from_slice(slice);
77 }
78
79 #[inline]
80 pub fn put_slice(&mut self, slice: &[u8]) {
81 self.set_slice(slice);
82 self.position += slice.len();
83 }
84 };
85}
86#[cfg(feature = "bytes")]
87macro_rules! impl_bytes_buf {
88 () => {
89 #[inline]
90 fn remaining_mut(&self) -> usize {
91 self.left()
92 }
93
94 #[inline]
95 unsafe fn advance_mut(&mut self, cnt: usize) {
96 self.advance(cnt)
97 }
98
99 #[inline]
100 fn chunk_mut(&mut self) -> &mut bytes::buf::UninitSlice {
101 bytes::buf::UninitSlice::new(self.buf_mut())
102 }
103 };
104}
105
106#[derive(Debug)]
107pub struct ReadBuf<'a> {
108 buf: &'a mut [u8],
109 position: usize,
110}
111
112impl<'a> ReadBuf<'a> {
113 pub fn new(buf: &'a mut [u8]) -> Self {
114 Self {
115 buf,
116 position: 0,
117 }
118 }
119
120 impl_read_buf!();
121}
122
123#[cfg(feature = "bytes")]
124#[cfg_attr(docsrs, doc(cfg(feature = "bytes")))]
125unsafe impl<'a> bytes::BufMut for ReadBuf<'a> {
126 impl_bytes_buf!();
127}
128
129#[cfg(feature = "tokio")]
130#[cfg_attr(docsrs, doc(cfg(feature = "tokio")))]
131impl<'a, 'b> From<&'b mut ReadBuf<'a>> for tokio::io::ReadBuf<'b> {
132 #[inline]
133 fn from(value: &'b mut ReadBuf<'a>) -> Self {
134 let mut buf = Self::new(value.buf);
135 buf.set_filled(value.position);
136 buf
137 }
138}
139
140
141#[derive(Debug, Clone)]
143pub struct OwnedReadBuf<B: AsRef<[u8]> + AsMut<[u8]>> {
144 buf: B,
145 position: usize
146}
147
148impl<B: AsRef<[u8]> + AsMut<[u8]>> OwnedReadBuf<B> {
149 pub fn new(buf: B) -> Self {
150 Self {
151 buf,
152 position: 0,
153 }
154 }
155
156 pub fn into_inner(self) -> B {
157 self.buf
158 }
159
160 impl_read_buf!();
161}
162
163#[cfg(feature = "bytes")]
164#[cfg_attr(docsrs, doc(cfg(feature = "bytes")))]
165unsafe impl<B: AsRef<[u8]> + AsMut<[u8]>> bytes::BufMut for OwnedReadBuf<B> {
166 impl_bytes_buf!();
167}
168
169impl<'a, B: AsRef<[u8]> + AsMut<[u8]>> From<&'a mut OwnedReadBuf<B>> for ReadBuf<'a> {
170 #[inline]
171 fn from(value: &'a mut OwnedReadBuf<B>) -> Self {
172 let mut buf = Self::new(value.buf.as_mut());
173 buf.set_position(value.position);
174 buf
175 }
176}
177
178#[cfg(feature = "tokio")]
179#[cfg_attr(docsrs, doc(cfg(feature = "tokio")))]
180impl<'a, B: AsRef<[u8]> + AsMut<[u8]>> From<&'a mut OwnedReadBuf<B>> for tokio::io::ReadBuf<'a> {
181 #[inline]
182 fn from(value: &'a mut OwnedReadBuf<B>) -> Self {
183 let mut buf = Self::new(value.buf.as_mut());
184 buf.set_filled(value.position);
185 buf
186 }
187}
188
189
190#[cfg(test)]
191fn __owned_read_buf_u8_array() {
192 let _ = OwnedReadBuf::<[u8; 16]>::new([0; 16]);
193}
194#[cfg(all(test, feature = "alloc"))]
195fn __owned_read_buf_u8_vec() {
196 let _ = OwnedReadBuf::<alloc::vec::Vec<u8>>::new(alloc::vec::Vec::new());
197}