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}