use abfall::GcContext;
fn main() {
println!("=== Abfall Garbage Collector Demo ===\n");
println!("Example 1: Basic Allocation");
basic_allocation();
println!();
println!("Example 2: Manual Collection");
manual_collection();
println!();
println!("Example 3: Memory Pressure and Collection");
memory_pressure();
println!();
}
fn basic_allocation() {
let ctx = GcContext::new();
let number = ctx.allocate(42);
let text = ctx.allocate("Hello, World!");
let vector = ctx.allocate(vec![1, 2, 3, 4, 5]);
println!(" Number: {}", *number);
println!(" Text: {}", *text);
println!(" Vector: {:?}", *vector);
println!(" Allocations: {}", ctx.heap().allocation_count());
}
fn manual_collection() {
let ctx = GcContext::new();
println!(" Allocating 5 objects...");
let ptr1 = ctx.allocate(1);
let _ptr2 = ctx.allocate(2);
let _ptr3 = ctx.allocate(3);
let _ptr4 = ctx.allocate(4);
let _ptr5 = ctx.allocate(5);
println!(
" Before collection: {} allocations, {} bytes",
ctx.heap().allocation_count(),
ctx.heap().bytes_allocated()
);
drop(_ptr2);
drop(_ptr3);
drop(_ptr4);
drop(_ptr5);
println!(
" After drops (before GC): {} allocations",
ctx.heap().allocation_count()
);
ctx.collect();
println!(
" After collection: {} allocations, {} bytes",
ctx.heap().allocation_count(),
ctx.heap().bytes_allocated()
);
println!(" ptr1 still alive: {}", *ptr1);
}
fn memory_pressure() {
let ctx = GcContext::new();
println!(" Allocating many objects...");
let mut live_objects = Vec::new();
for i in 0..1000 {
let ptr = ctx.allocate(vec![i; 100]); if i % 100 == 0 {
live_objects.push(ptr); }
}
println!(
" Before collection: {} allocations, {} bytes",
ctx.heap().allocation_count(),
ctx.heap().bytes_allocated()
);
ctx.collect();
println!(
" After collection: {} allocations, {} bytes",
ctx.heap().allocation_count(),
ctx.heap().bytes_allocated()
);
println!(" Live objects kept: {}", live_objects.len());
}