sample/
sample.rs

1use easy_bitfield::*;
2
3type A = BitField<u32, bool, 0, 1, false>;
4type B = BitField<u32, i8, { A::NEXT_BIT }, 4, true>;
5type C = BitField<u32, i16, { B::NEXT_BIT }, 16, true>;
6
7fn main() {
8    let mut storage;
9
10    storage = A::encode(true);
11    assert!(A::decode(storage));
12    storage = B::update(-1, storage);
13    assert_eq!(B::decode(storage), -1);
14    storage = B::update(2, storage);
15    assert_eq!(B::decode(storage), 2);
16    assert!(A::decode(storage));
17    assert_eq!(C::decode(storage), 0);
18    assert!(B::is_valid(7));
19    assert!(!B::is_valid(8));
20    assert!(B::is_valid(-8));
21    assert!(!B::is_valid(-9));
22
23    println!("Creating atomic bitfield storage");
24
25    type LockBit = BitField<usize, bool, 0, 1, false>;
26    type DataBits = BitField<usize, u32, { LockBit::NEXT_BIT }, 32, false>;
27
28    let container = std::sync::Arc::new(AtomicBitfieldContainer::new(0usize));
29    println!(
30        "lock bit: {}, data bits: {}",
31        container.read::<LockBit>(),
32        container.read::<DataBits>()
33    );
34    let thread = {
35        let container = container.clone();
36
37        std::thread::spawn(move || {
38            println!("thread 1 spawned");
39            while !container.try_acquire::<LockBit>() {}
40            container.update::<DataBits>(42);
41            println!(
42                "thread 1: set data bits to {}",
43                container.read::<DataBits>()
44            );
45            assert!(container.try_release::<LockBit>());
46        })
47    };
48
49    loop {
50        while !container.try_acquire::<LockBit>() {
51            std::thread::yield_now();
52        }
53        if container.read::<DataBits>() != 0 {
54            println!("data bits is not zero, break");
55            assert_eq!(container.read::<DataBits>(), 42);
56            assert!(container.try_release::<LockBit>());
57            break;
58        }
59
60        println!("data bits is zero, loop");
61
62        assert!(container.try_release::<LockBit>());
63    }
64    println!("{}", container.read::<DataBits>());
65    thread.join().unwrap();
66}