use sparsemap::SparseMap;
fn main() {
const SLOTS: u64 = 1_000_000;
let mut free = SparseMap::new();
free.insert_range(0, SLOTS);
println!(
"free slots: {} (stored compactly as one run)",
free.cardinality()
);
let mut allocated = SparseMap::new();
allocated.insert_range(0, 200_000);
for s in (500_000..500_000 + 100_000).step_by(3) {
allocated.insert(s);
}
free -= &allocated;
println!("after allocation, free slots: {}", free.cardinality());
println!("lowest free slot: {:?}", free.min());
println!("highest free slot: {:?}", free.max());
match free.span(0, 4096, true) {
Some(start) => println!("first 4096-slot free run starts at {start}"),
None => println!("no 4096-slot free run"),
}
println!("50,000th free slot: {:?}", free.select(50_000));
let bytes = free.to_bytes();
println!("serialized free list: {} bytes", bytes.len());
let reloaded = SparseMap::from_bytes(&bytes).expect("round-trips");
assert_eq!(reloaded, free);
println!("reloaded and verified equal");
}