wordvec 0.2.0

A compact `SmallVec<T>`-like container with only `align_of::<T>()` overhead for small stack-only instances.
Documentation
mod impls;

pub struct IaiBlackBox;

impl impls::BlackBox for IaiBlackBox {
    fn black_box<T>(t: T) { iai::black_box(t); }
}

macro_rules! run_bench {
    (
        $module:ident $module_strlit:literal;
        $bench_name:ident $bench_name_strlit:literal, $variant_name:ident;
        $($arg:expr,)*;
    ) => {
        paste::paste! {
            #[cfg(all(
                any(not(wordvec_bench_bench_partial), wordvec_bench_bench = $bench_name_strlit),
                any(not(wordvec_bench_module_partial), wordvec_bench_module = $module_strlit),
            ))]
            fn [<bench_ $module _ $bench_name _ $variant_name>]() {
                if <impls::$module::Benches as impls::Benches<IaiBlackBox>>::[<has_ $bench_name>]() {
                    impls::Benches::<IaiBlackBox>::$bench_name(impls::$module::Benches, $($arg),*)();
                }
            }

            #[cfg(not(all(
                any(not(wordvec_bench_bench_partial), wordvec_bench_bench = $bench_name_strlit),
                any(not(wordvec_bench_module_partial), wordvec_bench_module = $module_strlit),
            )))]
            fn [<bench_ $module _ $bench_name _ $variant_name>]() {}
        }
    }
}

macro_rules! run_benches {
    (
        $(
            $bench_name:ident $bench_name_strlit:literal
            $([$($generics:tt)*])?
            (
                $(
                    $param_name:ident: $param_ty:ty
                ),* $(,)?
            )
            {
                $(
                    $variant_name:ident:
                    (
                        $($arg:expr),* $(,)?
                    );
                )*
            }
        )*
    ) => {
        paste::paste! {
            $(
                $(
                    run_bench! {
                        std_vec "std_vec";
                        $bench_name $bench_name_strlit, $variant_name;
                        $($arg,)*;
                    }

                    run_bench! {
                        smallvec "smallvec";
                        $bench_name $bench_name_strlit, $variant_name;
                        $($arg,)*;
                    }

                    run_bench! {
                        wordvec "wordvec";
                        $bench_name $bench_name_strlit, $variant_name;
                        $($arg,)*;
                    }

                    run_bench! {
                        thinvec "thinvec";
                        $bench_name $bench_name_strlit, $variant_name;
                        $($arg,)*;
                    }
                )*
            )*

            iai::main!($($(
                [<bench_std_vec_ $bench_name _ $variant_name>],
                [<bench_smallvec_ $bench_name _ $variant_name>],
                [<bench_wordvec_ $bench_name _ $variant_name>],
                [<bench_thinvec_ $bench_name _ $variant_name>],
            )*)*);
        }
    }
}

impls::list_benches!(run_benches, IaiBlackbox);