Struct IpLookupTable

Source
pub struct IpLookupTable<A, T> { /* private fields */ }
Expand description

A fast, compressed IP lookup table.

Implementations§

Source§

impl<A, T> IpLookupTable<A, T>
where A: Address,

Source

pub fn new() -> Self

Initialize an empty lookup table with no preallocation.

Source

pub fn with_capacity(n: usize) -> Self

Initialize an empty lookup table with pre-allocated buffers.

Source

pub fn mem_usage(&self) -> (usize, usize)

Return the bytes used by nodes and results.

Source

pub fn len(&self) -> usize

Return number of items inside table.

Source

pub fn is_empty(&self) -> bool

Return true if no item is inside table.

Source

pub fn insert(&mut self, ip: A, masklen: u32, value: T) -> Option<T>

Insert a value for the prefix designated by ip and masklen. If prefix existed previously, the old value is returned.

§Panics

Panics if prefix has bits set to the right of mask.

§Examples
use treebitmap::IpLookupTable;
use std::net::Ipv6Addr;

let mut table = IpLookupTable::new();
let prefix = Ipv6Addr::new(0x2001, 0xdb8, 0xdead, 0xbeef, 0, 0, 0, 0);
let masklen = 32;

assert_eq!(table.insert(prefix, masklen, "foo"), None);
// Insert duplicate
assert_eq!(table.insert(prefix, masklen, "bar"), Some("foo"));
Source

pub fn remove(&mut self, ip: A, masklen: u32) -> Option<T>

Remove an entry from the lookup table. If the prefix existed previously, the value is returned.

§Examples
use treebitmap::IpLookupTable;
use std::net::Ipv6Addr;

let mut table = IpLookupTable::new();
let prefix = Ipv6Addr::new(0x2001, 0xdb8, 0xdead, 0xbeef, 0, 0, 0, 0);
let masklen = 32;
table.insert(prefix, masklen, "foo");

assert_eq!(table.remove(prefix, masklen), Some("foo"));
// Remove non-existant
assert_eq!(table.remove(prefix, masklen), None);
Source

pub fn exact_match(&self, ip: A, masklen: u32) -> Option<&T>

Perform exact match lookup of ip/masklen and return the value.

§Panics

Panics if prefix has bits set to the right of mask.

§Examples
use treebitmap::IpLookupTable;
use std::net::Ipv6Addr;

let mut table = IpLookupTable::new();
let prefix = Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 0);
let masklen = 32;
table.insert(prefix, masklen, "foo");

assert_eq!(table.exact_match(prefix, masklen), Some(&"foo"));
// differing mask
assert_eq!(table.exact_match(prefix, 48), None);
Source

pub fn exact_match_mut(&mut self, ip: A, masklen: u32) -> Option<&mut T>

Perform exact match lookup of ip/masklen and return the value as mutable.

§Examples
use treebitmap::IpLookupTable;
use std::net::Ipv6Addr;

let mut table = IpLookupTable::new();
let prefix = Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 0);
let masklen = 32;
table.insert(prefix, masklen, "foo");

assert_eq!(table.exact_match(prefix, masklen), Some(&"foo"));
// Mutate value
if let Some(value) = table.exact_match_mut(prefix, masklen) {
    *value = &"bar";
}
// Get new value
assert_eq!(table.exact_match(prefix, masklen), Some(&"bar"));
Source

pub fn longest_match(&self, ip: A) -> Option<(A, u32, &T)>

Perform longest match lookup of ip and return the best matching prefix, designated by ip, masklen, along with its value.

§Example
use treebitmap::IpLookupTable;
use std::net::Ipv6Addr;

let mut table = IpLookupTable::new();
let less_specific = Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 0);
let more_specific = Ipv6Addr::new(0x2001, 0xdb8, 0xdead, 0, 0, 0, 0, 0);
table.insert(less_specific, 32, "foo");
table.insert(more_specific, 48, "bar");

let lookupip = Ipv6Addr::new(0x2001, 0xdb8, 0xdead, 0xbeef,
                             0xcafe, 0xbabe, 0, 1);
let result = table.longest_match(lookupip);
assert_eq!(result, Some((more_specific, 48, &"bar")));

let lookupip = Ipv6Addr::new(0x2001, 0xdb8, 0xcafe, 0xf00,
                             0xf00, 0xf00, 0, 1);
let result = table.longest_match(lookupip);
assert_eq!(result, Some((less_specific, 32, &"foo")));
Source

pub fn longest_match_mut(&mut self, ip: A) -> Option<(A, u32, &mut T)>

Perform longest match lookup of ip and return the best matching prefix, designated by ip, masklen, along with its value as mutable.

§Example
use treebitmap::IpLookupTable;
use std::net::Ipv6Addr;

let mut table = IpLookupTable::new();
let less_specific = Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 0);
let more_specific = Ipv6Addr::new(0x2001, 0xdb8, 0xdead, 0, 0, 0, 0, 0);
table.insert(less_specific, 32, "foo");
table.insert(more_specific, 48, "bar");

let lookupip = Ipv6Addr::new(0x2001, 0xdb8, 0xdead, 0xbeef,
                             0xcafe, 0xbabe, 0, 1);
if let Some((_, _, value)) = table.longest_match_mut(lookupip) {
    assert_eq!(value, &"bar");
    *value = &"foo";
}

let result = table.longest_match(lookupip);
assert_eq!(result, Some((more_specific, 48, &"foo")));
Source

pub fn matches(&self, ip: A) -> impl Iterator<Item = (A, u32, &T)>

Perform match lookup of ip and return the all matching prefixes, designated by ip, masklen, along with its value.

§Example
use treebitmap::IpLookupTable;
use std::net::Ipv6Addr;

let mut table = IpLookupTable::new();
let less_specific = Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 0);
let more_specific = Ipv6Addr::new(0x2001, 0xdb8, 0xdead, 0, 0, 0, 0, 0);
table.insert(less_specific, 32, "foo");
table.insert(more_specific, 48, "bar");

let lookupip = Ipv6Addr::new(0x2001, 0xdb8, 0xdead, 0xbeef,
                             0xcafe, 0xbabe, 0, 1);
let matches = table.matches(lookupip);
assert_eq!(matches.count(), 2);

let lookupip = Ipv6Addr::new(0x2001, 0xdb8, 0xcafe, 0xf00,
                             0xf00, 0xf00, 0, 1);
let matches = table.matches(lookupip);
assert_eq!(matches.count(), 1);
Source

pub fn matches_mut(&mut self, ip: A) -> impl Iterator<Item = (A, u32, &mut T)>

Perform match lookup of ip and return the all matching prefixes, designated by ip, masklen, along with its mutable value.

Source

pub fn iter(&self) -> Iter<'_, A, T>

Returns iterator over prefixes and values.

§Examples
use treebitmap::IpLookupTable;
use std::net::Ipv6Addr;

let mut table = IpLookupTable::new();
let less_specific = Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 0);
let more_specific = Ipv6Addr::new(0x2001, 0xdb8, 0xdead, 0, 0, 0, 0, 0);
table.insert(less_specific, 32, "foo");
table.insert(more_specific, 48, "bar");

let mut iter = table.iter();
assert_eq!(iter.next(), Some((less_specific, 32, &"foo")));
assert_eq!(iter.next(), Some((more_specific, 48, &"bar")));
assert_eq!(iter.next(), None);
Source

pub fn iter_mut(&mut self) -> IterMut<'_, A, T>

Mutable version of iter().

§Examples
use treebitmap::IpLookupTable;
use std::net::Ipv6Addr;

let x: Ipv6Addr = "2001:db8:100::".parse().unwrap();
let y: Ipv6Addr = "2001:db8:100::".parse().unwrap();
let z: Ipv6Addr = "2001:db8:102::".parse().unwrap();
let mut table = IpLookupTable::new();

table.insert(x, 48, 1);
table.insert(y, 56, 2);
table.insert(z, 56, 3);

for (_ip, _mask, val) in table.iter_mut() {
    *val += 10;
}

assert_eq!(table.exact_match(x, 48), Some(&11));
assert_eq!(table.exact_match(y, 56), Some(&12));
assert_eq!(table.exact_match(z, 56), Some(&13));

Trait Implementations§

Source§

impl<A, T> Default for IpLookupTable<A, T>
where A: Address,

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<A, T> IntoIterator for IpLookupTable<A, T>
where A: Address,

Source§

type Item = (A, u32, T)

The type of the elements being iterated over.
Source§

type IntoIter = IntoIter<A, T>

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> IntoIter<A, T>

Creates an iterator from a value. Read more

Auto Trait Implementations§

§

impl<A, T> Freeze for IpLookupTable<A, T>

§

impl<A, T> RefUnwindSafe for IpLookupTable<A, T>

§

impl<A, T> Send for IpLookupTable<A, T>
where A: Send, T: Send,

§

impl<A, T> Sync for IpLookupTable<A, T>
where A: Sync, T: Sync,

§

impl<A, T> Unpin for IpLookupTable<A, T>
where A: Unpin,

§

impl<A, T> UnwindSafe for IpLookupTable<A, T>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.