nowasm/
vector.rs

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}