ecore 0.10.0

no_std bit-level integer types, bitfield structs/enums, ranged integers, and enum maps
Documentation
type BitsRange = ecore::range::BitsRange<usize>;

#[test]
fn copy_le_bits() {
    let src = [0xFF; size_of::<usize>()];
    for offset in 0..=7 {
        for i in 1..=usize::BITS - offset {
            let mut tgt = [0; size_of::<usize>()];
            assert!(BitsRange::new(offset, i).unwrap().copy_le_bits(&src, &mut tgt).is_ok());
            assert_eq!(&tgt, &(usize::MAX >> (usize::BITS - i) << offset).to_le_bytes());
        }
    }
    let src = [0; size_of::<usize>()];
    for offset in 0..=7 {
        for i in 1..=usize::BITS - offset {
            let mut tgt = [0xFF; size_of::<usize>()];
            assert!(BitsRange::new(offset, i).unwrap().copy_le_bits(&src, &mut tgt).is_ok());
            assert_eq!(&tgt, &(!(usize::MAX >> (usize::BITS - i) << offset)).to_le_bytes());
        }
    }
}

#[test]
fn copy_be_bits() {
    let src = [0xFF; size_of::<usize>()];
    for offset in 0..=7 {
        for i in 1..=usize::BITS - offset {
            let mut tgt = [0; size_of::<usize>()];
            assert!(BitsRange::new(offset, i).unwrap().copy_be_bits(&src, &mut tgt).is_ok());
            assert_eq!(&tgt, &(usize::MAX >> (usize::BITS - i) << offset).to_be_bytes());
        }
    }
    let src = [0; size_of::<usize>()];
    for offset in 0..=7 {
        for i in 1..=usize::BITS - offset {
            let mut tgt = [0xFF; size_of::<usize>()];
            assert!(BitsRange::new(offset, i).unwrap().copy_be_bits(&src, &mut tgt).is_ok());
            assert_eq!(&tgt, &(!(usize::MAX >> (usize::BITS - i) << offset)).to_be_bytes());
        }
    }
}