#[path = "common/mod.rs"]
mod common;
use interweave::{Atomic, World};
fn lastzero(world: &mut World, n: usize) {
let cells: Vec<Atomic<i32>> = (0..=n).map(|i| world.atomic(format!("a{i}"), 0)).collect();
let scan = cells.clone();
world.spawn("reader", async move {
let mut i = n;
while scan[i].load().await != 0 && i > 0 {
i -= 1;
}
Ok(())
});
for j in 1..=n {
let (prev, cur) = (cells[j - 1].clone(), cells[j].clone());
world.spawn(format!("writer-{j}"), async move {
let v = prev.load().await;
cur.store(v + 1).await;
Ok(())
});
}
}
fn main() {
let n = common::size(5);
assert!(n >= 2, "lastzero needs N >= 2");
let counts = common::explore_counts(move |w| lastzero(w, n));
let expected = (n + 3) * (1usize << (n - 2));
println!(
"lastzero({n}): traces={} (expected {expected}), states={}",
counts.traces, counts.states,
);
}