Struct prefix_trie::set::PrefixSet
source · pub struct PrefixSet<P>(_);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.
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<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_lpm<'a, 'b>(&'a self, prefix: &'b P) -> Option<&'a P>
pub fn get_lpm<'a, 'b>(&'a self, prefix: &'b P) -> Option<&'a P>
Get the longest prefix in the set that contains the given preifx.
let mut set: PrefixSet<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 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,
trueis returned. - If the set already contained this value,
falseis returned.
let mut set: PrefixSet<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<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<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<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<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)where
F: FnMut(&P) -> bool,
pub fn retain<F>(&mut self, f: F)where
F: FnMut(&P) -> bool,
Keep only the elements in the map that satisfy the given condition f.
sourcepub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, P> ⓘ
pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, P> ⓘ
Return an iterator that traverses both trees simultaneously and yields the union of both sets in lexicographic order.
let mut set_a: PrefixSet<Ipv4Net> = PrefixSet::from_iter([
"192.168.0.0/22".parse()?,
"192.168.0.0/24".parse()?,
"192.168.2.0/23".parse()?,
]);
let mut set_b: PrefixSet<Ipv4Net> = PrefixSet::from_iter([
"192.168.0.0/22".parse()?,
"192.168.0.0/23".parse()?,
"192.168.2.0/24".parse()?,
]);
assert_eq!(
set_a.union(&set_b).copied().collect::<Vec<_>>(),
vec![
"192.168.0.0/22".parse()?,
"192.168.0.0/23".parse()?,
"192.168.0.0/24".parse()?,
"192.168.2.0/23".parse()?,
"192.168.2.0/24".parse()?,
]
);sourcepub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, P> ⓘ
pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, P> ⓘ
Return an iterator that traverses both trees simultaneously and yields the intersection of both sets in lexicographic order.
let mut set_a: PrefixSet<Ipv4Net> = PrefixSet::from_iter([
"192.168.0.0/22".parse()?,
"192.168.0.0/24".parse()?,
"192.168.2.0/23".parse()?,
]);
let mut set_b: PrefixSet<Ipv4Net> = PrefixSet::from_iter([
"192.168.0.0/22".parse()?,
"192.168.0.0/24".parse()?,
"192.168.2.0/24".parse()?,
]);
assert_eq!(
set_a.intersection(&set_b).copied().collect::<Vec<_>>(),
vec!["192.168.0.0/22".parse()?, "192.168.0.0/24".parse()?]
);sourcepub fn difference<'a>(&'a self, other: &'a Self) -> Difference<'a, P> ⓘ
pub fn difference<'a>(&'a self, other: &'a Self) -> Difference<'a, P> ⓘ
Return an iterator that traverses both trees simultaneously and yields the difference of both sets in lexicographic order.
let mut set_a: PrefixSet<Ipv4Net> = PrefixSet::from_iter([
"192.168.0.0/22".parse()?,
"192.168.0.0/24".parse()?,
"192.168.2.0/23".parse()?,
]);
let mut set_b: PrefixSet<Ipv4Net> = PrefixSet::from_iter([
"192.168.0.0/22".parse()?,
"192.168.0.0/24".parse()?,
"192.168.2.0/24".parse()?,
]);
assert_eq!(
set_a.difference(&set_b).copied().collect::<Vec<_>>(),
vec!["192.168.2.0/23".parse()?]
);