path 0.8.2

IP based connection identification and tracing
#![feature(test)]
extern crate path;
extern crate test;

use test::Bencher;
use path::{Path, Identifier};
use std::net::{IpAddr, Ipv4Addr};

fn get_identifier() -> Identifier<u8> {
    Identifier::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)),
                    1234,
                    IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)),
                    443,
                    16)
}

#[bench]
fn single_connection(bencher: &mut Bencher) {
    let mut path: Path<u8, ()> = Path::new();
    let identifier = get_identifier();

    bencher.iter(|| {
        assert!(path.track(&identifier).is_ok());
    });
}

#[bench]
fn thousand_connections(bencher: &mut Bencher) {
    let mut path: Path<u8, ()> = Path::new();
    let mut identifier = get_identifier();

    bencher.iter(|| {
        for i in 1..1001 {
            identifier.lower.port = i;
            assert!(path.track(&identifier).is_ok());
        }
    });
}

#[bench]
fn last_mut(bencher: &mut Bencher) {
    let mut path: Path<u8, ()> = Path::new();
    let mut identifier = get_identifier();

    for i in 1..1000 {
        identifier.lower.port = i;
        path.track(&identifier).expect("Tracking failed");
    }

    bencher.iter(|| {
        assert!(path.last_mut().is_some());
    });
}