use std::collections::hash_map::RandomState;
use std::hash::{BuildHasher, Hash};
use std::sync::atomic::AtomicBool;
const DEFAULT_CAPACITY: usize = 64;
pub struct HashIndex<K, V, H>
where
K: Clone + Eq + Hash + Sync,
V: Clone + Sync,
H: BuildHasher,
{
_array: Option<(K, V)>,
_minimum_capacity: usize,
_resize_mutex: AtomicBool,
build_hasher: H,
}
impl<K, V> Default for HashIndex<K, V, RandomState>
where
K: Clone + Eq + Hash + Sync,
V: Clone + Sync,
{
fn default() -> Self {
HashIndex {
_array: None,
_minimum_capacity: DEFAULT_CAPACITY,
_resize_mutex: AtomicBool::new(false),
build_hasher: RandomState::new(),
}
}
}
impl<K, V, H> HashIndex<K, V, H>
where
K: Clone + Eq + Hash + Sync,
V: Clone + Sync,
H: BuildHasher,
{
pub fn new(capacity: usize, build_hasher: H) -> HashIndex<K, V, H> {
let initial_capacity = capacity.max(DEFAULT_CAPACITY);
HashIndex {
_array: None,
_minimum_capacity: initial_capacity,
_resize_mutex: AtomicBool::new(false),
build_hasher,
}
}
pub fn insert(&self, key: K, value: V) -> Result<(), (K, V)> {
Err((key, value))
}
pub fn remove(&self, _tkey: &K) -> bool {
false
}
pub fn read<R, F: FnOnce(&K, &V) -> R>(&self, _key: &K, _f: F) -> Option<R> {
None
}
pub fn retain<F: Fn(&K, &V) -> bool>(&self, _f: F) -> (usize, usize) {
(0, 0)
}
pub fn clear(&self) -> usize {
self.retain(|_, _| false).1
}
pub fn len<F: FnOnce(usize) -> usize>(&self, _f: F) -> usize {
0
}
pub fn capacity(&self) -> usize {
0
}
pub fn hasher(&self) -> &H {
&self.build_hasher
}
pub fn iter(&self) -> Visitor<K, V, H> {
Visitor { _hash_index: self }
}
}
impl<K, V, H> Drop for HashIndex<K, V, H>
where
K: Clone + Eq + Hash + Sync,
V: Clone + Sync,
H: BuildHasher,
{
fn drop(&mut self) {}
}
pub struct Visitor<'h, K, V, H>
where
K: Clone + Eq + Hash + Sync,
V: Clone + Sync,
H: BuildHasher,
{
_hash_index: &'h HashIndex<K, V, H>,
}
impl<'h, K, V, H> Iterator for Visitor<'h, K, V, H>
where
K: Clone + Eq + Hash + Sync,
V: Clone + Sync,
H: BuildHasher,
{
type Item = (&'h K, &'h V);
fn next(&mut self) -> Option<Self::Item> {
None
}
}