gen_map 0.2.2

This crate provides customizable generational maps.
Documentation
use crate::KeyPiece;
use core::num::NonZero;

#[test]
fn wrapping_add_adds_and_wraps_like_the_integers() {
    assert_eq!(KeyPiece::wrapping_add(1u8, 2), 3);
    assert_eq!(KeyPiece::wrapping_add(u8::MAX, 1), 0);
    assert_eq!(KeyPiece::wrapping_add(u16::MAX, 2), 1);
    assert_eq!(KeyPiece::wrapping_add(u32::MAX - 1, 1), u32::MAX);
    assert_eq!(KeyPiece::wrapping_add(u64::MAX, 1), 0);
    assert_eq!(KeyPiece::wrapping_add(u128::MAX, 1), 0);
    assert_eq!(KeyPiece::wrapping_add(usize::MAX, 1), 0);
}

#[test]
fn the_largest_value_is_odd_so_an_even_value_plus_one_fits() {
    fn check<P: KeyPiece>(even: P) {
        assert!(!even.is_odd());
        assert_eq!(even.checked_add(P::ONE), Some(even.wrapping_add(P::ONE)));
    }
    check(0u8);
    check(254u8);
    check(u16::MAX - 1);
    check(u32::MAX - 1);
    check(u64::MAX - 1);
    check(u128::MAX - 1);
    check(usize::MAX - 1);
}

#[test]
fn into_usize_unchecked_agrees_with_into_usize() {
    for v in [0u8, 1, 200, u8::MAX] {
        assert_eq!(unsafe { v.into_usize_unchecked() }, v.into_usize().unwrap());
    }
    for v in [0u64, 1, 1 << 40, usize::MAX as u64] {
        assert_eq!(unsafe { v.into_usize_unchecked() }, v.into_usize().unwrap());
    }
    let v = usize::MAX as u128;
    assert_eq!(unsafe { v.into_usize_unchecked() }, usize::MAX);
}

#[test]
fn from_usize_unchecked_agrees_with_from_usize() {
    for v in [0usize, 1, 255] {
        assert_eq!(
            unsafe { u8::from_usize_unchecked(v) },
            u8::from_usize(v).unwrap()
        );
    }
    for v in [0usize, 65_535, usize::MAX] {
        assert_eq!(unsafe { u128::from_usize_unchecked(v) }, v as u128);
        assert_eq!(unsafe { usize::from_usize_unchecked(v) }, v);
    }
}

#[test]
fn into_non_zero_unchecked_agrees_with_into_non_zero() {
    assert_eq!(
        unsafe { 1u8.into_non_zero_unchecked() },
        NonZero::new(1).unwrap()
    );
    assert_eq!(
        unsafe { u8::MAX.into_non_zero_unchecked() },
        NonZero::new(u8::MAX).unwrap()
    );
    assert_eq!(
        unsafe { 7u32.into_non_zero_unchecked() },
        7u32.into_non_zero().unwrap()
    );
    assert_eq!(
        unsafe { u128::MAX.into_non_zero_unchecked() },
        NonZero::new(u128::MAX).unwrap()
    );
    assert_eq!(
        u32::from_non_zero(unsafe { 9u32.into_non_zero_unchecked() }),
        9
    );
}

#[test]
fn the_conversions_round_trip() {
    fn check<P: KeyPiece>(v: P) {
        let position = unsafe { v.into_usize_unchecked() };
        assert_eq!(unsafe { P::from_usize_unchecked(position) }, v);
        assert_eq!(P::from_usize(position), Some(v));
    }
    check(0u8);
    check(u8::MAX);
    check(u16::MAX);
    check(u32::MAX);
    check(usize::MAX);
}