use crate::node::lex_order;
use super::{reconstruct_prefix, TrieView};
pub struct ViewIter<'a, V: TrieView<'a>> {
stack: Vec<IterElem<'a, V>>,
}
enum IterElem<'a, V: TrieView<'a>> {
Node(V),
Item(V::P, V::T),
}
impl<'a, V: TrieView<'a>> ViewIter<'a, V> {
pub(super) fn new(root: V) -> Self {
let mut stack = Vec::new();
expand_node(&mut stack, root);
Self { stack }
}
}
pub struct ViewKeys<'a, V: TrieView<'a>>(ViewIter<'a, V>);
impl<'a, V: TrieView<'a>> ViewKeys<'a, V> {
pub(super) fn new(root: V) -> Self {
Self(ViewIter::new(root))
}
}
impl<'a, V: TrieView<'a>> Iterator for ViewKeys<'a, V> {
type Item = V::P;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|(prefix, _)| prefix)
}
}
pub struct ViewValues<'a, V: TrieView<'a>>(ViewIter<'a, V>);
impl<'a, V: TrieView<'a>> ViewValues<'a, V> {
pub(super) fn new(root: V) -> Self {
Self(ViewIter::new(root))
}
}
impl<'a, V: TrieView<'a>> Iterator for ViewValues<'a, V> {
type Item = V::T;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|(_, value)| value)
}
}
fn expand_node<'a, V: TrieView<'a>>(stack: &mut Vec<IterElem<'a, V>>, mut view: V) {
for elem in lex_order().rev() {
match elem {
Ok(data_bit) => {
if (view.data_bitmap() >> data_bit) & 1 == 0 {
continue;
}
let prefix = reconstruct_prefix::<V::P>(view.depth(), view.key(), data_bit);
let value = unsafe { view.get_data(data_bit) };
stack.push(IterElem::Item(prefix, value));
}
Err(child_bit) => {
if (view.child_bitmap() >> child_bit) & 1 == 0 {
continue;
}
stack.push(IterElem::Node(unsafe { view.get_child(child_bit) }));
}
}
}
}
impl<'a, V: TrieView<'a>> Iterator for ViewIter<'a, V> {
type Item = (V::P, V::T);
fn next(&mut self) -> Option<Self::Item> {
loop {
match self.stack.pop()? {
IterElem::Item(prefix, value) => return Some((prefix, value)),
IterElem::Node(view) => expand_node(&mut self.stack, view),
}
}
}
}