use alloc::vec::Vec;
use crate::modifier::Modifier;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[non_exhaustive]
pub enum Verdict {
#[default]
Unknown,
Ok,
Rejected,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Key {
crtc: u32,
plane: u32,
fourcc: u32,
modifier: Modifier,
}
#[derive(Debug, Clone, Default)]
pub struct ModifierProbeCache {
entries: Vec<(Key, bool)>,
}
impl ModifierProbeCache {
#[must_use]
pub const fn new() -> Self {
Self {
entries: Vec::new(),
}
}
#[must_use]
pub fn lookup(&self, crtc: u32, plane: u32, fourcc: u32, modifier: Modifier) -> Verdict {
let key = Key {
crtc,
plane,
fourcc,
modifier,
};
self.entries
.iter()
.find(|(k, _)| *k == key)
.map_or(Verdict::Unknown, |(_, ok)| {
if *ok { Verdict::Ok } else { Verdict::Rejected }
})
}
pub fn record(&mut self, crtc: u32, plane: u32, fourcc: u32, modifier: Modifier, ok: bool) {
let key = Key {
crtc,
plane,
fourcc,
modifier,
};
if let Some(entry) = self.entries.iter_mut().find(|(k, _)| *k == key) {
entry.1 = ok;
} else {
self.entries.push((key, ok));
}
}
pub fn invalidate_plane(&mut self, plane: u32) {
self.entries.retain(|(k, _)| k.plane != plane);
}
#[must_use]
pub fn len(&self) -> usize {
self.entries.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.entries.is_empty()
}
}