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}