karyon_net/codec/
buffer.rs

1use bytes::{Buf, BytesMut};
2
3pub type ByteBuffer = Buffer;
4
5#[derive(Debug, Default)]
6pub struct Buffer {
7    inner: BytesMut,
8}
9
10impl Buffer {
11    /// Constructs a new, empty Buffer.
12    pub fn new() -> Self {
13        Self {
14            inner: BytesMut::new(),
15        }
16    }
17
18    /// Returns the number of elements in the buffer.
19    pub fn len(&self) -> usize {
20        self.inner.len()
21    }
22
23    /// Resizes the buffer in-place so that `len` is equal to `new_size`.
24    pub fn resize(&mut self, new_size: usize) {
25        self.inner.resize(new_size, 0u8);
26    }
27
28    /// Appends all elements in a slice to the buffer.
29    pub fn extend_from_slice(&mut self, bytes: &[u8]) {
30        self.inner.extend_from_slice(bytes);
31    }
32
33    /// Shortens the buffer, dropping the first `cnt` bytes and keeping the
34    /// rest.
35    pub fn advance(&mut self, cnt: usize) {
36        self.inner.advance(cnt);
37    }
38
39    /// Returns `true` if the buffer contains no elements.
40    pub fn is_empty(&self) -> bool {
41        self.inner.is_empty()
42    }
43}
44
45impl AsMut<[u8]> for Buffer {
46    fn as_mut(&mut self) -> &mut [u8] {
47        self.inner.as_mut()
48    }
49}
50
51impl AsRef<[u8]> for Buffer {
52    fn as_ref(&self) -> &[u8] {
53        self.inner.as_ref()
54    }
55}
56
57#[cfg(test)]
58mod tests {
59    use super::*;
60
61    #[test]
62    fn test_buffer() {
63        let mut buf = Buffer::new();
64        assert_eq!(&[] as &[u8], buf.as_ref());
65        assert_eq!(0, buf.len());
66        assert!(buf.is_empty());
67
68        buf.extend_from_slice(&[1, 2, 3, 4, 5]);
69        assert_eq!(&[1, 2, 3, 4, 5], buf.as_ref());
70        assert_eq!(5, buf.len());
71        assert!(!buf.is_empty());
72
73        buf.advance(2);
74        assert_eq!(&[3, 4, 5], buf.as_ref());
75        assert_eq!(3, buf.len());
76        assert!(!buf.is_empty());
77
78        buf.extend_from_slice(&[6, 7, 8]);
79        assert_eq!(&[3, 4, 5, 6, 7, 8], buf.as_ref());
80        assert_eq!(6, buf.len());
81        assert!(!buf.is_empty());
82
83        buf.advance(4);
84        assert_eq!(&[7, 8], buf.as_ref());
85        assert_eq!(2, buf.len());
86        assert!(!buf.is_empty());
87
88        buf.advance(2);
89        assert_eq!(&[] as &[u8], buf.as_ref());
90        assert_eq!(0, buf.len());
91        assert!(buf.is_empty());
92    }
93}