#[derive(Debug)]
pub(super) struct RecencyStacks {
stacks: Vec<Vec<usize>>,
}
impl RecencyStacks {
pub(super) fn new(sets: usize, ways: usize) -> Self {
Self { stacks: (0..sets).map(|_| (0..ways).collect()).collect() }
}
pub(super) fn touch(&mut self, set: usize, way: usize) {
let stack = &mut self.stacks[set];
if let Some(pos) = stack.iter().position(|&x| x == way) {
let _ = stack.remove(pos);
}
stack.insert(0, way);
}
pub(super) fn most_recent(&self, set: usize) -> usize {
self.stacks[set].first().copied().unwrap_or(0)
}
pub(super) fn least_recent(&self, set: usize) -> usize {
self.stacks[set].last().copied().unwrap_or(0)
}
}