tea-core 0.5.1

Core data structures and traits for tevec.
Documentation
use criterion::{Criterion, criterion_group, criterion_main};
use tea_core::prelude::*;

const LENGTH: usize = 1_000_000;
const WINDOW: usize = 100;

fn bench_rolling_custom_hand(c: &mut Criterion) {
    let data: Vec<_> = (0..LENGTH as i32).collect();
    c.bench_function("rolling_custom_hand", |b| {
        b.iter(|| {
            let len = data.len();
            let window = WINDOW.min(len);
            let mut out = Vec::uninit(LENGTH);
            for i in 0..window - 1 {
                let slice = &data[0..i + 1];
                let sum: i32 = Iterator::sum(slice.iter());
                unsafe {
                    out.uset(i, sum);
                }
            }
            for (start, end) in (window - 1..len).enumerate() {
                let slice = &data[start..end + 1];
                let sum = Iterator::sum(slice.iter());
                unsafe {
                    out.uset(end, sum);
                }
            }
            unsafe { out.assume_init() }
        })
    });
}

fn bench_rolling_custom_trait(c: &mut Criterion) {
    let data: Vec<_> = (0..LENGTH as i32).collect();
    c.bench_function("rolling_custom_trait", |b| {
        b.iter(|| {
            let _out =
                data.rolling_custom::<Vec<i32>, _, _>(WINDOW, |x| Iterator::sum(x.iter()), None);
        })
    });
}

criterion_group!(
    benches,
    bench_rolling_custom_hand,
    bench_rolling_custom_trait
);
criterion_main!(benches);