brk_vec/traits/
iterator.rs

1use 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>;