fixed-map 0.9.5

A fixed map where storage layout is calculated by a procedural macro.
Documentation
use criterion::Criterion;

macro_rules! expand {
    ($len:expr, ($($member:ident),*), $get:ident) => {
        #[allow(unused)]
        #[derive(Clone, Copy, fixed_map::Key)]
        pub enum FixedKey {
            $($member,)*
        }

        #[no_mangle]
        #[inline(never)]
        pub fn sum_fixed(map: &fixed_map::Map<FixedKey, u32>) -> u32 {
            map.values().copied().sum()
        }

        #[allow(unused)]
        #[repr(usize)]
        pub enum ArrayKey {
            $($member,)*
        }

        #[no_mangle]
        #[inline(never)]
        pub fn sum_array(map: &[Option<u32>; $len]) -> u32 {
            map.iter().flatten().copied().sum()
        }
    }
}

expand! {
    16,
    (T00, T01, T02, T03, T04, T05, T06, T07, T8, T9, T10, T11, T12, T13, T14, T15),
    T14
}

fn benches(criterion: &mut Criterion) {
    {
        let mut group = criterion.benchmark_group("array");

        group.bench_function("sum_values", |iter| {
            let mut array = [None; 16];
            array[ArrayKey::T07 as usize] = Some(4);
            array[ArrayKey::T10 as usize] = Some(13);

            iter.iter(|| sum_array(&array))
        });
    }

    {
        let mut group = criterion.benchmark_group("fixed");

        group.bench_function("sum_values", |iter| {
            let mut map = fixed_map::Map::<_, u32>::new();
            map.insert(FixedKey::T07, 4);
            map.insert(FixedKey::T10, 13);

            iter.iter(|| sum_fixed(&map))
        });
    }
}

criterion::criterion_group! {
    name = simple;
    config = Criterion::default();
    targets = benches
}

criterion::criterion_main!(simple);