pub struct PrefixSet<P>(/* private fields */);
Expand description
Set of prefixes, organized in a tree. This strucutre gives efficient access to the longest prefix in the set that contains another prefix.
You can perform union, intersection, and (covering) difference operations by first creating a
view over the map using crate::AsView
or crate::AsViewMut
.
Implementations§
Source§impl<P: Prefix> PrefixSet<P>
impl<P: Prefix> PrefixSet<P>
Sourcepub fn contains(&self, prefix: &P) -> bool
pub fn contains(&self, prefix: &P) -> bool
Check wether some prefix is present in the set, without using longest prefix match.
let mut set: PrefixSet<ipnet::Ipv4Net> = PrefixSet::new();
set.insert("192.168.1.0/24".parse()?);
assert!(set.contains(&"192.168.1.0/24".parse()?));
assert!(!set.contains(&"192.168.2.0/24".parse()?));
assert!(!set.contains(&"192.168.0.0/23".parse()?));
assert!(!set.contains(&"192.168.1.128/25".parse()?));
Sourcepub fn get<'a>(&'a self, prefix: &P) -> Option<&'a P>
pub fn get<'a>(&'a self, prefix: &P) -> Option<&'a P>
Get a reference to the stored prefix. This function allows you to retrieve the host part of the prefix. The returned prefix will always have the same network address and prefix length.
let mut set: PrefixSet<ipnet::Ipv4Net> = PrefixSet::new();
set.insert("192.168.0.254/24".parse()?);
assert_eq!(set.get(&"192.168.0.0/24".parse()?), Some(&"192.168.0.254/24".parse()?));
Sourcepub fn get_lpm<'a>(&'a self, prefix: &P) -> Option<&'a P>
pub fn get_lpm<'a>(&'a self, prefix: &P) -> Option<&'a P>
Get the longest prefix in the set that contains the given preifx.
let mut set: PrefixSet<ipnet::Ipv4Net> = PrefixSet::new();
set.insert("192.168.1.0/24".parse()?);
set.insert("192.168.0.0/23".parse()?);
assert_eq!(set.get_lpm(&"192.168.1.1/32".parse()?), Some(&"192.168.1.0/24".parse()?));
assert_eq!(set.get_lpm(&"192.168.1.0/24".parse()?), Some(&"192.168.1.0/24".parse()?));
assert_eq!(set.get_lpm(&"192.168.0.0/24".parse()?), Some(&"192.168.0.0/23".parse()?));
assert_eq!(set.get_lpm(&"192.168.2.0/24".parse()?), None);
Sourcepub fn get_spm<'a>(&'a self, prefix: &P) -> Option<&'a P>
pub fn get_spm<'a>(&'a self, prefix: &P) -> Option<&'a P>
Get the shortest prefix in the set that contains the given preifx.
let mut set: PrefixSet<ipnet::Ipv4Net> = PrefixSet::new();
set.insert("192.168.1.0/24".parse()?);
set.insert("192.168.0.0/23".parse()?);
assert_eq!(set.get_spm(&"192.168.1.1/32".parse()?), Some(&"192.168.0.0/23".parse()?));
assert_eq!(set.get_spm(&"192.168.1.0/24".parse()?), Some(&"192.168.0.0/23".parse()?));
assert_eq!(set.get_spm(&"192.168.0.0/23".parse()?), Some(&"192.168.0.0/23".parse()?));
assert_eq!(set.get_spm(&"192.168.2.0/24".parse()?), None);
Sourcepub fn insert(&mut self, prefix: P) -> bool
pub fn insert(&mut self, prefix: P) -> bool
Adds a value to the set.
Returns whether the value was newly inserted. That is:
- If the set did not previously contain this value,
true
is returned. - If the set already contained this value,
false
is returned.
This operation will always replace the currently stored prefix. This allows you to store additional information in the host aprt of the prefix.
let mut set: PrefixSet<ipnet::Ipv4Net> = PrefixSet::new();
assert!(set.insert("192.168.0.0/23".parse()?));
assert!(set.insert("192.168.1.0/24".parse()?));
assert!(!set.insert("192.168.1.0/24".parse()?));
Sourcepub fn remove(&mut self, prefix: &P) -> bool
pub fn remove(&mut self, prefix: &P) -> bool
Removes a value from the set. Returns whether the value was present in the set.
let mut set: PrefixSet<ipnet::Ipv4Net> = PrefixSet::new();
let prefix = "192.168.1.0/24".parse()?;
set.insert(prefix);
assert!(set.contains(&prefix));
assert!(set.remove(&prefix));
assert!(!set.contains(&prefix));
Sourcepub fn remove_keep_tree(&mut self, prefix: &P) -> bool
pub fn remove_keep_tree(&mut self, prefix: &P) -> bool
Removes a prefix from the set, returning wether the prefix was present or not. In contrast
to Self::remove
, his operation will keep the tree structure as is, but only remove the
element from it. This allows any future insert
on the same prefix to be faster. However
future reads from the tree might be a bit slower because they need to traverse more nodes.
let mut set: PrefixSet<ipnet::Ipv4Net> = PrefixSet::new();
let prefix = "192.168.1.0/24".parse()?;
set.insert(prefix);
assert!(set.contains(&prefix));
assert!(set.remove_keep_tree(&prefix));
assert!(!set.contains(&prefix));
// future inserts of the same key are now faster!
set.insert(prefix);
Sourcepub fn remove_children(&mut self, prefix: &P)
pub fn remove_children(&mut self, prefix: &P)
Remove all elements that are contained within prefix
. This will change the tree
structure. This operation is O(n)
, as the entries must be freed up one-by-one.
let mut set: PrefixSet<ipnet::Ipv4Net> = PrefixSet::new();
set.insert("192.168.0.0/22".parse()?);
set.insert("192.168.0.0/23".parse()?);
set.insert("192.168.0.0/24".parse()?);
set.insert("192.168.2.0/23".parse()?);
set.insert("192.168.2.0/24".parse()?);
set.remove_children(&"192.168.0.0/23".parse()?);
assert!(!set.contains(&"192.168.0.0/23".parse()?));
assert!(!set.contains(&"192.168.0.0/24".parse()?));
assert!(set.contains(&"192.168.2.0/23".parse()?));
assert!(set.contains(&"192.168.2.0/24".parse()?));
Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Clear the set but keep the allocated memory.
let mut set: PrefixSet<ipnet::Ipv4Net> = PrefixSet::new();
set.insert("192.168.0.0/24".parse()?);
set.insert("192.168.1.0/24".parse()?);
set.clear();
assert!(!set.contains(&"192.168.0.0/24".parse()?));
assert!(!set.contains(&"192.168.1.0/24".parse()?));
Sourcepub fn retain<F>(&mut self, f: F)
pub fn retain<F>(&mut self, f: F)
Keep only the elements in the map that satisfy the given condition f
.
let mut set: PrefixSet<ipnet::Ipv4Net> = PrefixSet::new();
set.insert("192.168.0.0/24".parse()?);
set.insert("192.168.1.0/24".parse()?);
set.insert("192.168.2.0/24".parse()?);
set.insert("192.168.2.0/25".parse()?);
set.retain(|p| p.prefix_len() == 24);
assert!(set.contains(&"192.168.0.0/24".parse()?));
assert!(set.contains(&"192.168.1.0/24".parse()?));
assert!(set.contains(&"192.168.2.0/24".parse()?));
assert!(!set.contains(&"192.168.2.0/25".parse()?));
Sourcepub fn children<'a>(&'a self, prefix: &P) -> Iter<'a, P> ⓘ
pub fn children<'a>(&'a self, prefix: &P) -> Iter<'a, P> ⓘ
Get an iterator over the node itself and all children. All elements returned have a prefix
that is contained within prefix
itself (or are the same). The iterator yields elements in
lexicographic order.
Info: Use the crate::trieview::TrieView
abstraction that provides more flexibility.
let mut set: PrefixSet<ipnet::Ipv4Net> = PrefixSet::new();
set.insert("192.168.0.0/22".parse()?);
set.insert("192.168.0.0/23".parse()?);
set.insert("192.168.2.0/23".parse()?);
set.insert("192.168.0.0/24".parse()?);
set.insert("192.168.2.0/24".parse()?);
assert_eq!(
set.children(&"192.168.0.0/23".parse()?).collect::<Vec<_>>(),
vec![
&"192.168.0.0/23".parse()?,
&"192.168.0.0/24".parse()?,
]
);
Sourcepub fn cover<'a, 'p>(&'a self, prefix: &'p P) -> CoverKeys<'a, 'p, P, ()> ⓘ
pub fn cover<'a, 'p>(&'a self, prefix: &'p P) -> CoverKeys<'a, 'p, P, ()> ⓘ
Iterate over all prefixes in the set that covers the given prefix
(including prefix
itself if that is present in the set). The returned iterator yields &'a P
.
The iterator will always yield elements ordered by their prefix length, i.e., their depth in the tree.
let mut set: PrefixSet<ipnet::Ipv4Net> = PrefixSet::new();
let p0 = "10.0.0.0/8".parse()?;
let p1 = "10.1.0.0/16".parse()?;
let p2 = "10.1.1.0/24".parse()?;
set.insert(p0);
set.insert(p1);
set.insert(p2);
set.insert("10.1.2.0/24".parse()?); // disjoint prefixes are not covered
set.insert("10.1.1.0/25".parse()?); // more specific prefixes are not covered
set.insert("11.0.0.0/8".parse()?); // Branch points that don't contain values are skipped
assert_eq!(set.cover(&p2).collect::<Vec<_>>(), vec![&p0, &p1, &p2]);
Trait Implementations§
Source§impl<P: Prefix> AsView for PrefixSet<P>
impl<P: Prefix> AsView for PrefixSet<P>
Source§impl<'a, P: Prefix> AsViewMut<'a, P, ()> for &'a mut PrefixSet<P>
impl<'a, P: Prefix> AsViewMut<'a, P, ()> for &'a mut PrefixSet<P>
Source§fn view_mut(self) -> TrieViewMut<'a, P, ()>
fn view_mut(self) -> TrieViewMut<'a, P, ()>
Source§fn view_mut_at(self, prefix: P) -> Option<TrieViewMut<'a, P, T>>
fn view_mut_at(self, prefix: P) -> Option<TrieViewMut<'a, P, T>>
prefix
. If that prefix
is not part of the trie, None
is returned. Calling this function is identical to self.view().find(prefix)
.Source§impl<P: Prefix> FromIterator<P> for PrefixSet<P>
impl<P: Prefix> FromIterator<P> for PrefixSet<P>
Source§fn from_iter<I: IntoIterator<Item = P>>(iter: I) -> Self
fn from_iter<I: IntoIterator<Item = P>>(iter: I) -> Self
Source§impl<'a, P: Prefix> IntoIterator for &'a PrefixSet<P>
impl<'a, P: Prefix> IntoIterator for &'a PrefixSet<P>
Source§impl<P: Prefix> IntoIterator for PrefixSet<P>
impl<P: Prefix> IntoIterator for PrefixSet<P>
impl<P> Eq for PrefixSet<P>
Auto Trait Implementations§
impl<P> !Freeze for PrefixSet<P>
impl<P> !RefUnwindSafe for PrefixSet<P>
impl<P> Send for PrefixSet<P>where
P: Send,
impl<P> Sync for PrefixSet<P>where
P: Sync,
impl<P> Unpin for PrefixSet<P>where
P: Unpin,
impl<P> UnwindSafe for PrefixSet<P>where
P: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more