orx-split-vec 3.8.0

An efficient constant access time vector with dynamic capacity and pinned elements.
Documentation
use orx_pinned_vec::PinnedVec;
use orx_split_vec::SplitVec;

#[test]
fn last_on_pop() {
    let n = 164135;

    let mut vec = SplitVec::new();
    for i in 0..n {
        vec.push(i);
    }

    for _ in 0..(n - 1) {
        let expected_pop = vec.len() - 1;
        let expected_last = expected_pop - 1;
        let pop = vec.pop();
        assert_eq!(Some(expected_pop), pop);
        assert_eq!(Some(&expected_last), vec.last());
    }

    assert_eq!(vec.len(), 1);
    assert_eq!(Some(&0), vec.last());

    let pop = vec.pop();
    assert_eq!(Some(0), pop);
    assert!(vec.last().is_none());
}

#[test]
fn last_on_remove() {
    let n = 1641;
    let expected_last = n - 1;

    let mut vec = SplitVec::new();
    for i in 0..n {
        vec.push(i);
    }

    for _ in 0..(n - 1) {
        let i = if vec.len() <= 2 { 0 } else { vec.len() / 2 };
        let _ = vec.remove(i);
        assert_eq!(Some(&expected_last), vec.last());
    }

    assert_eq!(vec.len(), 1);
    assert_eq!(Some(&expected_last), vec.last());

    let last = vec.remove(0);
    assert_eq!(expected_last, last);
    assert!(vec.last().is_none());
}

#[test]
fn last_on_truncate() {
    let n = 164135;

    let mut vec = SplitVec::new();
    for i in 0..n {
        vec.push(i);
    }

    for _ in 0..(n - 1) {
        let new_len = vec.len() - 1;
        let expected_last = vec.len() - 2;
        vec.truncate(new_len);
        assert_eq!(Some(&expected_last), vec.last());
    }

    assert_eq!(vec.len(), 1);
    assert_eq!(Some(&0), vec.last());

    let pop = vec.pop();
    assert_eq!(Some(0), pop);
    assert!(vec.last().is_none());
}

#[test]
fn first_on_pop() {
    let n = 164135;
    let expected_first = 0;

    let mut vec = SplitVec::new();
    for i in 0..n {
        vec.push(i);
    }

    for _ in 0..(n - 1) {
        let expected_pop = vec.len() - 1;
        let pop = vec.pop();
        assert_eq!(Some(expected_pop), pop);
        assert_eq!(Some(&expected_first), vec.first());
    }

    assert_eq!(vec.len(), 1);
    assert_eq!(Some(&0), vec.first());

    let pop = vec.pop();
    assert_eq!(Some(0), pop);
    assert!(vec.first().is_none());
}

#[test]
fn first_on_remove() {
    let n = 1635;

    let mut vec = SplitVec::new();
    for i in 0..n {
        vec.push(i);
    }

    for i in 0..(n - 1) {
        let expected_removed = i;
        let expected_first = i + 1;
        let removed = vec.remove(0);
        assert_eq!(expected_removed, removed);
        assert_eq!(Some(&expected_first), vec.first());
    }

    assert_eq!(vec.len(), 1);
    assert_eq!(Some(&(n - 1)), vec.first());

    let last = vec.remove(0);
    assert_eq!(n - 1, last);
    assert!(vec.first().is_none());
}

#[test]
fn first_on_truncate() {
    let n = 164135;

    let mut vec = SplitVec::new();
    for i in 0..n {
        vec.push(i);
    }

    for _ in 0..(n - 1) {
        let new_len = vec.len() - 1;
        vec.truncate(new_len);
        assert_eq!(Some(&0), vec.first());
    }

    assert_eq!(vec.len(), 1);
    assert_eq!(Some(&0), vec.first());

    let pop = vec.pop();
    assert_eq!(Some(0), pop);
    assert!(vec.first().is_none());
}