bit_field 0.6.0

Simple bit field trait providing get_bit, get_range, set_bit, and set_range methods for unsigned integers.
Documentation
use BitField;

#[test]
fn test_set_reset_u8() {
    let mut field = 0b11110010u8;
    let mut bit_i = |i| {
        field.set_bit(i, true);
        assert_eq!(field.get_bit(i), true);
        field.set_bit(i, false);
        assert_eq!(field.get_bit(i), false);
        field.set_bit(i, true);
        assert_eq!(field.get_bit(i), true);
    };
    for i in 0..8 {
        bit_i(i);
    }
}

#[test]
fn test_set_reset_u16() {
    let mut field = 0b1111001010010110u16;
    let mut bit_i = |i| {
        field.set_bit(i, true);
        assert_eq!(field.get_bit(i), true);
        field.set_bit(i, false);
        assert_eq!(field.get_bit(i), false);
        field.set_bit(i, true);
        assert_eq!(field.get_bit(i), true);
    };
    for i in 0..16 {
        bit_i(i);
    }
}

#[test]
fn test_read_u32() {
    let field = 0b1111111111010110u32;
    assert_eq!(field.get_bit(0), false);
    assert_eq!(field.get_bit(1), true);
    assert_eq!(field.get_bit(2), true);
    assert_eq!(field.get_bit(3), false);
    assert_eq!(field.get_bit(4), true);
    assert_eq!(field.get_bit(5), false);
    for i in 6..16 {
        assert_eq!(field.get_bit(i), true);
    }
    for i in 16..32 {
        assert_eq!(field.get_bit(i), false);
    }

    assert_eq!(field.get_range(16..32), 0);
    assert_eq!(field.get_range(6..16), 0b1111111111);
    assert_eq!(field.get_range(0..6), 0b010110);
    assert_eq!(field.get_range(0..10), 0b1111010110);
    assert_eq!(field.get_range(5..12), 0b1111110);
}

#[test]
fn test_set_reset_u32() {
    let mut field = 0b1111111111010110u32;
    let mut bit_i = |i| {
        field.set_bit(i, true);
        assert_eq!(field.get_bit(i), true);
        field.set_bit(i, false);
        assert_eq!(field.get_bit(i), false);
        field.set_bit(i, true);
        assert_eq!(field.get_bit(i), true);
    };
    for i in 0..32 {
        bit_i(i);
    }
}

#[test]
fn test_set_range_u32() {
    let mut field = 0b1111111111010110u32;
    field.set_range(10..15, 0b00000);
    assert_eq!(field.get_range(10..15), 0b00000);
    field.set_range(10..15, 0b10101);
    assert_eq!(field.get_range(10..15), 0b10101);
    field.set_range(10..15, 0b01010);
    assert_eq!(field.get_range(10..15), 0b01010);
    field.set_range(10..15, 0b11111);
    assert_eq!(field.get_range(10..15), 0b11111);

    field.set_range(0..16, 0xdead);
    field.set_range(14..32, 0xbeaf);
    assert_eq!(field.get_range(0..16), 0xdead);
    assert_eq!(field.get_range(14..32), 0xbeaf);
}

#[test]
fn test_read_u64() {
    let field = 0b1111111111010110u64 << 32;
    for i in 0..32 {
        assert_eq!(field.get_bit(i), false);
    }
    assert_eq!(field.get_bit(32), false);
    assert_eq!(field.get_bit(33), true);
    assert_eq!(field.get_bit(34), true);
    assert_eq!(field.get_bit(35), false);
    assert_eq!(field.get_bit(36), true);
    assert_eq!(field.get_bit(37), false);
    for i in 38..48 {
        assert_eq!(field.get_bit(i), true);
    }
    for i in 48..64 {
        assert_eq!(field.get_bit(i), false);
    }

    assert_eq!(field.get_range(0..32), 0);
    assert_eq!(field.get_range(48..64), 0);
    assert_eq!(field.get_range(38..48), 0b1111111111);
    assert_eq!(field.get_range(32..38), 0b010110);
    assert_eq!(field.get_range(32..42), 0b1111010110);
    assert_eq!(field.get_range(37..44), 0b1111110);
}

#[test]
fn test_set_reset_u64() {
    let mut field = 0b1111111111010110u64 << 32;
    let mut bit_i = |i| {
        field.set_bit(i, true);
        assert_eq!(field.get_bit(i), true);
        field.set_bit(i, false);
        assert_eq!(field.get_bit(i), false);
        field.set_bit(i, true);
        assert_eq!(field.get_bit(i), true);
    };
    for i in 0..64 {
        bit_i(i);
    }
}

#[test]
fn test_set_range_u64() {
    let mut field = 0b1111111111010110u64 << 32;
    field.set_range(42..47, 0b00000);
    assert_eq!(field.get_range(42..47), 0b00000);
    field.set_range(10..15, 0b10101);
    assert_eq!(field.get_range(10..15), 0b10101);
    field.set_range(40..45, 0b01010);
    assert_eq!(field.get_range(40..45), 0b01010);
    field.set_range(40..45, 0b11111);
    assert_eq!(field.get_range(40..45), 0b11111);

    field.set_range(0..16, 0xdead);
    field.set_range(14..32, 0xbeaf);
    field.set_range(32..64, 0xcafebabe);
    assert_eq!(field.get_range(0..16), 0xdead);
    assert_eq!(field.get_range(14..32), 0xbeaf);
    assert_eq!(field.get_range(32..64), 0xcafebabe);
}