Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
use core::{borrow::Borrow, ops::Deref};
pub(crate) struct BufferOverflow;
pub(crate) struct Buffer<'a, const N: usize> {
data: &'a mut [u8; N],
i: usize,
}
impl<'a, const N: usize> Buffer<'a, N> {
pub fn new(data: &'a mut [u8; N], i: usize) -> Self {
Self { data, i }
}
/*pub fn as_slice(&self) -> &'a [u8] {
&self.data[..self.i]
}
pub fn as_slice_mut(&mut self) -> &'a [u8] {
&mut self.data[..self.i]
}*/
pub const fn remaining_capacity(&self) -> usize {
N - self.i
}
pub fn try_push(&mut self, v: u8) -> Result<(), BufferOverflow> {
if self.i == N {
return Err(BufferOverflow);
}
self.data[self.i] = v;
self.i += 1;
Ok(())
}
pub fn try_extend_from_slice(&mut self, other: &[u8]) -> Result<(), BufferOverflow> {
if self.remaining_capacity() < other.len() {
return Err(BufferOverflow);
}
self.data[self.i..(self.i + other.len())].copy_from_slice(other);
self.i += other.len();
Ok(())
}
pub fn pop(&mut self) -> Option<u8> {
if self.i == 0 {
return None;
}
self.i -= 1;
Some(self.data[self.i])
}
}
impl<'a, const N: usize> From<&'a mut [u8; N]> for Buffer<'a, N> {
fn from(data: &'a mut [u8; N]) -> Self {
Self { data, i: 0 }
}
}
impl<'a, const N: usize> Deref for Buffer<'a, N> {
type Target = [u8];
fn deref(&self) -> &Self::Target {
&self.data[..self.i]
}
}