use arael::refs::{Ref, Vec, Deque, Arena};
use arael::info;
#[derive(Debug)]
#[allow(dead_code)]
struct Pose {
x: f64,
y: f64,
heading: f64,
}
#[derive(Debug)]
struct Observation {
pose: Ref<Pose>,
range: f64,
bearing: f64,
}
#[derive(Debug)]
struct Landmark {
x: f64,
y: f64,
observations: Vec<Observation>,
}
fn main() {
info!("=== Vec basics ===");
info!("");
let mut landmarks: Vec<Landmark> = Vec::new();
let lm0 = landmarks.push(Landmark { x: 5.0, y: 3.0, observations: Vec::new() });
let lm1 = landmarks.push(Landmark { x: -2.0, y: 7.0, observations: Vec::new() });
info!("Landmark 0: ({}, {})", landmarks[lm0].x, landmarks[lm0].y);
info!("Landmark 1: ({}, {})", landmarks[lm1].x, landmarks[lm1].y);
info!("");
info!("=== Deque — sliding window ===");
info!("");
let mut poses: Deque<Pose> = Deque::new();
let p0 = poses.push_back(Pose { x: 0.0, y: 0.0, heading: 0.0 });
let p1 = poses.push_back(Pose { x: 1.0, y: 0.0, heading: 0.1 });
let p2 = poses.push_back(Pose { x: 2.0, y: 0.5, heading: 0.3 });
let p3 = poses.push_back(Pose { x: 3.0, y: 1.0, heading: 0.5 });
info!("Poses in window: {}", poses.len());
info!("Pose p2: {:?}", poses[p2]);
landmarks[lm0].observations.push(Observation { pose: p1, range: 4.5, bearing: 0.6 });
landmarks[lm0].observations.push(Observation { pose: p3, range: 2.1, bearing: -0.2 });
landmarks[lm1].observations.push(Observation { pose: p2, range: 6.0, bearing: 1.1 });
info!("");
info!("Landmark 0 observed from {} poses", landmarks[lm0].observations.len());
for obs in landmarks[lm0].observations.iter() {
info!(" from pose {:?}: range={:.1}, bearing={:.2}", obs.pose, obs.range, obs.bearing);
info!(" pose position: ({}, {})", poses[obs.pose].x, poses[obs.pose].y);
}
info!("");
info!("=== Stale refs ===");
info!("");
info!("Before eviction: {} poses, front={:?} back={:?}",
poses.len(), poses.front_ref(), poses.back_ref());
poses.pop_front(); poses.pop_front();
info!("After eviction: {} poses, front={:?} back={:?}",
poses.len(), poses.front_ref(), poses.back_ref());
info!("");
info!("p2 still valid: contains_ref={}, value={:?}", poses.contains_ref(p2), poses[p2]);
info!("p3 still valid: contains_ref={}, value={:?}", poses.contains_ref(p3), poses[p3]);
info!("");
info!("p0 is stale: contains_ref={}", poses.contains_ref(p0));
info!("p1 is stale: contains_ref={}", poses.contains_ref(p1));
info!("");
info!("get(p0) = {:?}", poses.get(p0));
info!("get(p1) = {:?}", poses.get(p1));
info!("get(p2) = {:?}", poses.get(p2));
info!("");
info!("=== Filtering stale observations ===");
info!("");
let obs = &landmarks[lm0].observations;
for (i, o) in obs.iter().enumerate() {
if poses.contains_ref(o.pose) {
let p = &poses[o.pose];
info!(" obs[{}]: pose ({}, {}) range={:.1}", i, p.x, p.y, o.range);
} else {
info!(" obs[{}]: STALE (pose {:?} was evicted)", i, o.pose);
}
}
info!("");
info!("=== Arena — deletion with stable refs ===");
info!("");
let mut items: Arena<&str> = Arena::new();
let a = items.push("alpha");
let b = items.push("beta");
let c = items.push("gamma");
let d = items.push("delta");
info!("Before deletion: {} items", items.len());
for r in items.refs() {
info!(" {:?} -> {}", r, items[r]);
}
info!("");
info!("Removing {:?} ({})", b, items[b]);
items.remove(b);
info!("After deletion: {} items", items.len());
for r in items.refs() {
info!(" {:?} -> {}", r, items[r]);
}
info!("");
info!("a={}, c={}, d={}", items[a], items[c], items[d]);
info!("contains(b) = {}", items.contains(b));
info!("get(b) = {:?}", items.get(b));
}