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