inline-option 0.1.5

A memory-efficient alternative to Option that uses a pre-defined value to represent None.
Documentation
use criterion::{Criterion, criterion_group, criterion_main};
use inline_option::{IOption, Nullable};

#[derive(Clone, Default)]
#[repr(transparent)]
struct TestU32(u32);

impl Nullable for TestU32 {
    const NULL: Self = TestU32(u32::MAX);

    fn is_null(&self) -> bool {
        self.0 == u32::MAX
    }
}

fn bench_iter_mut<T: Nullable + Clone + Default>(c: &mut Criterion) {
    let mut group = c.benchmark_group("vec_iter_mut");
    group.throughput(criterion::Throughput::Elements(10000));
    let mut vec = vec![None::<T>; 10000];
    group.bench_function("STD Option", |b| {
        b.iter(|| {
            for x in vec.iter_mut() {
                x.replace(T::default());
            }
        })
    });

    let mut vec = vec![IOption::<T>::none(); 10000];
    group.bench_function("Inline Option", |b| {
        b.iter(|| {
            for x in vec.iter_mut() {
                x.replace(T::default());
            }
        })
    });

    group.finish();
}

criterion_group!(benches, bench_iter_mut::<TestU32>,);
criterion_main!(benches);