polymap 0.3.0

A map containing varying types of value
Documentation
#![feature(test)]

extern crate polymap;
extern crate rand;
extern crate test;

use rand::{thread_rng, Rng};

use test::{black_box, Bencher};

use polymap::PolyMap;

macro_rules! map_insert_rand_bench {
    ( $name:ident , $n:expr ) => {
        #[bench]
        fn $name(b: &mut Bencher) {
            let mut map = PolyMap::<usize>::new();
            let mut rng = thread_rng();

            for _ in 0..$n {
                map.insert(rng.gen::<usize>() % $n, 0u32);
            }

            b.iter(|| {
                let k = rng.gen::<usize>() % $n;

                map.insert(k, 0u32);
                let _: Option<u32> = map.remove(&k);
            });

            black_box(map);
        }
    }
}

macro_rules! map_find_rand_bench {
    ( $name:ident , $n:expr ) => {
        #[bench]
        fn $name(b: &mut Bencher) {
            let mut map = PolyMap::<usize>::new();
            let mut rng = thread_rng();

            let mut keys = (0..$n)
                .map(|_| rng.gen::<usize>() % $n).collect::<Vec<_>>();

            for &k in &keys {
                map.insert(k, 0u32);
            }

            rng.shuffle(&mut keys);

            let mut i = 0;

            b.iter(|| {
                let v: Option<&u32> = map.get(&keys[i]);
                i = (i + 1) % $n;
                black_box(v);
            });
        }
    }
}

map_insert_rand_bench!{ map_insert_rand_100,    100 }
map_insert_rand_bench!{ map_insert_rand_10_000, 10_000 }

map_find_rand_bench!{ map_find_rand_100,    100 }
map_find_rand_bench!{ map_find_rand_10_000, 10_000 }