use buf_trait::Buf;
use crate::raw::nodes;
use crate::raw::nodes::Index;
use crate::raw::Prefix;
use crate::raw::RawTrie;
use super::entries::Entries;
pub struct Prefixes<'a, 'key, K: Buf + ?Sized, V, I: Index> {
prefix: Prefix<'a>,
suffix: &'key [u8],
data: &'a Entries<K, V, I>,
prefixes: nodes::Prefixes<'a, 'key, I>,
}
impl<'a, 'key, K: Buf + ?Sized, V, I: Index> Prefixes<'a, 'key, K, V, I> {
pub(crate) fn new(
trie: &'a RawTrie<K, V, I>,
prefix: Prefix<'a>,
suffix: &'key K,
) -> Self {
Self {
prefix,
suffix: suffix.as_bytes(),
prefixes: trie.nodes.prefixes(prefix.node(), suffix.as_bytes()),
data: &trie.data,
}
}
}
impl<'a, K: Buf + ?Sized, V, I: Index> Iterator for Prefixes<'a, '_, K, V, I> {
type Item = (&'a K, &'a V);
fn next(&mut self) -> Option<Self::Item> {
loop {
let (_, Some(next), last) = self.prefixes.next()? else { continue };
let Some((key, value)) = self.data.get(next) else { continue };
let key_rest = &key.as_bytes()[self.prefix.len()..];
if last && !self.suffix.starts_with(key_rest) {
return None;
}
return Some((key, value));
}
}
}
pub struct PrefixesMut<'a, 'key, K: Buf + ?Sized, V, I: Index> {
prefix: Prefix<'a>,
suffix: &'key [u8],
data: &'a Entries<K, V, I>,
prefixes: nodes::Prefixes<'a, 'key, I>,
}
impl<'a, 'key, K: Buf + ?Sized, V, I: Index> PrefixesMut<'a, 'key, K, V, I> {
pub(crate) fn new(
trie: &'a mut RawTrie<K, V, I>,
prefix: Prefix<'a>,
suffix: &'key K,
) -> Self {
Self {
prefix,
suffix: suffix.as_bytes(),
prefixes: trie.nodes.prefixes(prefix.node(), suffix.as_bytes()),
data: &mut trie.data,
}
}
}
impl<'a, K: Buf + ?Sized, V, I: Index> Iterator
for PrefixesMut<'a, '_, K, V, I>
{
type Item = (&'a K, &'a mut V);
fn next(&mut self) -> Option<Self::Item> {
loop {
let (_, Some(next), last) = self.prefixes.next()? else { continue };
let entry = unsafe {
self.data.get_mut_may_alias(next)
};
let Some((key, value)) = entry else { continue };
let key_rest = &key.as_bytes()[self.prefix.len()..];
if last && !self.suffix.starts_with(key_rest) {
return None;
}
return Some((key, value));
}
}
}
pub struct Iter<'a, K: Buf + ?Sized, V, I: Index> {
data: &'a Entries<K, V, I>,
dfs: nodes::Dfs<'a, I>,
}
impl<'a, K: Buf + ?Sized, V, I: Index> Iter<'a, K, V, I> {
pub(crate) fn new(trie: &'a RawTrie<K, V, I>, prefix: Prefix<'a>) -> Self {
Self {
dfs: trie.nodes.dfs(prefix.node()),
data: &trie.data,
}
}
}
impl<'a, K: Buf + ?Sized, V, I: Index> Iterator for Iter<'a, K, V, I> {
type Item = (&'a K, &'a V);
fn next(&mut self) -> Option<Self::Item> {
loop {
let Some(next) = self.dfs.next()? else { continue };
let entry = self.data.get(next);
if entry.is_some() {
return entry;
}
}
}
}
pub struct IterMut<'a, K: Buf + ?Sized, V, I: Index> {
data: &'a Entries<K, V, I>,
dfs: nodes::Dfs<'a, I>,
}
impl<'a, K: Buf + ?Sized, V, I: Index> IterMut<'a, K, V, I> {
pub(crate) fn new(
trie: &'a mut RawTrie<K, V, I>,
prefix: Prefix<'a>,
) -> Self {
Self {
dfs: trie.nodes.dfs(prefix.node()),
data: &mut trie.data,
}
}
}
impl<'a, K: Buf + ?Sized, V, I: Index> Iterator for IterMut<'a, K, V, I> {
type Item = (&'a K, &'a mut V);
fn next(&mut self) -> Option<Self::Item> {
loop {
let Some(next) = self.dfs.next()? else { continue };
let entry = unsafe {
self.data.get_mut_may_alias(next)
};
if entry.is_some() {
return entry;
}
}
}
}