use std::fmt::{Debug, Formatter, Result as FmtResult};
use crate::Prefix;
use super::{
map::{CoverKeys, PrefixMap},
trieview::{AsView, TrieRef, TrieRefMut},
};
#[derive(Clone)]
pub struct PrefixSet<P>(pub(crate) PrefixMap<P, ()>);
impl<P: Prefix> PrefixSet<P> {
pub fn new() -> Self {
Self(Default::default())
}
#[inline(always)]
pub fn len(&self) -> usize {
self.0.len()
}
#[inline(always)]
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn mem_size(&self) -> usize {
self.0.mem_size()
}
pub fn contains(&self, prefix: &P) -> bool {
self.0.contains_key(prefix)
}
pub fn get(&self, prefix: &P) -> Option<P> {
self.0.get_key_value(prefix).map(|(p, _)| p)
}
pub fn get_lpm(&self, prefix: &P) -> Option<P> {
self.0.get_lpm_prefix(prefix)
}
pub fn get_spm(&self, prefix: &P) -> Option<P> {
self.0.get_spm_prefix(prefix)
}
pub fn insert(&mut self, prefix: P) -> bool {
self.0.insert(prefix, ()).is_none()
}
pub fn remove(&mut self, prefix: &P) -> bool {
self.0.remove(prefix).is_some()
}
pub fn remove_keep_tree(&mut self, prefix: &P) -> bool {
self.0.remove_keep_tree(prefix).is_some()
}
pub fn remove_children(&mut self, prefix: &P) {
self.0.remove_children(prefix)
}
pub fn clear(&mut self) {
self.0.clear()
}
pub fn iter(&self) -> Iter<'_, P> {
self.into_iter()
}
pub fn retain<F>(&mut self, mut f: F)
where
F: FnMut(&P) -> bool,
{
self.0.retain(|p, _| f(p));
}
pub fn children<'a>(&'a self, prefix: &P) -> Iter<'a, P> {
Iter(self.0.children(prefix))
}
pub fn cover<'a>(&'a self, prefix: &P) -> CoverKeys<'a, P, ()> {
self.0.cover_keys(prefix)
}
}
impl<P: Prefix> Default for PrefixSet<P> {
fn default() -> Self {
Self::new()
}
}
impl<P> PartialEq for PrefixSet<P>
where
P: Prefix + PartialEq,
{
fn eq(&self, other: &Self) -> bool {
self.0 == other.0
}
}
impl<P> Eq for PrefixSet<P> where P: Prefix + Eq {}
impl<P> Debug for PrefixSet<P>
where
P: Prefix + Debug,
{
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
f.debug_set().entries(self.iter()).finish()
}
}
#[derive(Clone, Default)]
pub struct Iter<'a, P: Prefix>(crate::map::Iter<'a, P, ()>);
impl<P: Prefix> Iterator for Iter<'_, P> {
type Item = P;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|(p, _)| p)
}
}
#[derive(Clone)]
pub struct IntoIter<P: Prefix>(crate::map::IntoIter<P, ()>);
impl<P: Prefix> Iterator for IntoIter<P> {
type Item = P;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|(p, _)| p)
}
}
impl<P: Prefix> IntoIterator for PrefixSet<P> {
type Item = P;
type IntoIter = IntoIter<P>;
fn into_iter(self) -> Self::IntoIter {
IntoIter(self.0.into_iter())
}
}
impl<'a, P: Prefix> IntoIterator for &'a PrefixSet<P> {
type Item = P;
type IntoIter = Iter<'a, P>;
fn into_iter(self) -> Self::IntoIter {
Iter(self.0.iter())
}
}
impl<P: Prefix> FromIterator<P> for PrefixSet<P> {
fn from_iter<I: IntoIterator<Item = P>>(iter: I) -> Self {
let mut set = Self::new();
for p in iter {
set.insert(p);
}
set
}
}
impl<'a, P: Prefix> AsView<'a> for &'a PrefixSet<P> {
type P = P;
type View = TrieRef<'a, P, ()>;
fn view(self) -> Self::View {
TrieRef::new_root(self.0.table())
}
}
impl<'a, P: Prefix> AsView<'a> for &'a mut PrefixSet<P> {
type P = P;
type View = TrieRefMut<'a, P, ()>;
fn view(self) -> Self::View {
let raw = self.0.table_mut().raw_cells();
TrieRefMut::new_root(self.0.table(), raw)
}
}