1#![no_std]
4
5use core::borrow::{Borrow, BorrowMut};
6use core::ops::{Deref, DerefMut};
7use core::mem::{swap, replace};
8use core::cmp;
9
10#[derive(Debug)]
24pub struct SliceVec<'a, T: 'a> {
25 storage: &'a mut [T],
26 len: usize,
27}
28
29impl<'a, T> SliceVec<'a, T> {
30 pub fn new(storage: &'a mut [T]) -> Self {
35 SliceVec {
36 storage: storage,
37 len: 0,
38 }
39 }
40
41 pub fn capacity(&self) -> usize {
44 self.storage.len()
45 }
46
47 pub fn len(&self) -> usize {
49 self.len
50 }
51
52 pub fn is_empty(&self) -> bool {
54 self.len == 0
55 }
56
57 pub fn is_full(&self) -> bool {
62 self.len == self.storage.len()
63 }
64
65 pub fn push(&mut self, elem: T) -> Result<(), T> {
69 if self.len < self.capacity() {
70 self.storage[self.len] = elem;
71 self.len += 1;
72 Ok(())
73 } else {
74 Err(elem)
75 }
76 }
77
78 pub fn pop_and_replace(&mut self, elem: T) -> Option<T> {
82 if self.len > 0 {
84 self.len -= 1;
85 let elem = replace(&mut self.storage[self.len], elem);
86 Some(elem)
87 } else {
88 None
89 }
90 }
91
92 pub fn truncate(&mut self, len: usize) {
96 self.len = cmp::min(self.len, len);
97 }
98
99 pub fn clear(&mut self) {
103 self.truncate(0);
104 }
105
106 pub fn as_slice(&self) -> &[T] {
111 &self.storage[..self.len]
112 }
113
114 pub fn as_mut_slice(&mut self) -> &mut [T] {
119 &mut self.storage[..self.len]
120 }
121}
122
123impl<'a, T: 'a + Default> SliceVec<'a, T> {
124 pub fn pop(&mut self) -> Option<T> {
131 if self.len > 0 {
132 self.len -= 1;
133 let elem = replace(&mut self.storage[self.len], T::default());
134 Some(elem)
135 } else {
136 None
137 }
138 }
139
140 pub fn swap_remove(&mut self, index: usize) -> T {
146 let len = self.len();
147 self.as_mut_slice().swap(index, len - 1);
148 self.pop().expect("swap_remove failed pop")
150 }
151
152 pub fn remove(&mut self, index: usize) -> T {
157 assert!(index < self.len);
159
160 let mut replacement = T::default();
162 for i in (index..self.len).rev() {
163 swap(&mut self.storage[i], &mut replacement);
164 }
165 self.len -= 1;
166
167 replacement
168 }
169}
170
171impl<'a, T> Deref for SliceVec<'a, T> {
172 type Target = [T];
173
174 fn deref(&self) -> &[T] {
175 self.as_slice()
176 }
177}
178
179impl<'a, T> DerefMut for SliceVec<'a, T> {
180 fn deref_mut(&mut self) -> &mut [T] {
181 self.as_mut_slice()
182 }
183}
184
185impl<'a, T> AsRef<[T]> for SliceVec<'a, T> {
189 fn as_ref(&self) -> &[T] {
190 self.as_slice()
191 }
192}
193
194impl<'a, T> AsMut<[T]> for SliceVec<'a, T> {
195 fn as_mut(&mut self) -> &mut [T] {
196 self.as_mut_slice()
197 }
198}
199
200impl<'a, T> Borrow<[T]> for SliceVec<'a, T> {
201 fn borrow(&self) -> &[T] {
202 self.as_slice()
203 }
204}
205
206impl<'a, T> BorrowMut<[T]> for SliceVec<'a, T> {
207 fn borrow_mut(&mut self) -> &mut [T] {
208 self.as_mut_slice()
209 }
210}
211
212#[cfg(test)]
213mod tests {
214 use super::*;
215
216 #[test]
217 fn basic() {
218 const CAP: usize = 1;
219 let mut storage = [0; CAP];
220
221 {
222 let mut s = SliceVec::new(&mut storage);
223 assert!(s.is_empty());
224 assert_eq!(s.len(), 0);
225 assert_eq!(s.capacity(), CAP);
226
227 assert_eq!(s.push(123), Ok(()));
228 assert_eq!(s.len(), 1);
229 assert!(!s.is_empty());
230 assert_eq!(s.as_slice(), &[123]);
231 assert_eq!(s.push(42), Err(42));
232 assert!(!s.is_empty());
233 assert_eq!(s.as_slice(), &[123]);
234 assert_eq!(s.pop(), Some(123));
235 assert_eq!(s.len(), 0);
236 assert!(s.is_empty());
237 assert_eq!(s.as_slice(), &[]);
238 assert_eq!(&*s, &[]);
239 }
240 }
241
242 #[test]
243 fn swap_remove() {
244 let mut storage = [0; 5];
245 let mut v = SliceVec::new(&mut storage);
246 v.push(0).unwrap();
247 v.push(1).unwrap();
248 v.push(2).unwrap();
249 v.push(3).unwrap();
250 assert_eq!(v.as_slice(), &[0, 1, 2, 3]);
251 assert_eq!(v.swap_remove(0), 0);
252 assert_eq!(v.as_slice(), &[3, 1, 2]);
253 assert_eq!(v.swap_remove(2), 2);
254 assert_eq!(v.as_slice(), &[3, 1]);
255 v.push(100).unwrap();
256 v.push(101).unwrap();
257 assert_eq!(v.as_slice(), &[3, 1, 100, 101]);
258 assert_eq!(v.swap_remove(2), 100);
259 assert_eq!(v.as_slice(), &[3, 1, 101]);
260 v.push(102).unwrap();
261 assert_eq!(v.as_slice(), &[3, 1, 101, 102]);
262 assert_eq!(v.swap_remove(1), 1);
263 assert_eq!(v.as_slice(), &[3, 102, 101]);
264 }
265
266 #[test]
267 #[should_panic]
268 fn swap_remove_empty() {
269 let mut storage = [0; 5];
270 let mut v = SliceVec::new(&mut storage);
271 v.push(7).unwrap();
272 v.clear();
273 assert_eq!(v.as_slice(), &[]);
274 assert!(v.is_empty());
275
276 v.swap_remove(0);
277 }
278
279 #[test]
280 #[should_panic]
281 fn swap_remove_out_of_bounds() {
282 let mut storage = [0; 5];
283 let mut v = SliceVec::new(&mut storage);
284 v.push(0).unwrap();
285 v.push(1).unwrap();
286 v.push(2).unwrap();
287 v.push(3).unwrap();
288 assert_eq!(v.as_slice(), &[0, 1, 2, 3]);
289
290 v.swap_remove(4);
291 }
292
293 #[test]
294 fn remove() {
295 let mut storage = [0; 5];
296 let mut v = SliceVec::new(&mut storage);
297 v.push(0).unwrap();
298 v.push(1).unwrap();
299 v.push(2).unwrap();
300 v.push(3).unwrap();
301 assert_eq!(v.remove(0), 0);
302 assert_eq!(v.as_slice(), &[1, 2, 3]);
303 assert_eq!(v.remove(2), 3);
304 assert_eq!(v.as_slice(), &[1, 2]);
305 v.push(3).unwrap();
306 v.push(4).unwrap();
307 v.push(5).unwrap();
308 assert_eq!(v.as_slice(), &[1, 2, 3, 4, 5]);
309 assert_eq!(v.remove(1), 2);
310 assert_eq!(v.as_slice(), &[1, 3, 4, 5]);
311 }
312
313 #[test]
314 #[should_panic]
315 fn remove_empty() {
316 let mut storage = [0; 5];
317 let mut v = SliceVec::new(&mut storage);
318 v.push(7).unwrap();
319 v.clear();
320 assert_eq!(v.as_slice(), &[]);
321 assert!(v.is_empty());
322
323 v.remove(0);
324 }
325
326 #[test]
327 #[should_panic]
328 fn remove_out_of_bounds() {
329 let mut storage = [0; 5];
330 let mut v = SliceVec::new(&mut storage);
331 v.push(0).unwrap();
332 v.push(1).unwrap();
333 v.push(2).unwrap();
334 v.push(3).unwrap();
335 assert_eq!(v.as_slice(), &[0, 1, 2, 3]);
336
337 v.remove(4);
338 }
339
340 #[test]
341 fn is_full() {
342 let mut storage = [0; 3];
343 let mut v = SliceVec::new(&mut storage);
344 assert!(!v.is_full());
345 v.push(0).unwrap();
346 assert!(!v.is_full());
347 v.push(1).unwrap();
348 assert!(!v.is_full());
349 v.push(2).unwrap();
350 assert!(v.is_full());
351 v.push(3).unwrap_err();
352 }
353}