use plugmem_arena::{Arena, ArenaCfg, Error, ShardMode, Slot, key};
#[derive(Debug, PartialEq)]
struct Event {
ts: u64,
id: u32,
severity: u32,
}
impl Slot for Event {
const SIZE: usize = 16;
const KEY_LEN: usize = 12;
fn write(&self, out: &mut [u8]) {
key::write_pair(out, self.ts, self.id);
key::write_u32(&mut out[12..], self.severity);
}
fn read(bytes: &[u8]) -> Self {
let (ts, id) = key::read_pair(bytes);
Event {
ts,
id,
severity: key::read_u32(&bytes[12..]),
}
}
}
fn event_key(ts: u64, id: u32) -> [u8; 12] {
let mut k = [0u8; 12];
key::write_pair(&mut k, ts, id);
k
}
fn main() -> Result<(), Error> {
let cfg = ArenaCfg::new(64, ShardMode::Ordered).with_max_bytes(1 << 20);
let mut log = Arena::<Event>::new(cfg)?;
for (ts, id, severity) in [
(1_700_000_300_000, 1, 2),
(1_700_000_100_000, 1, 5),
(1_700_000_200_000, 1, 1),
(1_700_000_100_000, 0, 4), ] {
let inserted = log.insert(&Event { ts, id, severity })?;
assert!(inserted);
}
let dup = log.insert(&Event {
ts: 1_700_000_100_000,
id: 1,
severity: 9,
})?;
assert!(!dup);
assert_eq!(log.len(), 4);
let k = event_key(1_700_000_200_000, 1);
assert_eq!(log.get(&k).unwrap().severity, 1);
key::write_u32(log.payload_mut(&k).unwrap(), 7);
assert_eq!(log.get(&k).unwrap().severity, 7);
println!("chronological log:");
for event in &log {
println!(
" ts={} id={} severity={}",
event.ts, event.id, event.severity
);
}
let times: Vec<(u64, u32)> = log.iter().map(|e| (e.ts, e.id)).collect();
assert!(times.windows(2).all(|w| w[0] < w[1]));
assert!(log.remove(&k));
assert_eq!(log.len(), 3);
println!("pool bytes in use: {}", log.pool_bytes());
Ok(())
}