cev 0.1.0

An expandable data array used to add data to the beginning of the array.
Documentation
use cev::Cev;
use std::ptr::NonNull;

#[test]
fn test_set_len_ptr() {
    fn dangling_ptr_eq<T>(cev: &Cev<T>) -> bool {
        cev.as_ptr() == NonNull::<T>::dangling().as_ptr()
    }

    let mut cev: Cev<String> = Cev::new();
    assert_eq!(cev.as_ptr(), NonNull::<String>::dangling().as_ptr());
    assert!(dangling_ptr_eq(&cev));
    unsafe {
        cev.set_len_ptr(0);
    };
    assert!(dangling_ptr_eq(&cev));

    let mut cev: Cev<u8> = Cev::from([1]);
    assert_eq!(cev.as_ptr(), cev.raw_ptr());
    unsafe {
        cev.set_len_ptr(0);
    };
    assert_eq!(cev.as_ptr(), cev.raw_ptr());
    cev.reserve(8);
    cev.push(4);
    cev.push(3);
    cev.push(2);
    cev.push(1);
    unsafe {
        cev.set_len_ptr(0);
    };
    assert_eq!(
        unsafe { cev.as_ptr().offset_from(cev.raw_ptr()) },
        (cev.capacity() - 1) as isize
    );
    cev.push(8);
    cev.push(7);
    cev.push(6);
    cev.push(5);
    cev.push(4);
    cev.push(3);
    cev.push(2);
    cev.push(1);
    assert_eq!(cev.as_ptr(), cev.raw_ptr());
    unsafe {
        cev.set_len_ptr(0);
    };
    assert_eq!(
        unsafe { cev.as_ptr().offset_from(cev.raw_ptr()) },
        (cev.capacity() - 1) as isize
    );

    let mut cev: Cev<()> = Cev::with_capacity(0);
    assert!(dangling_ptr_eq(&cev));
    unsafe {
        cev.set_len_ptr(0);
    };
    assert_eq!(cev.as_ptr(), cev.raw_ptr());

    let mut cev: Cev<()> = Cev::with_capacity(1);
    assert!(dangling_ptr_eq(&cev));
    unsafe {
        cev.set_len_ptr(0);
    };
    assert!(dangling_ptr_eq(&cev));

    let mut cev: Cev<()> = Cev::with_capacity(10);
    assert!(dangling_ptr_eq(&cev));
    unsafe {
        cev.set_len_ptr(0);
    };
    assert_eq!(cev.as_ptr(), cev.raw_ptr());

    let mut cev: Cev<Cev<u8>> = Cev::with_capacity(0);
    assert!(dangling_ptr_eq(&cev));
    unsafe {
        cev.set_len_ptr(0);
    };
    assert!(dangling_ptr_eq(&cev));

    let mut cev: Cev<Cev<u8>> = Cev::with_capacity(1);
    assert_eq!(cev.as_ptr(), cev.raw_ptr());
    unsafe {
        cev.set_len_ptr(0);
    };
    assert_eq!(cev.as_ptr(), cev.raw_ptr());

    let mut cev: Cev<Cev<u8>> = Cev::with_capacity(10);
    assert_eq!(
        unsafe { cev.as_ptr().offset_from(cev.raw_ptr()) },
        (cev.capacity() - 1) as isize
    );
    unsafe {
        cev.set_len_ptr(0);
    };
    assert_eq!(
        unsafe { cev.as_ptr().offset_from(cev.raw_ptr()) },
        (cev.capacity() - 1) as isize
    );

    let mut cev: Cev<u8> = Cev::with_capacity(4);
    assert_eq!(
        unsafe { cev.as_ptr().offset_from(cev.raw_ptr()) },
        (cev.capacity() - 1) as isize
    );
    unsafe {
        cev.set_len_ptr(0);
    };
    assert_eq!(
        unsafe { cev.as_ptr().offset_from(cev.raw_ptr()) },
        (cev.capacity() - 1) as isize
    );
    cev.push(4);
    cev.push(3);
    cev.push(2);
    cev.push(1);
    assert_eq!(cev.as_ptr(), cev.raw_ptr());
    unsafe {
        cev.set_len_ptr(0);
    };
    assert_eq!(
        unsafe { cev.as_ptr().offset_from(cev.raw_ptr()) },
        (cev.capacity() - 1) as isize
    );
}