o3 0.9.2

shared-nothing primitives
Documentation
use std::cell::Cell;
use std::mem::size_of;

use o3::collections::ArrayVec;

#[test]
fn array_vec_keeps_values_inline_and_in_order() {
    let values: ArrayVec<_, 4> = ArrayVec::from_fn(3, |index| index + 1);
    assert_eq!(values.len(), 3);
    assert_eq!(values.capacity(), 4);
    assert_eq!(size_of::<ArrayVec<u64, 4>>(), 5 * size_of::<usize>());
    assert_eq!(values.into_iter().collect::<Vec<_>>(), vec![1, 2, 3]);
}

#[test]
fn array_vec_releases_every_value_when_drop_panics() {
    struct PanicDrop<'a> {
        drops: &'a Cell<usize>,
        panic_once: &'a Cell<bool>,
    }

    impl Drop for PanicDrop<'_> {
        fn drop(&mut self) {
            self.drops.set(self.drops.get() + 1);
            if self.panic_once.replace(false) {
                panic!("drop panic");
            }
        }
    }

    let drops = Cell::new(0);
    let panic_once = Cell::new(true);
    let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
        drop(ArrayVec::<_, 2>::from_fn(2, |_| PanicDrop {
            drops: &drops,
            panic_once: &panic_once,
        }));
    }));
    assert!(result.is_err());
    assert_eq!(drops.get(), 2);
}