any_vec 0.15.0

Type erased vector. Most operations can be done without type knowledge. Mostly zero overhead.
Documentation
use std::any::TypeId;
use std::mem::size_of;
use std::ptr::NonNull;
use criterion::{criterion_group, criterion_main, Criterion};
use any_vec::any_value::{AnyValueRaw};
use any_vec::AnyVec;

const SIZE: usize = 10000;

fn vec_insert_front(){
    let mut vec = Vec::new();
    for i in 0..SIZE{
        vec.insert(0, i);
    }
}

fn any_vec_insert_front(){
    let mut any_vec: AnyVec = AnyVec::new::<usize>();
    for i in 0..SIZE{
        let raw_value = unsafe{
            AnyValueRaw::new(
            NonNull::from(&i).cast::<u8>(),
            size_of::<usize>(),
            TypeId::of::<usize>()
        )};
        any_vec.insert(0, raw_value);
    }
}

fn any_vec_typed_insert_front(){
    let mut any_vec: AnyVec = AnyVec::new::<usize>();
    for i in 0..SIZE{
        let mut vec = any_vec.downcast_mut::<usize>().unwrap();
        vec.insert(0, i);
    }
}

fn vec_insert_back(){
    let mut vec = Vec::new();
    for i in 0..SIZE{
        vec.insert(i, i);
    }
}

fn any_vec_insert_back(){
    let mut any_vec: AnyVec = AnyVec::new::<usize>();
    for i in 0..SIZE{
        let raw_value = unsafe{
            AnyValueRaw::new(
            NonNull::from(&i).cast::<u8>(),
            size_of::<usize>(),
            TypeId::of::<usize>()
        )};
        any_vec.insert(i, raw_value);
    }
}

fn any_vec_typed_insert_back(){
    let mut any_vec: AnyVec = AnyVec::new::<usize>();
    for i in 0..SIZE{
        let mut vec = any_vec.downcast_mut::<usize>().unwrap();
        vec.insert(i, i);
    }
}

pub fn bench_push(c: &mut Criterion) {
    c.bench_function("Vec insert front", |b|b.iter(||vec_insert_front()));
    c.bench_function("AnyVec insert front", |b|b.iter(||any_vec_insert_front()));
    c.bench_function("AnyVecTyped insert front", |b|b.iter(||any_vec_typed_insert_front()));
    c.bench_function("Vec insert back", |b|b.iter(||vec_insert_back()));
    c.bench_function("AnyVec insert back", |b|b.iter(||any_vec_insert_back()));
    c.bench_function("AnyVecTyped insert back", |b|b.iter(||any_vec_typed_insert_back()));

}

criterion_group!(benches, bench_push);
criterion_main!(benches);