orx_tree/traversal/breadth_first/
iter_ref.rs

1use super::bfs_enumeration::BreadthFirstEnumeration;
2use super::iter_ptr::BfsIterPtr;
3use super::queue::Item;
4use crate::TreeVariant;
5use crate::aliases::Col;
6use crate::memory::MemoryPolicy;
7use crate::pinned_storage::PinnedStorage;
8use crate::traversal::node_item::NodeItem;
9use alloc::collections::VecDeque;
10use core::marker::PhantomData;
11use orx_self_or::SoM;
12
13pub struct BfsIterRef<'a, V, M, P, E, S, D>
14where
15    V: TreeVariant,
16    M: MemoryPolicy,
17    P: PinnedStorage,
18    E: BreadthFirstEnumeration,
19    S: SoM<VecDeque<Item<V, E>>>,
20    D: NodeItem<'a, V, M, P>,
21{
22    col: &'a Col<V, M, P>,
23    iter: BfsIterPtr<V, E, S>,
24    phantom: PhantomData<D>,
25}
26
27impl<'a, V, M, P, E, S, D> From<(&'a Col<V, M, P>, BfsIterPtr<V, E, S>)>
28    for BfsIterRef<'a, V, M, P, E, S, D>
29where
30    V: TreeVariant,
31    M: MemoryPolicy,
32    P: PinnedStorage,
33    E: BreadthFirstEnumeration,
34    S: SoM<VecDeque<Item<V, E>>>,
35    D: NodeItem<'a, V, M, P>,
36{
37    fn from((col, iter): (&'a Col<V, M, P>, BfsIterPtr<V, E, S>)) -> Self {
38        Self {
39            col,
40            iter,
41            phantom: PhantomData,
42        }
43    }
44}
45
46impl<'a, V, M, P, E, D> Clone for BfsIterRef<'a, V, M, P, E, VecDeque<Item<V, E>>, D>
47where
48    V: TreeVariant,
49    M: MemoryPolicy,
50    P: PinnedStorage,
51    E: BreadthFirstEnumeration,
52    D: NodeItem<'a, V, M, P>,
53    Item<V, E>: Clone,
54{
55    fn clone(&self) -> Self {
56        Self {
57            col: self.col,
58            iter: self.iter.clone(),
59            phantom: self.phantom,
60        }
61    }
62}
63
64impl<'a, V, M, P, E, S, D> Iterator for BfsIterRef<'a, V, M, P, E, S, D>
65where
66    V: TreeVariant,
67    M: MemoryPolicy,
68    P: PinnedStorage,
69    E: BreadthFirstEnumeration,
70    S: SoM<VecDeque<Item<V, E>>>,
71    D: NodeItem<'a, V, M, P>,
72{
73    type Item = E::Item<D>;
74
75    fn next(&mut self) -> Option<Self::Item> {
76        self.iter
77            .next()
78            .map(|element: Item<V, E>| E::from_element_ptr(self.col, element))
79    }
80}