use std::collections::HashMap;
pub const MAX_INLINE_CAPACITY: usize = 128;
#[derive(Debug)]
pub struct SparseFieldMap<V> {
inline: Box<[Option<V>]>,
overflow: HashMap<i32, V>,
}
impl<V> SparseFieldMap<V> {
#[inline(always)]
pub fn new(max_field_num: i32) -> Self {
let inline_size = ((max_field_num + 1) as usize).min(MAX_INLINE_CAPACITY);
Self {
inline: (0..inline_size)
.map(|_| None)
.collect::<Vec<_>>()
.into_boxed_slice(),
overflow: HashMap::new(),
}
}
#[inline(always)]
pub fn insert(&mut self, field_num: i32, value: V) -> Option<V> {
let idx = field_num as usize;
if idx < self.inline.len() {
self.inline[idx].replace(value)
} else {
self.overflow.insert(field_num, value)
}
}
#[inline(always)]
pub fn get(&self, field_num: i32) -> Option<&V> {
let idx = field_num as usize;
if idx < self.inline.len() {
self.inline[idx].as_ref()
} else {
self.overflow.get(&field_num)
}
}
}