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::{
130 /// Fill,
131 /// thread_rng
132 /// };
133 /// use sheave_core::ByteBuffer;
134 ///
135 /// let mut bytes: [u8; 3] = [0; 3];
136 /// bytes.try_fill(&mut thread_rng()).unwrap();
137 /// let mut buffer: ByteBuffer = bytes.to_vec().into();
138 /// assert!(buffer.get_i24_be().is_ok());
139 ///
140 /// let mut buffer: ByteBuffer = Vec::new().into();
141 /// assert!(buffer.get_i24_be().is_err());
142 /// ```
143 ///
144 /// [`InsufficientBufferLength`]: InsufficientBufferLength
145 pub fn get_i24_be(&mut self) -> IOResult<i32> {
146 let offset = self.offset;
147 self.bytes.get(offset..(offset + 3)).map(
148 |bytes| {
149 self.offset += bytes.len();
150 let mut _bytes: [u8; 4] = [0; 4];
151 _bytes[1..].copy_from_slice(bytes);
152 let mut n = i32::from_be_bytes(_bytes);
153
154 // Moves the most significant bit if this is a negative number in 3 bytes.
155 if (n & 0x00800000) != 0 {
156 n ^= -1;
157 n += 1;
158 }
159
160 n
161 }
162 ).ok_or(insufficient_buffer_length(3, self.remained()))
163 }
164
165 /// Tries getting 3 bytes from buffer, as the big endian.
166 ///
167 /// # Errors
168 ///
169 /// * [`InsufficientBufferLength`]
170 ///
171 /// When buffer isn't remained at least 2 bytes.
172 ///
173 /// # Examples
174 ///
175 /// ```rust
176 /// use rand::{
177 /// Fill,
178 /// thread_rng
179 /// };
180 /// use sheave_core::ByteBuffer;
181 ///
182 /// let mut bytes: [u8; 3] = [0; 3];
183 /// bytes.try_fill(&mut thread_rng()).unwrap();
184 /// let mut buffer: ByteBuffer = bytes.to_vec().into();
185 /// assert!(buffer.get_u24_be().is_ok());
186 ///
187 /// let mut buffer: ByteBuffer = Vec::new().into();
188 /// assert!(buffer.get_u24_be().is_err());
189 /// ```
190 ///
191 /// [`InsufficientBufferLength`]: InsufficientBufferLength
192 pub fn get_u24_be(&mut self) -> IOResult<u32> {
193 let offset = self.offset;
194 self.bytes.get(offset..(offset + 3)).map(
195 |bytes| {
196 self.offset += bytes.len();
197 let mut _bytes: [u8; 4] = [0; 4];
198 _bytes[1..].copy_from_slice(bytes);
199 u32::from_be_bytes(_bytes)
200 }
201 ).ok_or(insufficient_buffer_length(3, self.remained()))
202 }
203
204 /// Tries getting 4 bytes from buffer, as the big endian.
205 ///
206 /// # Errors
207 ///
208 /// * [`InsufficientBufferLength`]
209 ///
210 /// When buffer isn't remained at least 4 bytes.
211 ///
212 /// # Examples
213 ///
214 /// ```rust
215 /// use rand::random;
216 /// use sheave_core::ByteBuffer;
217 ///
218 /// let mut buffer: ByteBuffer = random::<u32>().to_be_bytes().to_vec().into();
219 /// assert!(buffer.get_u32_be().is_ok());
220 ///
221 /// let mut buffer: ByteBuffer = Vec::new().into();
222 /// assert!(buffer.get_u32_be().is_err());
223 /// ```
224 ///
225 /// [`InsufficientBufferLength`]: InsufficientBufferLength
226 pub fn get_u32_be(&mut self) -> IOResult<u32> {
227 let offset = self.offset;
228 self.bytes.get(offset..(offset + 4)).map(
229 |bytes| {
230 self.offset += bytes.len();
231 let mut _bytes: [u8; 4] = [0; 4];
232 _bytes.copy_from_slice(bytes);
233 u32::from_be_bytes(_bytes)
234 }
235 ).ok_or(insufficient_buffer_length(4, self.remained()))
236 }
237
238 /// Tries getting 8 bytes from buffer, as a 64 bits floating point number.
239 ///
240 /// # Errors
241 ///
242 /// * [`InsufficientBufferLength`]
243 ///
244 /// When buffer isn't remained at least 8 bytes.
245 ///
246 /// # Examples
247 ///
248 /// ```rust
249 /// use rand::random;
250 /// use sheave_core::ByteBuffer;
251 ///
252 /// let mut buffer: ByteBuffer = random::<u64>().to_be_bytes().to_vec().into();
253 /// assert!(buffer.get_f64().is_ok());
254 ///
255 /// let mut buffer: ByteBuffer = Vec::new().into();
256 /// assert!(buffer.get_f64().is_err());
257 /// ```
258 ///
259 /// [`InsufficientBufferLength`]: InsufficientBufferLength
260 pub fn get_f64(&mut self) -> IOResult<f64> {
261 let offset = self.offset;
262 self.bytes.get(offset..(offset + 8)).map(
263 |bytes| {
264 self.offset += bytes.len();
265 let mut _bytes: [u8; 8] = [0; 8];
266 _bytes.copy_from_slice(bytes);
267 f64::from_be_bytes(_bytes)
268 }
269 ).ok_or(insufficient_buffer_length(8, self.remained()))
270 }
271
272 /// Tries getting arbitrary bytes from buffer.
273 ///
274 /// # Erorrs
275 ///
276 /// * `InsufficientBufferLength`
277 ///
278 /// When buffer isn't remained at least specified length.
279 ///
280 /// # Examples
281 ///
282 /// ```rust
283 /// use sheave_core::ByteBuffer;
284 ///
285 /// let bytes = "hello world!".as_bytes();
286 /// let mut buffer: ByteBuffer = bytes.to_vec().into();
287 /// assert!(buffer.get_bytes(bytes.len()).is_ok());
288 ///
289 /// let mut buffer: ByteBuffer = Vec::new().into();
290 /// assert!(buffer.get_bytes(bytes.len()).is_err())
291 /// ```
292 ///
293 /// [`InsufficientBufferLength`]: InsufficientBufferLength
294 pub fn get_bytes(&mut self, len: usize) -> IOResult<&[u8]> {
295 let offset = self.offset;
296 self.bytes.get(offset..(offset + len)).map(
297 |bytes| {
298 self.offset += len;
299 bytes
300 }
301 ).ok_or(insufficient_buffer_length(len, self.remained()))
302 }
303
304 /// Puts 1 byte into buffer.
305 pub fn put_u8(&mut self, n: u8) {
306 self.bytes.push(n);
307 }
308
309 /// Puts 2 bytes into buffer, as the big endian.
310 pub fn put_u16_be(&mut self, n: u16) {
311 self.bytes.extend_from_slice(&n.to_be_bytes());
312 }
313
314 /// Puts **signed** 3 bytes into buffer, as the big endian.
315 ///
316 /// # Panics
317 ///
318 /// Its value must be the range of 24 bits.
319 /// If it exceeds, a panic is occured.
320 ///
321 /// # Examples
322 ///
323 /// ```rust
324 /// use std::panic::catch_unwind;
325 ///
326 /// let result = catch_unwind(
327 /// || {
328 /// use sheave_core::ByteBuffer;
329 ///
330 /// let mut buffer = ByteBuffer::default();
331 /// buffer.put_i24_be((0x00ffffff + 1) as i32);
332 /// }
333 /// );
334 /// assert!(result.is_err())
335 /// ```
336 pub fn put_i24_be(&mut self, n: i32) {
337 assert!(n <= U24_MAX as i32);
338 self.bytes.extend_from_slice(&n.to_be_bytes()[1..]);
339 }
340
341 /// Puts 3 bytes into buffer, as the big endian.
342 ///
343 /// # Panics
344 ///
345 /// Its value must be the range of 24 bits.
346 /// If it exceeds, a panic is occured.
347 ///
348 /// # Examples
349 ///
350 /// ```rust
351 /// use std::panic::catch_unwind;
352 ///
353 /// let result = catch_unwind(
354 /// || {
355 /// use sheave_core::ByteBuffer;
356 ///
357 /// let mut buffer = ByteBuffer::default();
358 /// buffer.put_u24_be((0x00ffffff + 1) as u32);
359 /// }
360 /// );
361 /// assert!(result.is_err())
362 /// ```
363 pub fn put_u24_be(&mut self, n: u32) {
364 assert!(n <= U24_MAX as u32);
365 self.bytes.extend_from_slice(&n.to_be_bytes()[1..]);
366 }
367
368 /// Puts 4 bytes into buffer, as the big endian.
369 pub fn put_u32_be(&mut self, n: u32) {
370 self.bytes.extend_from_slice(&n.to_be_bytes());
371 }
372
373 /// Puts 8 bytes into buffer, as a 64 bits floating point number.
374 pub fn put_f64(&mut self, n: f64) {
375 self.bytes.extend_from_slice(&n.to_be_bytes());
376 }
377
378 /// Puts arbitrary bytes into buffer.
379 pub fn put_bytes(&mut self, bytes: &[u8]) {
380 self.bytes.extend_from_slice(bytes);
381 }
382}
383
384impl From<Vec<u8>> for ByteBuffer {
385 fn from(bytes: Vec<u8>) -> Self {
386 Self {
387 bytes,
388 offset: 0
389 }
390 }
391}
392
393impl From<ByteBuffer> for Vec<u8> {
394 /// Converts remained bytes into Vec.
395 ///
396 /// # Examples
397 ///
398 /// ```rust
399 /// use rand::{
400 /// Fill,
401 /// thread_rng
402 /// };
403 /// use sheave_core::ByteBuffer;
404 ///
405 /// // When all byte is remained.
406 /// let mut array: [u8; 128] = [0; 128];
407 /// array.try_fill(&mut thread_rng()).unwrap();
408 /// let mut buffer = ByteBuffer::default();
409 /// buffer.put_bytes(&array);
410 /// let bytes: Vec<u8> = buffer.into();
411 /// assert_eq!(array.as_slice(), &bytes);
412 ///
413 /// // When some bytes are consumed.
414 /// let mut array: [u8; 128] = [0; 128];
415 /// array.try_fill(&mut thread_rng()).unwrap();
416 /// let mut buffer = ByteBuffer::default();
417 /// buffer.put_bytes(&array);
418 /// buffer.get_u8().unwrap();
419 /// let bytes: Vec<u8> = buffer.into();
420 /// assert_eq!(&array[1..], &bytes)
421 /// ```
422 fn from(buffer: ByteBuffer) -> Self {
423 buffer.bytes[buffer.offset..].to_vec()
424 }
425}