1use core::ops::{Deref, DerefMut, RangeBounds};
2
3pub trait VectorFactory {
4 type Vector<T>: Vector<T>;
5
6 fn create_vector<T>(capacity: Option<usize>) -> Self::Vector<T>;
7 fn clone_vector<T: Clone>(vector: &[T]) -> Self::Vector<T>;
8}
9
10pub trait Vector<T>: Deref<Target = [T]> + DerefMut<Target = [T]> {
11 fn push(&mut self, item: T);
12 fn pop(&mut self) -> Option<T>;
13 fn truncate(&mut self, len: usize);
14 fn remove_range<R: RangeBounds<usize>>(&mut self, range: R);
15}
16
17#[cfg(feature = "std")]
18#[derive(Debug, Clone, Copy)]
19pub struct StdVectorFactory;
20
21#[cfg(feature = "std")]
22impl VectorFactory for StdVectorFactory {
23 type Vector<T> = StdVector<T>;
24
25 fn create_vector<T>(capacity: Option<usize>) -> Self::Vector<T> {
26 if let Some(capacity) = capacity {
27 StdVector(Vec::with_capacity(capacity))
28 } else {
29 StdVector(Vec::new())
30 }
31 }
32
33 fn clone_vector<T: Clone>(vector: &[T]) -> Self::Vector<T> {
34 StdVector(vector.to_owned())
35 }
36}
37
38#[cfg(feature = "std")]
39#[derive(Debug, Default, Clone)]
40pub struct StdVector<T>(Vec<T>);
41
42#[cfg(feature = "std")]
43impl<T> StdVector<T> {
44 pub const fn new(v: Vec<T>) -> Self {
45 Self(v)
46 }
47
48 pub fn into_vec(self) -> Vec<T> {
49 self.0
50 }
51}
52
53#[cfg(feature = "std")]
54impl<T> Vector<T> for StdVector<T> {
55 fn push(&mut self, item: T) {
56 self.0.push(item);
57 }
58
59 fn pop(&mut self) -> Option<T> {
60 self.0.pop()
61 }
62
63 fn truncate(&mut self, len: usize) {
64 self.0.truncate(len);
65 }
66
67 fn remove_range<R: RangeBounds<usize>>(&mut self, range: R) {
68 self.0.drain(range);
69 }
70}
71
72#[cfg(feature = "std")]
73impl<T> Deref for StdVector<T> {
74 type Target = [T];
75
76 fn deref(&self) -> &Self::Target {
77 self.0.deref()
78 }
79}
80
81#[cfg(feature = "std")]
82impl<T> DerefMut for StdVector<T> {
83 fn deref_mut(&mut self) -> &mut Self::Target {
84 self.0.deref_mut()
85 }
86}