sheave_core/byte_buffer.rs
1mod insufficient_buffer_length;
2
3use std::io::Result as IOResult;
4use crate::U24_MAX;
5pub use self::insufficient_buffer_length::*;
6
7/// The stream buffer for encoding/decoding chunk data.
8#[derive(Debug, Clone, Default)]
9pub struct ByteBuffer {
10 bytes: Vec<u8>,
11 offset: usize
12}
13
14impl ByteBuffer {
15 /// Computes remained length in this buffer.
16 pub fn remained(&self) -> usize {
17 self.bytes.len() - self.offset
18 }
19
20 /// Peeks 1 byte from buffer.
21 ///
22 /// This keeps buffer's current offset.
23 ///
24 /// # Errors
25 ///
26 /// * [`InSufficientBufferLength`]
27 ///
28 /// When buffer isn't remained at least 1 byte.
29 ///
30 /// # Examples
31 ///
32 /// ```rust
33 /// use rand::random;
34 /// use sheave_core::ByteBuffer;
35 ///
36 /// let n = random::<u8>();
37 /// let mut buffer: ByteBuffer = n.to_be_bytes().to_vec().into();
38 /// assert!(buffer.peek_u8().is_ok());
39 /// let bytes: Vec<u8> = buffer.into();
40 /// // Buffer isn't consumed.
41 /// assert_eq!(n.to_be_bytes().as_slice(), &bytes);
42 ///
43 /// let mut buffer: ByteBuffer = Vec::new().into();
44 /// assert!(buffer.peek_u8().is_err());
45 /// ```
46 ///
47 /// [`InsufficientBufferLength`]: InsufficientBufferLength
48 pub fn peek_u8(&self) -> IOResult<u8> {
49 let offset = self.offset;
50 self.bytes.get(offset).map(|byte| *byte).ok_or(insufficient_buffer_length(1, self.remained()))
51 }
52
53 /// Tries getting 1 byte from buffer.
54 ///
55 /// # Errors
56 ///
57 /// * [`InsufficientBufferLength`]
58 ///
59 /// When buffer isn't remained at least 1 byte.
60 ///
61 /// # Examples
62 ///
63 /// ```rust
64 /// use rand::random;
65 /// use sheave_core::ByteBuffer;
66 ///
67 /// let mut buffer: ByteBuffer = random::<u8>().to_be_bytes().to_vec().into();
68 /// assert!(buffer.get_u8().is_ok());
69 ///
70 /// let mut buffer: ByteBuffer = Vec::new().into();
71 /// assert!(buffer.get_u8().is_err());
72 /// ```
73 ///
74 /// [`InsufficientBufferLength`]: InsufficientBufferLength
75 pub fn get_u8(&mut self) -> IOResult<u8> {
76 let offset = self.offset;
77 self.bytes.get(offset).map(
78 |byte| {
79 self.offset += 1;
80 *byte
81 }
82 ).ok_or(insufficient_buffer_length(1, self.remained()))
83 }
84
85 /// Tries getting 2 bytes from buffer, as the big endian.
86 ///
87 /// # Errors
88 ///
89 /// * [`InsufficientBufferLength`]
90 ///
91 /// When buffer isn't remained at least 2 bytes.
92 ///
93 /// # Examples
94 ///
95 /// ```rust
96 /// use rand::random;
97 /// use sheave_core::ByteBuffer;
98 ///
99 /// let mut buffer: ByteBuffer = random::<u16>().to_be_bytes().to_vec().into();
100 /// assert!(buffer.get_u16_be().is_ok());
101 ///
102 /// let mut buffer: ByteBuffer = Vec::new().into();
103 /// assert!(buffer.get_u16_be().is_err());
104 /// ```
105 ///
106 /// [`InsufficientBufferLength`]: InsufficientBufferLength
107 pub fn get_u16_be(&mut self) -> IOResult<u16> {
108 let offset = self.offset;
109 self.bytes.get(offset..(offset + 2)).map(
110 |bytes| {
111 self.offset += bytes.len();
112 let mut _bytes: [u8; 2] = [0; 2];
113 _bytes.copy_from_slice(bytes);
114 u16::from_be_bytes(_bytes)
115 }
116 ).ok_or(insufficient_buffer_length(2, self.remained()))
117 }
118
119 /// Tries getting **signed** 3 bytes from buffer, as the big endian.
120 ///
121 /// # Errors
122 ///
123 /// * [`InsufficientBufferLength`]
124 ///
125 /// When buffer isn't remained at least 2 bytes.
126 ///
127 /// # Examples
128 ///
129 /// ```rust
130 /// use rand::fill;
131 /// use sheave_core::ByteBuffer;
132 ///
133 /// let mut bytes: [u8; 3] = [0; 3];
134 /// fill(&mut bytes);
135 /// let mut buffer: ByteBuffer = bytes.to_vec().into();
136 /// assert!(buffer.get_i24_be().is_ok());
137 ///
138 /// let mut buffer: ByteBuffer = Vec::new().into();
139 /// assert!(buffer.get_i24_be().is_err());
140 /// ```
141 ///
142 /// [`InsufficientBufferLength`]: InsufficientBufferLength
143 pub fn get_i24_be(&mut self) -> IOResult<i32> {
144 let offset = self.offset;
145 self.bytes.get(offset..(offset + 3)).map(
146 |bytes| {
147 self.offset += bytes.len();
148 let mut _bytes: [u8; 4] = [0; 4];
149 _bytes[1..].copy_from_slice(bytes);
150 let mut n = i32::from_be_bytes(_bytes);
151
152 // Moves the most significant bit if this is a negative number in 3 bytes.
153 if (n & 0x00800000) != 0 {
154 n ^= -1;
155 n += 1;
156 }
157
158 n
159 }
160 ).ok_or(insufficient_buffer_length(3, self.remained()))
161 }
162
163 /// Tries getting 3 bytes from buffer, as the big endian.
164 ///
165 /// # Errors
166 ///
167 /// * [`InsufficientBufferLength`]
168 ///
169 /// When buffer isn't remained at least 2 bytes.
170 ///
171 /// # Examples
172 ///
173 /// ```rust
174 /// use rand::fill;
175 /// use sheave_core::ByteBuffer;
176 ///
177 /// let mut bytes: [u8; 3] = [0; 3];
178 /// fill(&mut bytes);
179 /// let mut buffer: ByteBuffer = bytes.to_vec().into();
180 /// assert!(buffer.get_u24_be().is_ok());
181 ///
182 /// let mut buffer: ByteBuffer = Vec::new().into();
183 /// assert!(buffer.get_u24_be().is_err());
184 /// ```
185 ///
186 /// [`InsufficientBufferLength`]: InsufficientBufferLength
187 pub fn get_u24_be(&mut self) -> IOResult<u32> {
188 let offset = self.offset;
189 self.bytes.get(offset..(offset + 3)).map(
190 |bytes| {
191 self.offset += bytes.len();
192 let mut _bytes: [u8; 4] = [0; 4];
193 _bytes[1..].copy_from_slice(bytes);
194 u32::from_be_bytes(_bytes)
195 }
196 ).ok_or(insufficient_buffer_length(3, self.remained()))
197 }
198
199 /// Tries getting 4 bytes from buffer, as the big endian.
200 ///
201 /// # Errors
202 ///
203 /// * [`InsufficientBufferLength`]
204 ///
205 /// When buffer isn't remained at least 4 bytes.
206 ///
207 /// # Examples
208 ///
209 /// ```rust
210 /// use rand::random;
211 /// use sheave_core::ByteBuffer;
212 ///
213 /// let mut buffer: ByteBuffer = random::<u32>().to_be_bytes().to_vec().into();
214 /// assert!(buffer.get_u32_be().is_ok());
215 ///
216 /// let mut buffer: ByteBuffer = Vec::new().into();
217 /// assert!(buffer.get_u32_be().is_err());
218 /// ```
219 ///
220 /// [`InsufficientBufferLength`]: InsufficientBufferLength
221 pub fn get_u32_be(&mut self) -> IOResult<u32> {
222 let offset = self.offset;
223 self.bytes.get(offset..(offset + 4)).map(
224 |bytes| {
225 self.offset += bytes.len();
226 let mut _bytes: [u8; 4] = [0; 4];
227 _bytes.copy_from_slice(bytes);
228 u32::from_be_bytes(_bytes)
229 }
230 ).ok_or(insufficient_buffer_length(4, self.remained()))
231 }
232
233 /// Tries getting 8 bytes from buffer, as a 64 bits floating point number.
234 ///
235 /// # Errors
236 ///
237 /// * [`InsufficientBufferLength`]
238 ///
239 /// When buffer isn't remained at least 8 bytes.
240 ///
241 /// # Examples
242 ///
243 /// ```rust
244 /// use rand::random;
245 /// use sheave_core::ByteBuffer;
246 ///
247 /// let mut buffer: ByteBuffer = random::<u64>().to_be_bytes().to_vec().into();
248 /// assert!(buffer.get_f64().is_ok());
249 ///
250 /// let mut buffer: ByteBuffer = Vec::new().into();
251 /// assert!(buffer.get_f64().is_err());
252 /// ```
253 ///
254 /// [`InsufficientBufferLength`]: InsufficientBufferLength
255 pub fn get_f64(&mut self) -> IOResult<f64> {
256 let offset = self.offset;
257 self.bytes.get(offset..(offset + 8)).map(
258 |bytes| {
259 self.offset += bytes.len();
260 let mut _bytes: [u8; 8] = [0; 8];
261 _bytes.copy_from_slice(bytes);
262 f64::from_be_bytes(_bytes)
263 }
264 ).ok_or(insufficient_buffer_length(8, self.remained()))
265 }
266
267 /// Tries getting arbitrary bytes from buffer.
268 ///
269 /// # Erorrs
270 ///
271 /// * `InsufficientBufferLength`
272 ///
273 /// When buffer isn't remained at least specified length.
274 ///
275 /// # Examples
276 ///
277 /// ```rust
278 /// use sheave_core::ByteBuffer;
279 ///
280 /// let bytes = "hello world!".as_bytes();
281 /// let mut buffer: ByteBuffer = bytes.to_vec().into();
282 /// assert!(buffer.get_bytes(bytes.len()).is_ok());
283 ///
284 /// let mut buffer: ByteBuffer = Vec::new().into();
285 /// assert!(buffer.get_bytes(bytes.len()).is_err())
286 /// ```
287 ///
288 /// [`InsufficientBufferLength`]: InsufficientBufferLength
289 pub fn get_bytes(&mut self, len: usize) -> IOResult<&[u8]> {
290 let offset = self.offset;
291 self.bytes.get(offset..(offset + len)).map(
292 |bytes| {
293 self.offset += len;
294 bytes
295 }
296 ).ok_or(insufficient_buffer_length(len, self.remained()))
297 }
298
299 /// Puts 1 byte into buffer.
300 pub fn put_u8(&mut self, n: u8) {
301 self.bytes.push(n);
302 }
303
304 /// Puts 2 bytes into buffer, as the big endian.
305 pub fn put_u16_be(&mut self, n: u16) {
306 self.bytes.extend_from_slice(&n.to_be_bytes());
307 }
308
309 /// Puts **signed** 3 bytes into buffer, as the big endian.
310 ///
311 /// # Panics
312 ///
313 /// Its value must be the range of 24 bits.
314 /// If it exceeds, a panic is occured.
315 ///
316 /// # Examples
317 ///
318 /// ```rust
319 /// use std::panic::catch_unwind;
320 ///
321 /// let result = catch_unwind(
322 /// || {
323 /// use sheave_core::ByteBuffer;
324 ///
325 /// let mut buffer = ByteBuffer::default();
326 /// buffer.put_i24_be((0x00ffffff + 1) as i32);
327 /// }
328 /// );
329 /// assert!(result.is_err())
330 /// ```
331 pub fn put_i24_be(&mut self, n: i32) {
332 assert!(n <= U24_MAX as i32);
333 self.bytes.extend_from_slice(&n.to_be_bytes()[1..]);
334 }
335
336 /// Puts 3 bytes into buffer, as the big endian.
337 ///
338 /// # Panics
339 ///
340 /// Its value must be the range of 24 bits.
341 /// If it exceeds, a panic is occured.
342 ///
343 /// # Examples
344 ///
345 /// ```rust
346 /// use std::panic::catch_unwind;
347 ///
348 /// let result = catch_unwind(
349 /// || {
350 /// use sheave_core::ByteBuffer;
351 ///
352 /// let mut buffer = ByteBuffer::default();
353 /// buffer.put_u24_be((0x00ffffff + 1) as u32);
354 /// }
355 /// );
356 /// assert!(result.is_err())
357 /// ```
358 pub fn put_u24_be(&mut self, n: u32) {
359 assert!(n <= U24_MAX as u32);
360 self.bytes.extend_from_slice(&n.to_be_bytes()[1..]);
361 }
362
363 /// Puts 4 bytes into buffer, as the big endian.
364 pub fn put_u32_be(&mut self, n: u32) {
365 self.bytes.extend_from_slice(&n.to_be_bytes());
366 }
367
368 /// Puts 8 bytes into buffer, as a 64 bits floating point number.
369 pub fn put_f64(&mut self, n: f64) {
370 self.bytes.extend_from_slice(&n.to_be_bytes());
371 }
372
373 /// Puts arbitrary bytes into buffer.
374 pub fn put_bytes(&mut self, bytes: &[u8]) {
375 self.bytes.extend_from_slice(bytes);
376 }
377}
378
379impl From<Vec<u8>> for ByteBuffer {
380 fn from(bytes: Vec<u8>) -> Self {
381 Self {
382 bytes,
383 offset: 0
384 }
385 }
386}
387
388impl From<ByteBuffer> for Vec<u8> {
389 /// Converts remained bytes into Vec.
390 ///
391 /// # Examples
392 ///
393 /// ```rust
394 /// use rand::fill;
395 /// use sheave_core::ByteBuffer;
396 ///
397 /// // When all byte is remained.
398 /// let mut array: [u8; 128] = [0; 128];
399 /// fill(&mut array);
400 /// let mut buffer = ByteBuffer::default();
401 /// buffer.put_bytes(&array);
402 /// let bytes: Vec<u8> = buffer.into();
403 /// assert_eq!(array.as_slice(), &bytes);
404 ///
405 /// // When some bytes are consumed.
406 /// let mut array: [u8; 128] = [0; 128];
407 /// fill(&mut array);
408 /// let mut buffer = ByteBuffer::default();
409 /// buffer.put_bytes(&array);
410 /// buffer.get_u8().unwrap();
411 /// let bytes: Vec<u8> = buffer.into();
412 /// assert_eq!(&array[1..], &bytes)
413 /// ```
414 fn from(buffer: ByteBuffer) -> Self {
415 buffer.bytes[buffer.offset..].to_vec()
416 }
417}