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}