use brk_types::TxidPrefix;
use rustc_hash::FxHashMap;
use crate::{entry::Entry, types::TxIndex};
#[derive(Default)]
pub struct EntryPool {
entries: Vec<Option<Entry>>,
prefix_to_idx: FxHashMap<TxidPrefix, TxIndex>,
free_slots: Vec<TxIndex>,
}
impl EntryPool {
pub fn insert(&mut self, prefix: TxidPrefix, entry: Entry) -> TxIndex {
let idx = match self.free_slots.pop() {
Some(idx) => {
self.entries[idx.as_usize()] = Some(entry);
idx
}
None => {
let idx = TxIndex::from(self.entries.len());
self.entries.push(Some(entry));
idx
}
};
self.prefix_to_idx.insert(prefix, idx);
idx
}
pub fn get(&self, prefix: &TxidPrefix) -> Option<&Entry> {
let idx = self.prefix_to_idx.get(prefix)?;
self.entries.get(idx.as_usize())?.as_ref()
}
pub fn remove(&mut self, prefix: &TxidPrefix) {
if let Some(idx) = self.prefix_to_idx.remove(prefix) {
if let Some(slot) = self.entries.get_mut(idx.as_usize()) {
*slot = None;
}
self.free_slots.push(idx);
}
}
pub fn entries(&self) -> &[Option<Entry>] {
&self.entries
}
}