1use crate::{Buffer, Castable, Error, PtrBuffer, ref_to_bytes, slice_ref_to_bytes};
2
3#[derive(Clone, Eq, Debug)]
5pub struct VecBuffer {
6 data: Vec<u8>,
7}
8impl VecBuffer {
9 pub fn new() -> Self {
11 Self { data: Vec::<u8>::new() }
12 }
13 pub fn from_data<B: AsRef<[u8]>>(data: B) -> Self {
15 Self { data: data.as_ref().to_vec() }
16 }
17 pub fn from_file<P: AsRef<std::path::Path>>(filename: P) -> Result<Self, Error> {
19 let data = match std::fs::read(filename) {
20 Ok(d) => d,
21 Err(e) => return Err(Error::from(e)),
22 };
23
24 Ok(Self { data })
25 }
26 pub fn with_initial_size(size: usize) -> Self {
29 Self::from_data(&vec![0u8; size])
30 }
31 pub fn as_ptr_buffer(&self) -> PtrBuffer {
33 PtrBuffer::new(self.data.as_ptr(), self.data.len())
34 }
35 pub fn append<B: AsRef<[u8]>>(&mut self, data: B) {
37 self.data.append(&mut data.as_ref().to_vec());
38 }
39 pub fn append_ref<T: Castable>(&mut self, data: &T) -> Result<(), Error> {
41 let bytes = ref_to_bytes::<T>(data)?;
42 self.append(bytes); Ok(())
43 }
44 pub fn append_slice_ref<T: Castable>(&mut self, data: &[T]) -> Result<(), Error> {
46 let bytes = slice_ref_to_bytes::<T>(data)?;
47 self.append(bytes); Ok(())
48 }
49 pub fn insert(&mut self, offset: usize, element: u8) {
51 self.data.insert(offset, element);
52 }
53 pub fn remove(&mut self, offset: usize) {
55 self.data.remove(offset);
56 }
57 pub fn retain<F>(&mut self, f: F)
59 where
60 F: FnMut(&u8) -> bool
61 {
62 self.data.retain(f);
63 }
64 pub fn push(&mut self, v: u8) {
66 self.data.push(v);
67 }
68 pub fn pop(&mut self) -> Option<u8> {
70 self.data.pop()
71 }
72 pub fn clear(&mut self) {
74 self.data.clear();
75 }
76 pub fn split_off(&mut self, at: usize) -> Self {
78 let data = self.data.split_off(at);
79 Self::from_data(&data)
80 }
81 pub fn resize_with<F>(&mut self, new_len: usize, f: F)
83 where
84 F: FnMut() -> u8
85 {
86 self.data.resize_with(new_len, f);
87 }
88 pub fn resize(&mut self, new_len: usize, value: u8) {
90 self.data.resize(new_len, value);
91 }
92 pub fn truncate(&mut self, len: usize) {
94 self.data.truncate(len);
95 }
96 pub fn dedup(&mut self) {
98 self.data.dedup();
99 }
100}
101impl Buffer for VecBuffer {
102 fn len(&self) -> usize {
104 self.data.len()
105 }
106 fn as_ptr(&self) -> *const u8 {
108 self.data.as_ptr()
109 }
110 fn as_mut_ptr(&mut self) -> *mut u8 {
112 self.data.as_mut_ptr()
113 }
114 fn as_slice(&self) -> &[u8] {
116 self.data.as_slice()
117 }
118 fn as_mut_slice(&mut self) -> &mut [u8]
120 {
121 self.data.as_mut_slice()
122 }
123}
124impl PartialEq<[u8]> for VecBuffer {
125 fn eq(&self, other: &[u8]) -> bool {
126 self.as_slice() == other
127 }
128}
129impl<const N: usize> PartialEq<[u8; N]> for VecBuffer {
130 fn eq(&self, other: &[u8; N]) -> bool {
131 self.as_slice() == other
132 }
133}
134impl PartialEq<Vec<u8>> for VecBuffer {
135 fn eq(&self, other: &Vec<u8>) -> bool {
136 self.as_slice() == other.as_slice()
137 }
138}
139impl<T: Buffer> PartialEq<T> for VecBuffer {
140 fn eq(&self, other: &T) -> bool {
141 self.as_slice() == other.as_slice()
142 }
143}
144impl<Idx: std::slice::SliceIndex<[u8]>> std::ops::Index<Idx> for VecBuffer {
145 type Output = Idx::Output;
146
147 fn index(&self, index: Idx) -> &Self::Output {
148 self.data.index(index)
149 }
150}
151impl<Idx: std::slice::SliceIndex<[u8]>> std::ops::IndexMut<Idx> for VecBuffer {
152 fn index_mut(&mut self, index: Idx) -> &mut Self::Output {
153 self.data.index_mut(index)
154 }
155}
156impl std::convert::AsRef<[u8]> for VecBuffer {
157 fn as_ref(&self) -> &[u8] {
158 self.as_slice()
159 }
160}
161impl std::convert::AsMut<[u8]> for VecBuffer {
162 fn as_mut(&mut self) -> &mut [u8] {
163 self.as_mut_slice()
164 }
165}
166impl std::hash::Hash for VecBuffer {
167 fn hash<H>(&self, state: &mut H)
168 where
169 H: std::hash::Hasher
170 {
171 self.data.hash(state);
172 }
173 fn hash_slice<H>(data: &[Self], state: &mut H)
174 where
175 H: std::hash::Hasher
176 {
177 data.iter().for_each(|x| x.hash(state));
178 }
179}
180impl std::iter::IntoIterator for VecBuffer {
181 type Item = u8;
182 type IntoIter = std::vec::IntoIter<Self::Item>;
183
184 fn into_iter(self) -> Self::IntoIter {
185 self.to_vec().into_iter()
186 }
187}