use std::cell::UnsafeCell;
use fnv::FnvHashMap;
pub struct FastCellMap<'a, TKey, TValue> {
value: UnsafeCell<FnvHashMap<TKey, &'a TValue>>,
}
impl<'a, TKey, TValue> FastCellMap<'a, TKey, TValue> where TKey : std::cmp::Eq + std::hash::Hash + Clone {
pub fn new() -> FastCellMap<'a, TKey, TValue> {
FastCellMap {
value: UnsafeCell::new(FnvHashMap::default()),
}
}
pub fn replace_map(&mut self, new_map: FnvHashMap<TKey, &'a TValue>) {
self.value = UnsafeCell::new(new_map);
}
pub fn contains_key(&self, key: &TKey) -> bool {
unsafe {
(*self.value.get()).contains_key(key)
}
}
pub fn insert(&self, key: TKey, value: &'a TValue) {
unsafe {
(*self.value.get()).insert(key, value);
}
}
pub fn remove(&self, key: &TKey) -> Option<&'a TValue> {
unsafe {
(*self.value.get()).remove(key)
}
}
pub fn clone_map(&self) -> FnvHashMap<TKey, &'a TValue> {
unsafe {
(*self.value.get()).clone()
}
}
#[cfg(debug_assertions)]
pub fn get_any_item(&self) -> Option<&'a TValue> {
unsafe {
(*self.value.get()).iter().map(|(_, b)| b.clone()).next()
}
}
}