brk_vec/traits/
iterator.rs1use std::{borrow::Cow, iter::Skip};
2
3use brk_core::Printable;
4
5use super::{StoredIndex, StoredType};
6
7pub trait BaseVecIterator: Iterator {
8 fn mut_index(&mut self) -> &mut usize;
9
10 #[inline]
11 fn set_(&mut self, i: usize) {
12 *self.mut_index() = i;
13 }
14
15 #[inline]
16 fn next_at(&mut self, i: usize) -> Option<Self::Item> {
17 self.set_(i);
18 self.next()
19 }
20
21 fn len(&self) -> usize;
22
23 fn name(&self) -> &str;
24
25 fn is_empty(&self) -> bool {
26 self.len() == 0
27 }
28
29 fn skip(self, _: usize) -> Skip<Self>
30 where
31 Self: Sized,
32 {
33 todo!("")
34 }
35}
36
37pub trait VecIterator<'a>: BaseVecIterator<Item = (Self::I, Cow<'a, Self::T>)> {
38 type I: StoredIndex;
39 type T: StoredType + 'a;
40
41 #[inline]
42 fn set(&mut self, i: Self::I) {
43 self.set_(i.unwrap_to_usize())
44 }
45
46 #[inline]
47 fn get_(&mut self, i: usize) -> Option<Cow<'a, Self::T>> {
48 self.next_at(i).map(|(_, v)| v)
49 }
50
51 #[inline]
52 fn get(&mut self, i: Self::I) -> Option<Cow<'a, Self::T>> {
53 self.get_(i.unwrap_to_usize())
54 }
55
56 #[inline]
57 fn unwrap_get_inner(&mut self, i: Self::I) -> Self::T {
58 self.unwrap_get_inner_(i.unwrap_to_usize())
59 }
60
61 #[inline]
62 fn unwrap_get_inner_(&mut self, i: usize) -> Self::T {
63 self.get_(i)
64 .unwrap_or_else(|| {
65 dbg!(self.name(), i, self.len(), Self::I::to_string());
66 panic!("unwrap_get_inner_")
67 })
68 .into_owned()
69 }
70
71 #[inline]
72 fn get_inner(&mut self, i: Self::I) -> Option<Self::T> {
73 self.get_(i.unwrap_to_usize()).map(|v| v.into_owned())
74 }
75
76 fn last(mut self) -> Option<Self::Item>
77 where
78 Self: Sized,
79 {
80 let len = self.len();
81 if len == 0 {
82 return None;
83 }
84 let i = len - 1;
85 self.set_(i);
86 self.next()
87 }
88
89 fn index_type_to_string(&self) -> &'static str {
90 Self::I::to_string()
91 }
92}
93
94impl<'a, I, T, Iter> VecIterator<'a> for Iter
95where
96 Iter: BaseVecIterator<Item = (I, Cow<'a, T>)>,
97 I: StoredIndex,
98 T: StoredType + 'a,
99{
100 type I = I;
101 type T = T;
102}
103
104pub type BoxedVecIterator<'a, I, T> =
105 Box<dyn VecIterator<'a, I = I, T = T, Item = (I, Cow<'a, T>)> + 'a>;