ip_network 0.4.1

IPv4 and IPv6 network structs.
Documentation
#[macro_use]
extern crate criterion;

use std::net::{Ipv4Addr, Ipv6Addr};
use ip_network::{Ipv4Network, Ipv6Network, IpNetwork};
use criterion::Criterion;
use std::str::FromStr;

fn parse(c: &mut Criterion) {
    c.bench_function("parse ipv4", |b| {
        b.iter(|| "127.0.0.1/32".parse::<Ipv4Network>().unwrap())
    });
    c.bench_function("parse ipv6", |b| {
        b.iter(|| "::1/128".parse::<Ipv6Network>().unwrap())
    });
    c.bench_function("parse ipv6 IpNetwork", |b| {
        b.iter(|| "::1/128".parse::<IpNetwork>().unwrap())
    });
}

fn contains(c: &mut Criterion) {
    let ipv4_network = Ipv4Network::new(Ipv4Addr::new(127, 0, 0, 0), 8).unwrap();
    let ipv6_network = Ipv6Network::new(Ipv6Addr::new(127, 0, 0, 0, 0, 0, 0, 0), 16).unwrap();

    c.bench_function("contains ipv4", move |b| {
        b.iter(|| {
            ipv4_network.contains(Ipv4Addr::new(127, 0, 0, 1));
        })
    });
    c.bench_function("contains ipv6", move |b| {
        b.iter(|| {
            ipv6_network.contains(Ipv6Addr::new(127, 0, 0, 1, 0, 0, 0, 0));
        })
    });
}

fn collapse_addresses(c: &mut Criterion) {
    let ipv4_addresses = [
        Ipv4Network::from_str("1.1.1.0/32").unwrap(),
        Ipv4Network::from_str("1.1.1.1/32").unwrap(),
        Ipv4Network::from_str("1.1.1.2/32").unwrap(),
        Ipv4Network::from_str("1.1.1.3/32").unwrap(),
        Ipv4Network::from_str("1.1.1.4/32").unwrap(),
        Ipv4Network::from_str("1.1.1.0/32").unwrap(),
    ];

    let ipv6_addresses = [
        "2603:1046:1400::/48",
        "2603:1046:1401::/48",
        "2603:1046:1402::/48",
        "2603:1046:1403::/48",
        "2603:1046:1404::/48",
        "2603:1046:1405::/48",
        "2603:1046:1406::/48",
        "2603:1046:1407::/48",
        "2603:1046:1408::/48",
        "2603:1046:140a::/48",
        "2603:1046:140b::/48",
        "2603:1046:1500:10::/64",
        "2603:1046:1500:14::/64",
        "2603:1046:1500:18::/64",
        "2603:1046:1500:1c::/64",
        "2603:1046:1500:20::/64",
        "2603:1046:1500:24::/64",
        "2603:1046:1500:28::/64",
        "2603:1046:1500:2c::/64",
        "2603:1046:1500:30::/64",
        "2603:1046:1500:4::/64",
        "2603:1046:1500:8::/64",
    ]
    .iter()
    .map(|s| Ipv6Network::from_str(s).unwrap())
    .collect::<Vec<_>>();

    c.bench_function("collapse_addresses ipv4", move |b| {
        b.iter(|| {
            Ipv4Network::collapse_addresses(&ipv4_addresses);
        })
    });
    c.bench_function("collapse_addresses ipv6", move |b| {
        b.iter(|| {
            Ipv6Network::collapse_addresses(&ipv6_addresses);
        })
    });
}

criterion_group!(benches, parse, contains, collapse_addresses);
criterion_main!(benches);