ach-util 0.2.5

Atomic Channel
Documentation
use ach_util::{AtomicMemoryRing, MemoryRing, MemoryState};

#[test]
fn test() {
    assert!(AtomicMemoryRing::is_lock_free());

    let mut cycle = MemoryRing::new(0, MemoryState::Uninitialized);
    assert_eq!(cycle.cycle(), 0);
    assert!(cycle.state().is_uninitialized());

    cycle.set_cycle(1);
    assert_eq!(cycle.cycle(), 1);
    cycle.set_cycle(MemoryRing::max_cycle());
    assert_eq!(cycle.cycle(), 0);
    cycle.set_state(MemoryState::Initialized);
    assert!(cycle.state().is_initialized());

    cycle.set_cycle(MemoryRing::max_cycle() - 1);
    cycle.set_state(MemoryState::Erasing);
    let cycle_next = cycle.next();
    assert_eq!(cycle_next.cycle(), 0);
    assert!(cycle_next.state().is_uninitialized());
    assert!(cycle_next > cycle);

    assert!(
        MemoryRing::new(0, MemoryState::Uninitialized)
            < MemoryRing::new(0, MemoryState::Initializing)
    );
    assert!(
        MemoryRing::new(0, MemoryState::Initializing)
            < MemoryRing::new(0, MemoryState::Initialized)
    );
    assert!(
        MemoryRing::new(0, MemoryState::Initialized) < MemoryRing::new(0, MemoryState::Erasing)
    );
    assert!(
        MemoryRing::new(0, MemoryState::Erasing) < MemoryRing::new(1, MemoryState::Uninitialized)
    );
}