o3 0.43.2

shared-nothing primitives
Documentation
use std::mem;

use o3::depot::array;

#[test]
fn retains_fixed_domain() {
    assert_eq!(mem::size_of::<array::Index<255>>(), 1);
    assert_eq!(mem::size_of::<Option<array::Index<255>>>(), 1);
    for index in 0..255 {
        assert_eq!(
            array::Index::<255>::new(index).expect("bounded").index(),
            index
        );
    }
    assert!(array::Index::<255>::new(255).is_none());
    assert!(array::Index::<0>::new(0).is_none());
    assert!(array::Index::<4>::new(usize::MAX).is_none());
    for value in 0..=u8::MAX {
        assert_eq!(
            array::Index::<4>::mask(value).index(),
            usize::from(value & 3)
        );
    }
    assert_eq!(array::Index::<0>::iter().count(), 0);
    for (offset, index) in array::Index::<255>::iter().rev().enumerate() {
        assert_eq!(index.index(), 254 - offset);
        assert_eq!(index.widen::<255>().index(), index.index());
        assert_eq!(index.into_u32::<254>().into_usize(), index.index());
    }
    let values = [0, 2, 4];
    for end in array::Index::<4>::iter() {
        let mut target = mem::MaybeUninit::uninit();
        let added = end.insert(&values, 9, &mut target);
        assert_eq!(added[end.index()], 9);
        assert!(added.iter().copied().filter(|&value| value != 9).eq(values));
        assert_eq!(end.next::<5>().index(), end.index() + 1);
        assert_eq!(
            end.previous::<3>().map(|index| index.index()),
            end.index().checked_sub(1)
        );
        for limit in 0..=6 {
            let gap = end.partition(&values, |value| *value < limit);
            assert_eq!(
                gap.index(),
                values[..end.index()].partition_point(|value| *value < limit)
            );
        }
    }
    assert_eq!(array::Index::<254>::at::<253>().next::<255>().index(), 254);
    assert_eq!(
        array::Index::<1>::at::<0>().insert(&[], 9_u8, &mut mem::MaybeUninit::uninit()),
        &[9]
    );
    let first = array::Index::from(array::Vacancy::<1>::at::<0>());
    assert_eq!(*first.get(&[7]), 7);
    let mut compact = [0; 255];
    let last = array::Index::from(array::Vacancy::<255>::at::<254>());
    *last.get_mut(&mut compact) = 11;
    assert_eq!(compact[254], 11);
}