stride 0.4.1

A strided slice type
Documentation
mod iter;
mod ops;

use stride::Stride;

#[test]
fn stride_debug() {
    let stride = Stride::<_, 1>::new(&[1, 2, 3, 4, 5]);
    assert_eq!(format!("{stride:?}"), "[1, 2, 3, 4, 5]");

    let stride = Stride::<_, 2>::new(&[1, 2, 3, 4, 5]);
    assert_eq!(format!("{stride:?}"), "[1, 3, 5]");

    let stride = Stride::<_, 3>::new(&[1, 2, 3, 4, 5]);
    assert_eq!(format!("{stride:?}"), "[1, 4]");
}

#[test]
fn stride_default() {
    let stride: &Stride<i64, 3> = Default::default();
    assert_eq!(stride.len(), 0);
}

#[test]
fn stride_mut_default() {
    let stride: &mut Stride<i64, 3> = Default::default();
    assert_eq!(stride.len(), 0);
}

#[test]
fn stride_new_multiple() {
    let stride = Stride::<_, 3>::new(&[1, 2, 3, 4, 5, 6]);
    assert_eq!(stride[0], 1);
    assert_eq!(stride[1], 4);
}

#[test]
fn stride_new_non_multiple() {
    let stride = Stride::<_, 3>::new(&[1, 2, 3, 4]);
    assert_eq!(stride[0], 1);
    assert_eq!(stride[1], 4);
}

#[test]
fn stride_len() {
    let stride = Stride::<_, 3>::new(&[1, 2, 3, 4, 5, 6]);
    assert_eq!(stride.len(), 2);
}

#[test]
fn stride_len_non_multiple() {
    let stride = Stride::<_, 3>::new(&[1, 2, 3, 4, 5]);
    assert_eq!(stride.len(), 2);
}

#[test]
fn stride_as_ptr() {
    let data = &[1, 2, 3, 4, 5, 6];
    let stride = Stride::<_, 2>::new(data);
    assert!(core::ptr::eq(data.as_ptr(), stride.as_ptr()));
}

#[test]
fn stride_as_mut_ptr() {
    let data = &mut [1, 2, 3, 4, 5, 6];
    let stride = Stride::<_, 2>::new_mut(data);
    let stride_ptr = stride.as_mut_ptr();
    for i in (0..data.len()).step_by(2) {
        unsafe {
            *stride_ptr.add(i) *= 2;
        }
    }
    assert_eq!(data, &[2, 2, 6, 4, 10, 6]);
}

#[test]
fn stride_first() {
    let stride = Stride::<_, 2>::new(&[1, 2, 3, 4, 5, 6]);
    assert_eq!(stride.first(), Some(&1));

    let stride = <&Stride<i32, 2>>::default();
    assert_eq!(stride.first(), None);
}

#[test]
fn stride_first_mut() {
    let data = &mut [2, 2, 3, 4, 5, 6];
    let stride = Stride::<_, 2>::new_mut(data);
    *stride.first_mut().unwrap() = 1;
    assert_eq!(stride.first(), Some(&1));
}

#[test]
fn stride_first_mut_empty() {
    let stride = <&mut Stride<i32, 2>>::default();
    assert_eq!(stride.first_mut(), None);
}

#[test]
fn stride_last() {
    let stride = Stride::<_, 2>::new(&[1, 2, 3, 4, 5, 6]);
    assert_eq!(stride.last(), Some(&5));

    let stride = Stride::<_, 2>::new(&[1, 2, 3]);
    assert_eq!(stride.last(), Some(&3));

    let stride = Stride::<_, 2>::new(&[1]);
    assert_eq!(stride.last(), Some(&1));
}

#[test]
fn stride_last_empty() {
    let stride = <&Stride<i32, 2>>::default();
    assert_eq!(stride.last(), None);
}

#[test]
fn stride_last_mut() {
    let data = &mut [1, 2, 3, 4, 6, 6];
    let stride = Stride::<_, 2>::new_mut(data);
    *stride.last_mut().unwrap() = 5;
    assert_eq!(stride.last(), Some(&5));
}

#[test]
fn stride_last_mut_empty() {
    let stride = <&mut Stride<i32, 2>>::default();
    assert_eq!(stride.last_mut(), None);
}

#[test]
fn stride_swap() {
    let data = &mut [1, 2, 3, 4, 5, 6];
    let stride = Stride::<_, 2>::new_mut(data);
    assert_eq!(stride, &[1, 3, 5]);
    stride.swap(1, 2);
    assert_eq!(stride, &[1, 5, 3]);
    stride.swap(2, 1);
    assert_eq!(stride, &[1, 3, 5]);
}