ranges_ext/
heapless_ops.rs1use 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}