#[cfg(all(feature = "alloc", feature = "set"))]
use bstack::{BStack, BStackAllocator, FirstFitBStackAllocator};
#[cfg(all(feature = "alloc", feature = "set"))]
use std::io;
#[cfg(all(feature = "alloc", feature = "set"))]
fn main() -> io::Result<()> {
let path = "alloc_basic_example.bstack";
let start: u64;
{
let alloc = FirstFitBStackAllocator::new(BStack::open(path)?)?;
let a = alloc.alloc(16)?;
start = a.start();
println!("allocated 16 bytes at offset {start}");
a.write(b"Hello, allocator")?;
println!("wrote: {:?}", String::from_utf8_lossy(&a.read()?));
let a = alloc.realloc(a, 32)?;
assert_eq!(a.start(), start); let data = a.read()?;
assert_eq!(&data[..16], b"Hello, allocator");
assert_eq!(&data[16..], &[0u8; 16]);
println!("realloced to 32 bytes at offset {}", a.start());
let b = alloc.alloc(16)?;
println!("allocated second block at offset {}", b.start());
alloc.dealloc(a)?;
println!("freed first block");
let c = alloc.alloc(16)?;
println!("reused slot at offset {} (expected {start})", c.start());
assert_eq!(c.start(), start);
let _ = c;
let _ = b;
drop(alloc.into_stack());
}
{
let alloc = FirstFitBStackAllocator::new(BStack::open(path)?)?;
let d = alloc.alloc(24)?;
d.write(b"persisted across reopens")?;
println!(
"session 2 alloc at offset {}; data: {:?}",
d.start(),
String::from_utf8_lossy(&d.read()?)
);
let _ = d;
drop(alloc.into_stack());
}
std::fs::remove_file(path).ok();
Ok(())
}
#[cfg(not(all(feature = "alloc", feature = "set")))]
fn main() {
println!("This example requires the 'alloc' and 'set' features.");
}