1use std::io::Cursor;
2
3pub trait Buf {
6 fn remaining(&self) -> usize;
7 fn has_remaining(&self) -> bool {
8 self.remaining() > 0
9 }
10
11 fn slice(&self, size: usize) -> &[u8];
12 fn advance(&mut self, n: usize);
13}
14
15impl Buf for &[u8] {
16 fn remaining(&self) -> usize {
17 self.len()
18 }
19
20 fn slice(&self, size: usize) -> &[u8] {
21 self[..size].as_ref()
22 }
23
24 fn advance(&mut self, n: usize) {
25 *self = &self[n..];
26 }
27}
28
29impl<T: AsRef<[u8]>> Buf for Cursor<T> {
30 fn remaining(&self) -> usize {
31 self.get_ref().as_ref().len() - self.position() as usize
32 }
33
34 fn slice(&self, size: usize) -> &[u8] {
35 let pos = self.position() as usize;
36 self.get_ref().as_ref()[pos..pos + size].as_ref()
37 }
38
39 fn advance(&mut self, n: usize) {
40 self.set_position(self.position() + n as u64);
41 }
42}
43
44impl<T: Buf + ?Sized> Buf for &mut T {
45 fn remaining(&self) -> usize {
46 (**self).remaining()
47 }
48
49 fn slice(&self, size: usize) -> &[u8] {
50 (**self).slice(size)
51 }
52
53 fn advance(&mut self, n: usize) {
54 (**self).advance(n);
55 }
56}
57
58#[cfg(feature = "bytes")]
59impl Buf for bytes::Bytes {
60 fn remaining(&self) -> usize {
61 self.len()
62 }
63
64 fn slice(&self, size: usize) -> &[u8] {
65 &self[..size]
66 }
67
68 fn advance(&mut self, n: usize) {
69 bytes::Buf::advance(self, n);
70 }
71}
72
73pub trait BufMut {
76 fn len(&self) -> usize;
78
79 fn is_empty(&self) -> bool {
80 self.len() == 0
81 }
82
83 fn append_slice(&mut self, val: &[u8]);
85
86 fn set_slice(&mut self, pos: usize, val: &[u8]);
88}
89
90impl BufMut for Vec<u8> {
91 fn len(&self) -> usize {
92 self.len()
93 }
94
95 fn append_slice(&mut self, v: &[u8]) {
96 self.extend_from_slice(v);
97 }
98
99 fn set_slice(&mut self, pos: usize, val: &[u8]) {
100 self[pos..pos + val.len()].copy_from_slice(val);
101 }
102}
103
104impl<T: BufMut + ?Sized> BufMut for &mut T {
105 fn len(&self) -> usize {
106 (**self).len()
107 }
108
109 fn append_slice(&mut self, v: &[u8]) {
110 (**self).append_slice(v);
111 }
112
113 fn set_slice(&mut self, pos: usize, val: &[u8]) {
114 (**self).set_slice(pos, val);
115 }
116}
117
118#[cfg(feature = "bytes")]
119impl BufMut for bytes::BytesMut {
120 fn len(&self) -> usize {
121 self.len()
122 }
123
124 fn append_slice(&mut self, v: &[u8]) {
125 self.extend_from_slice(v);
126 }
127
128 fn set_slice(&mut self, pos: usize, val: &[u8]) {
129 self[pos..pos + val.len()].copy_from_slice(val);
130 }
131}