ranges_ext/
heapless_ops.rs

1use core::ops::Range;
2
3use tinyvec::SliceVec;
4
5use crate::{
6    RangeError, RangeExtBaseOps, RangeInfo, RangeVecOps, VecOps, core_ops,
7    helpers::bytes_to_slice_mut,
8};
9
10impl<T: RangeInfo, const N: usize> RangeVecOps<T> for heapless::Vec<T, N> {
11    fn merge_add(&mut self, new_info: T, temp: &mut [u8]) -> Result<(), RangeError<T>> {
12        let temp_buff = bytes_to_slice_mut::<T>(temp);
13        let mut temp = SliceVec::from_slice_len(temp_buff, 0);
14        self.merge_add_with_temp(new_info, &mut temp)?;
15        Ok(())
16    }
17
18    fn merge_remove(
19        &mut self,
20        range: Range<T::Type>,
21        temp: &mut [u8],
22    ) -> Result<(), RangeError<T>> {
23        let temp_buff = bytes_to_slice_mut::<T>(temp);
24        let mut temp = SliceVec::from_slice_len(temp_buff, 0);
25        self.merge_remove_with_temp(range, &mut temp)?;
26        Ok(())
27    }
28
29    fn merge_extend<I>(&mut self, ranges: I, temp: &mut [u8]) -> Result<(), RangeError<T>>
30    where
31        I: IntoIterator<Item = T>,
32    {
33        for info in ranges {
34            self.merge_add(info, temp)?;
35        }
36
37        Ok(())
38    }
39
40    fn contains_point(&self, value: T::Type) -> bool {
41        core_ops::contains_point(self.as_slice(), value)
42    }
43}
44
45impl<T: RangeInfo, const N: usize> VecOps<T> for heapless::Vec<T, N> {
46    fn push(&mut self, item: T) -> Result<(), RangeError<T>> {
47        self.push(item).map_err(|_| RangeError::Capacity)
48    }
49
50    fn as_slice(&self) -> &[T] {
51        self.as_slice()
52    }
53
54    fn drain<R>(&mut self, range: R) -> impl Iterator<Item = T>
55    where
56        R: core::ops::RangeBounds<usize>,
57    {
58        self.drain(range)
59    }
60
61    fn len(&self) -> usize {
62        self.as_slice().len()
63    }
64
65    fn remove(&mut self, index: usize) -> T {
66        self.remove(index)
67    }
68
69    fn insert(&mut self, index: usize, item: T) -> Result<(), RangeError<T>> {
70        self.insert(index, item).map_err(|_| RangeError::Capacity)
71    }
72
73    fn clear(&mut self) {
74        self.clear();
75    }
76}
77
78impl<T: RangeInfo, const N: usize> RangeExtBaseOps<T> for heapless::Vec<T, N> {}
79
80impl<T: RangeInfo> VecOps<T> for SliceVec<'_, T> {
81    fn push(&mut self, item: T) -> Result<(), RangeError<T>> {
82        if self.len() >= self.capacity() {
83            return Err(RangeError::Capacity);
84        }
85        self.push(item);
86        Ok(())
87    }
88
89    fn as_slice(&self) -> &[T] {
90        self.as_slice()
91    }
92
93    fn drain<R>(&mut self, range: R) -> impl Iterator<Item = T>
94    where
95        R: core::ops::RangeBounds<usize>,
96    {
97        self.drain(range)
98    }
99
100    fn len(&self) -> usize {
101        self.as_slice().len()
102    }
103
104    fn remove(&mut self, index: usize) -> T {
105        self.remove(index)
106    }
107
108    fn insert(&mut self, index: usize, item: T) -> Result<(), RangeError<T>> {
109        if index > self.len() || self.len() >= self.capacity() {
110            return Err(RangeError::Capacity);
111        }
112
113        self.insert(index, item);
114        Ok(())
115    }
116
117    fn clear(&mut self) {
118        self.clear();
119    }
120}