1use crate::error::MemoryError;
4
5pub trait AnyVec<T>
7where
8 Self: Default + AsRef<[T]> + AsMut<[T]> + IntoIterator<Item = T>,
9{
10 fn new(elements: &[T]) -> Result<Self, MemoryError>
12 where
13 T: Clone,
14 {
15 let mut this = Self::default();
17 this.extend(elements)?;
18 Ok(this)
19 }
20 fn extend(&mut self, elements: &[T]) -> Result<(), MemoryError>
22 where
23 T: Clone;
24
25 fn insert(&mut self, index: usize, element: T) -> Result<(), MemoryError>;
27 fn push(&mut self, element: T) -> Result<(), MemoryError> {
29 self.insert(self.as_ref().len(), element)
30 }
31}
32#[cfg(feature = "std")]
34impl<T> AnyVec<T> for std::vec::Vec<T> {
35 fn insert(&mut self, index: usize, element: T) -> Result<(), MemoryError> {
36 use crate::err;
37 use crate::error::Memory;
38 use core::cmp;
39
40 let index = cmp::min(index, self.len());
42 self.try_reserve(1).map_err(|_| err!(Memory, "failed to allocate memory"))?;
43
44 self.insert(index, element);
46 Ok(())
47 }
48
49 fn extend(&mut self, elements: &[T]) -> Result<(), MemoryError>
50 where
51 T: Clone,
52 {
53 use crate::err;
54 use crate::error::Memory;
55
56 self.try_reserve(elements.len()).map_err(|_| err!(Memory, "failed to allocate memory"))?;
58 self.extend_from_slice(elements);
59 Ok(())
60 }
61}
62#[cfg(feature = "arrayvec")]
64impl<T, const CAP: usize> AnyVec<T> for arrayvec::ArrayVec<T, CAP> {
65 fn insert(&mut self, index: usize, element: T) -> Result<(), MemoryError> {
66 use crate::err;
67 use crate::error::Memory;
68 use core::cmp;
69
70 let index = cmp::min(index, self.len());
72 self.try_insert(index, element).map_err(|_| err!(Memory, "not enough memory"))
73 }
74
75 fn extend(&mut self, elements: &[T]) -> Result<(), MemoryError>
76 where
77 T: Clone,
78 {
79 use crate::err;
80 use crate::error::Memory;
81
82 for element in elements.iter().cloned() {
84 self.try_push(element).map_err(|_| err!(Memory, "not enough memory"))?;
86 }
87 Ok(())
88 }
89}
90#[cfg(feature = "heapless")]
92impl<T, const CAP: usize> AnyVec<T> for heapless::Vec<T, CAP> {
93 fn insert(&mut self, index: usize, element: T) -> Result<(), MemoryError> {
94 use crate::err;
95 use crate::error::Memory;
96 use core::cmp;
97
98 let index = cmp::min(index, self.len());
100 self.insert(index, element).map_err(|_| err!(Memory, "not enough memory"))
101 }
102
103 fn extend(&mut self, elements: &[T]) -> Result<(), MemoryError>
104 where
105 T: Clone,
106 {
107 use crate::err;
108 use crate::error::Memory;
109
110 for element in elements.iter().cloned() {
112 self.push(element).map_err(|_| err!(Memory, "not enough memory"))?;
114 }
115 Ok(())
116 }
117}