orx_tree/traversal/breadth_first/
iter_ref.rs1use 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}