use borrowscope_macro::trace_borrow;
use borrowscope_runtime::*;
use std::cell::OnceCell;
use std::sync::OnceLock;
#[trace_borrow]
fn once_cell_demo() {
let config: OnceCell<String> = OnceCell::new();
let _value = config.get();
let _ = config.set(String::from("initialized"));
let _value = config.get();
let _ = config.set(String::from("second"));
}
#[trace_borrow]
fn once_lock_demo() {
let counter: OnceLock<i32> = OnceLock::new();
let _ = counter.set(42);
let _value = counter.get();
}
#[trace_borrow]
fn get_or_init_demo() {
let lazy: OnceCell<Vec<i32>> = OnceCell::new();
let _data = lazy.get_or_init(|| vec![1, 2, 3]);
let _data = lazy.get_or_init(|| vec![4, 5, 6]);
}
fn main() {
reset();
println!("=== OnceCell/OnceLock Macro Tracking Demo ===\n");
println!("--- OnceCell Demo ---");
once_cell_demo();
println!("\n--- OnceLock Demo ---");
once_lock_demo();
println!("\n--- get_or_init Demo ---");
get_or_init_demo();
println!("\n=== Tracked Events ===");
for event in get_events() {
println!("{:?}", event);
}
let events = get_events();
let once_cell_events: Vec<_> = events.iter().filter(|e| e.is_once_cell()).collect();
println!("\n=== Summary ===");
println!("Total events: {}", events.len());
println!("OnceCell/OnceLock events: {}", once_cell_events.len());
}