use num_traits::Zero;
use crate::{
Prefix,
{
allocator::{Loc, RawPtr},
node::{child_bit, LexIterElem, MaskedLexIter},
table::{DataIdx, Table, K},
PrefixMap,
},
};
pub struct Iter<'a, P: Prefix, T> {
table: Option<&'a Table<T>>,
stack: Vec<MaskedLexIter<P::R>>,
}
impl<P: Prefix, T> Clone for Iter<'_, P, T> {
fn clone(&self) -> Self {
Self {
table: self.table,
stack: self.stack.clone(),
}
}
}
impl<P: Prefix, T> Default for Iter<'_, P, T> {
fn default() -> Self {
Self {
table: None,
stack: Vec::new(),
}
}
}
impl<'a, P: Prefix, T> Iter<'a, P, T> {
pub(crate) fn new(table: &'a Table<T>) -> Self {
let lex = unsafe { table.lex_iter(Loc::root(), 0, <P::R as Zero>::zero()) };
Self::at_node(table, lex)
}
pub(crate) fn at_node(table: &'a Table<T>, lex: MaskedLexIter<P::R>) -> Self {
let stack = vec![lex];
Self {
table: Some(table),
stack,
}
}
}
impl<'a, P: Prefix, T> Iterator for Iter<'a, P, T> {
type Item = (P, &'a T);
fn next(&mut self) -> Option<(P, &'a T)> {
let table = self.table?;
while let Some(lex_iter) = self.stack.last_mut() {
let key = *lex_iter.key();
let Some(next) = lex_iter.next() else {
self.stack.pop();
continue;
};
match next {
LexIterElem::Data(idx) => {
let Some(r) = (unsafe { idx.resolve(table) }) else {
continue;
};
let p = r.prefix(key);
return Some((p, r.get()));
}
LexIterElem::Child(next_loc, depth, next_key) => {
self.stack
.push(unsafe { table.lex_iter(next_loc, depth, next_key) })
}
}
}
None
}
}
#[derive(Clone, Default)]
pub struct Keys<'a, P: Prefix, T>(pub(crate) Iter<'a, P, T>);
impl<'a, P: Prefix, T> Iterator for Keys<'a, P, T> {
type Item = P;
fn next(&mut self) -> Option<P> {
self.0.next().map(|(k, _)| k)
}
}
#[derive(Clone, Default)]
pub struct Values<'a, P: Prefix, T>(pub(crate) Iter<'a, P, T>);
impl<'a, P: Prefix, T> Iterator for Values<'a, P, T> {
type Item = &'a T;
fn next(&mut self) -> Option<&'a T> {
self.0.next().map(|(_, v)| v)
}
}
pub struct IterMut<'a, P: Prefix, T> {
table: Option<(&'a Table<T>, RawPtr<T>)>,
stack: Vec<MaskedLexIter<P::R>>,
}
impl<P: Prefix, T> Default for IterMut<'_, P, T> {
fn default() -> Self {
Self {
table: None,
stack: Vec::new(),
}
}
}
impl<'a, P: Prefix, T> IterMut<'a, P, T> {
pub(crate) fn new(table: &'a mut Table<T>) -> Self {
let lex = unsafe { table.lex_iter(Loc::root(), 0, <P::R as Zero>::zero()) };
Self::at_node(table, lex)
}
pub(crate) fn at_node(table: &'a mut Table<T>, lex: MaskedLexIter<P::R>) -> Self {
let ptr = table.raw_cells();
Self {
table: Some((table, ptr)),
stack: vec![lex],
}
}
}
impl<'a, P: Prefix, T> Iterator for IterMut<'a, P, T> {
type Item = (P, &'a mut T);
fn next(&mut self) -> Option<Self::Item> {
let (table, mut ptr) = self.table?;
while let Some(lex_iter) = self.stack.last_mut() {
let key = *lex_iter.key();
let Some(next) = lex_iter.next() else {
self.stack.pop();
continue;
};
match next {
LexIterElem::Data(idx) => {
let Some(r) = (unsafe { idx.resolve(table) }) else {
continue;
};
let p = r.prefix(key);
return Some((p, unsafe { r.unsafe_get_mut(&mut ptr) }));
}
LexIterElem::Child(next_idx, depth, next_key) => {
self.stack
.push(unsafe { table.lex_iter(next_idx, depth, next_key) })
}
}
}
None
}
}
#[derive(Default)]
pub struct ValuesMut<'a, P: Prefix, T>(pub(crate) IterMut<'a, P, T>);
impl<'a, P: Prefix, T> Iterator for ValuesMut<'a, P, T> {
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|(_, v)| v)
}
}
#[derive(Clone)]
pub struct IntoIter<P: Prefix, T> {
table: Table<T>,
stack: Vec<MaskedLexIter<P::R>>,
}
impl<P: Prefix, T> IntoIter<P, T> {
pub(crate) fn new(table: Table<T>) -> Self {
let lex = unsafe { table.lex_iter(Loc::root(), 0, <P::R as Zero>::zero()) };
Self::at_node(table, lex)
}
pub(crate) fn at_node(table: Table<T>, lex: MaskedLexIter<P::R>) -> Self {
let stack = vec![lex];
Self { table, stack }
}
}
impl<P: Prefix, T> Iterator for IntoIter<P, T> {
type Item = (P, T);
fn next(&mut self) -> Option<(P, T)> {
while let Some(lex_iter) = self.stack.last_mut() {
let key = *lex_iter.key();
let Some(next) = lex_iter.next() else {
self.stack.pop();
continue;
};
match next {
LexIterElem::Data(idx) => {
let Some(r) = (unsafe { idx.resolve_mut(&mut self.table) }) else {
continue;
};
let p = r.prefix(key);
return Some((p, r.take()));
}
LexIterElem::Child(next_loc, depth, next_key) => {
self.stack
.push(unsafe { self.table.lex_iter(next_loc, depth, next_key) })
}
}
}
None
}
}
#[derive(Clone)]
pub struct IntoKeys<P: Prefix, T>(pub(super) IntoIter<P, T>);
impl<P: Prefix, T> Iterator for IntoKeys<P, T> {
type Item = P;
fn next(&mut self) -> Option<P> {
self.0.next().map(|(k, _)| k)
}
}
#[derive(Clone)]
pub struct IntoValues<P: Prefix, T>(pub(super) IntoIter<P, T>);
impl<P: Prefix, T> Iterator for IntoValues<P, T> {
type Item = T;
fn next(&mut self) -> Option<T> {
self.0.next().map(|(_, v)| v)
}
}
impl<P: Prefix, T> IntoIterator for PrefixMap<P, T> {
type Item = (P, T);
type IntoIter = IntoIter<P, T>;
fn into_iter(self) -> Self::IntoIter {
IntoIter::new(self.table)
}
}
impl<'a, P: Prefix, T> IntoIterator for &'a PrefixMap<P, T> {
type Item = (P, &'a T);
type IntoIter = Iter<'a, P, T>;
fn into_iter(self) -> Self::IntoIter {
Iter::new(&self.table)
}
}
impl<P, T> FromIterator<(P, T)> for PrefixMap<P, T>
where
P: Prefix,
{
fn from_iter<I: IntoIterator<Item = (P, T)>>(iter: I) -> Self {
let mut map = Self::new();
iter.into_iter().for_each(|(p, v)| {
map.insert(p, v);
});
map
}
}
pub struct Cover<'a, P: Prefix, T> {
table: &'a Table<T>,
next_loc: Option<Loc>,
lpm_elements: Vec<DataIdx>,
key: P::R,
prefix_len: u32,
depth: u32,
}
impl<'a, P: Prefix, T> Cover<'a, P, T> {
pub(crate) fn new(table: &'a PrefixMap<P, T>, prefix: &P) -> Self {
let key = prefix.repr();
let prefix_len = prefix.prefix_len() as u32;
let lpm_elements = Vec::new();
let next_loc = Some(Loc::root());
Self {
table: &table.table,
next_loc,
lpm_elements,
key,
prefix_len,
depth: 0,
}
}
}
impl<'a, P: Prefix, T> Iterator for Cover<'a, P, T>
where
P: Prefix,
{
type Item = (P, &'a T);
fn next(&mut self) -> Option<Self::Item> {
loop {
let Some(loc) = self.lpm_elements.pop() else {
let loc = self.next_loc?; self.lpm_elements = unsafe {
self.table
.data_ancestors(loc, self.depth, self.key, self.prefix_len)
}
.collect();
self.lpm_elements.reverse();
let prefix_in_this_node = self.prefix_len < self.depth + K;
self.next_loc = if prefix_in_this_node {
None
} else {
let child_bit = child_bit(self.depth, self.key);
unsafe { self.table.child(loc, child_bit) }
};
self.depth += K;
continue;
};
let r = unsafe { loc.resolve(self.table) }
.expect("Cover: data_ancestors yielded stale idx");
return Some((r.prefix(self.key), r.get()));
}
}
}
pub struct CoverKeys<'a, P: Prefix, T>(pub(super) Cover<'a, P, T>);
impl<'a, P: Prefix, T> Iterator for CoverKeys<'a, P, T>
where
P: Prefix,
{
type Item = P;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|(p, _)| p)
}
}
pub struct CoverValues<'a, P: Prefix, T>(pub(super) Cover<'a, P, T>);
impl<'a, P: Prefix, T> Iterator for CoverValues<'a, P, T>
where
P: Prefix,
{
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|(_, t)| t)
}
}
pub(crate) fn lpm_children_iter_start<P: Prefix, T>(
table: &Table<T>,
prefix: &P,
) -> MaskedLexIter<P::R> {
let key = prefix.repr();
let prefix_len = prefix.prefix_len() as u32;
table.lex_iter_at(key, prefix_len)
}