mqtt_tiny/
anyvec.rs

1//! A bridge trait to unify required vector operations over multiple implementations
2
3use crate::error::MemoryError;
4
5/// A bridge trait to unify required vector operations over multiple implementations
6pub trait AnyVec<T>
7where
8    Self: Default + AsRef<[T]> + AsMut<[T]> + IntoIterator<Item = T>,
9{
10    /// Creates a new vector by copying the given elements
11    fn new(elements: &[T]) -> Result<Self, MemoryError>
12    where
13        T: Clone,
14    {
15        // Init self and copy elements
16        let mut this = Self::default();
17        this.extend(elements)?;
18        Ok(this)
19    }
20    /// Extends the vector from the given elements
21    fn extend(&mut self, elements: &[T]) -> Result<(), MemoryError>
22    where
23        T: Clone;
24
25    /// Inserts the given element at the given index
26    fn insert(&mut self, index: usize, element: T) -> Result<(), MemoryError>;
27    /// Pushes an element to the end of the vector
28    fn push(&mut self, element: T) -> Result<(), MemoryError> {
29        self.insert(self.as_ref().len(), element)
30    }
31}
32// Implement `AnyVec` for `Vec<u8>` if `std` is enabled
33#[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        // Limit index and allocate slot
41        let index = cmp::min(index, self.len());
42        self.try_reserve(1).map_err(|_| err!(Memory, "failed to allocate memory"))?;
43
44        // Insert element
45        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        // Allocate capacity and extend vector
57        self.try_reserve(elements.len()).map_err(|_| err!(Memory, "failed to allocate memory"))?;
58        self.extend_from_slice(elements);
59        Ok(())
60    }
61}
62// Implement `AnyVec` for `arrayvec::ArrayVec<T, CAP>` if `arrayvec` is enabled
63#[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        // Limit index and insert element
71        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        // Extend vector
83        for element in elements.iter().cloned() {
84            // Push each element
85            self.try_push(element).map_err(|_| err!(Memory, "not enough memory"))?;
86        }
87        Ok(())
88    }
89}
90// Implement `AnyVec` for `heapless::Vec<T, CAP>` if `heapless` is enabled
91#[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        // Limit index and insert element
99        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        // Extend vector
111        for element in elements.iter().cloned() {
112            // Push each element
113            self.push(element).map_err(|_| err!(Memory, "not enough memory"))?;
114        }
115        Ok(())
116    }
117}