use borrowscope_macro::trace_borrow;
use borrowscope_runtime::*;
#[trace_borrow]
fn default_config() {
let x = vec![1, 2, 3];
for i in &x {
if *i > 1 {
println!("i = {}", i);
}
}
}
#[trace_borrow(quiet)]
fn quiet_mode() {
let x = vec![1, 2, 3];
for i in &x { if *i > 1 { println!("i = {}", i);
}
}
}
#[trace_borrow(skip = "loops")]
fn skip_loops() {
let x = vec![1, 2, 3];
for i in &x { if *i > 1 { println!("i = {}", i);
}
}
}
#[trace_borrow(skip = "branches")]
fn skip_branches() {
let x = vec![1, 2, 3];
for i in &x { if *i > 1 { println!("i = {}", i);
}
}
}
#[trace_borrow(skip = "loops,branches")]
fn skip_loops_and_branches() {
let x = vec![1, 2, 3];
for i in &x { if *i > 1 { println!("i = {}", i);
}
}
}
#[trace_borrow(only = "ownership")]
fn only_ownership() {
let x = vec![1, 2, 3]; let y = x; for i in &y { println!("i = {}", i);
}
}
#[trace_borrow(only = "loops")]
fn only_loops() {
let x = vec![1, 2, 3]; for i in &x { println!("i = {}", i);
}
}
#[trace_borrow(only = "ownership,loops")]
fn only_ownership_and_loops() {
let x = vec![1, 2, 3]; for i in &x { if *i > 1 { println!("i = {}", i);
}
}
}
#[trace_borrow(only = "functions")]
fn only_functions() {
let x = 42; println!("x = {}", x);
}
#[trace_borrow(only = "ownership,functions")]
fn ownership_with_functions() {
let x = String::from("hello"); let y = x; println!("y = {}", y);
}
#[trace_borrow(only = "smart_pointers")]
fn only_smart_pointers() {
use std::rc::Rc;
let x = 42; let rc = Rc::new(x); let rc2 = Rc::clone(&rc); println!("rc: {}, rc2: {}", rc, rc2);
}
#[trace_borrow(only = "methods")]
fn only_methods() {
let s = String::from("hello");
let s2 = s.clone();
let opt = Some(42);
let v = opt.unwrap();
println!("s2: {}, v: {}", s2, v);
}
#[trace_borrow(only = "try")]
fn only_try() -> Option<i32> {
let a = Some(10);
let b = Some(20);
let x = a?; let y = b?;
Some(x + y)
}
#[trace_borrow(only = "unsafe")]
fn only_unsafe() {
let x = 42;
unsafe { let ptr = &x as *const i32;
println!("Value: {}", *ptr);
} }
#[trace_borrow(only = "expressions")]
fn only_expressions() {
let p = (1, 2, 3); let arr = [1, 2, 3]; let r = 0..10; let x = 42i32 as i64;
println!("{:?}, {:?}, {:?}, {}", p, arr, r, x);
}
#[trace_borrow(only = "async")]
async fn only_async() {
println!("Async function");
}
#[trace_borrow(only = "control_flow")]
fn only_control_flow() {
for i in 0..5 {
if i == 2 {
continue; }
if i == 4 {
break; }
println!("i = {}", i);
}
}
fn main() {
println!("=== Default Config ===");
reset();
default_config();
print_events("default_config");
println!("\n=== Quiet Mode ===");
reset();
quiet_mode();
print_events("quiet_mode");
println!("\n=== Skip Loops ===");
reset();
skip_loops();
print_events("skip_loops");
println!("\n=== Skip Branches ===");
reset();
skip_branches();
print_events("skip_branches");
println!("\n=== Skip Loops and Branches ===");
reset();
skip_loops_and_branches();
print_events("skip_loops_and_branches");
println!("\n=== Only Ownership ===");
reset();
only_ownership();
print_events("only_ownership");
println!("\n=== Only Loops ===");
reset();
only_loops();
print_events("only_loops");
println!("\n=== Only Ownership and Loops ===");
reset();
only_ownership_and_loops();
print_events("only_ownership_and_loops");
println!("\n=== Only Functions ===");
reset();
only_functions();
print_events("only_functions");
println!("\n=== Ownership with Functions ===");
reset();
ownership_with_functions();
print_events("ownership_with_functions");
println!("\n=== Only Smart Pointers ===");
reset();
only_smart_pointers();
print_events("only_smart_pointers");
println!("\n=== Only Methods ===");
reset();
only_methods();
print_events("only_methods");
println!("\n=== Only Try ===");
reset();
let _ = only_try();
print_events("only_try");
println!("\n=== Only Unsafe ===");
reset();
only_unsafe();
print_events("only_unsafe");
println!("\n=== Only Expressions ===");
reset();
only_expressions();
print_events("only_expressions");
println!("\n=== Only Control Flow ===");
reset();
only_control_flow();
print_events("only_control_flow");
}
fn print_events(name: &str) {
let events = get_events();
println!("{} generated {} events:", name, events.len());
for (i, event) in events.iter().enumerate() {
println!(" {}: {:?}", i + 1, event);
}
}