orx-fixed-vec 3.23.0

An efficient fixed capacity vector with pinned element guarantees.
Documentation
use orx_fixed_vec::*;

#[test]
fn reserve() {
    let vec = FixedVec::<String>::new(42);

    let mut con_vec = vec.into_concurrent();

    unsafe { con_vec.get_ptr_mut(0).write("first".to_string()) };

    assert_eq!(con_vec.capacity(), 42);
    assert_eq!(con_vec.max_capacity(), 42);

    unsafe { con_vec.reserve_maximum_concurrent_capacity(0, 74) };
    let new_capacity = con_vec.capacity();
    assert!(new_capacity >= 74);
    assert_eq!(con_vec.max_capacity(), new_capacity);

    let vec = unsafe { con_vec.into_inner(1) };

    assert_eq!(vec.len(), 1);
    assert_eq!(vec.capacity(), new_capacity);
    assert_eq!(&vec[0], &"first".to_string());
}

#[test]
fn into_concurrent_fill_with() {
    let vec = FixedVec::<String>::new(42);
    let con_vec = vec.into_concurrent_filled_with(|| "x".to_string());
    let vec = unsafe { con_vec.into_inner(42) };
    assert_eq!(vec, (0..42).map(|_| "x".to_string()).collect::<Vec<_>>());

    let mut vec = FixedVec::<String>::new(42);
    vec.push("y".to_string());
    let con_vec = vec.into_concurrent_filled_with(|| "x".to_string());
    let vec = unsafe { con_vec.into_inner(42) };
    assert_eq!(&vec[0], &"y".to_string());
    assert_eq!(
        vec[1..],
        (1..42).map(|_| "x".to_string()).collect::<Vec<_>>()
    );
}

#[test]
fn reserve_fill_with() {
    let vec = FixedVec::<String>::new(42);

    let mut con_vec = vec.into_concurrent_filled_with(|| "x".to_string());

    unsafe { con_vec.reserve_maximum_concurrent_capacity_fill_with(42, 74, || "y".to_string()) };
    let new_capacity = con_vec.capacity();
    assert!(new_capacity >= 74);
    assert_eq!(con_vec.max_capacity(), new_capacity);

    let vec = unsafe { con_vec.into_inner(new_capacity) };

    assert_eq!(
        vec[0..42],
        (0..42).map(|_| "x".to_string()).collect::<Vec<_>>()
    );
    assert_eq!(
        vec[42..],
        (42..new_capacity)
            .map(|_| "y".to_string())
            .collect::<Vec<_>>()
    );
}