use std::borrow::Borrow;
use std::collections::btree_map::{self, BTreeMap};
use std::collections::hash_map::{self, HashMap};
use std::hash::BuildHasher;
use crate::store::item::{Key, Value};
use crate::store::{Store, StoreMut, StoreMutRef};
mod iter;
impl<K, V, S> Store<K, V> for HashMap<K, V, S>
where
K: Key,
S: BuildHasher,
{
#[inline]
fn get<Q>(&self, key: &Q) -> Option<&V>
where
K: Borrow<Q>,
Q: Key,
{
HashMap::get(self, key)
}
#[inline]
fn contains_key<Q>(&self, key: &Q) -> bool
where
K: Borrow<Q>,
Q: Key,
{
HashMap::contains_key(self, key)
}
#[inline]
fn len(&self) -> usize {
HashMap::len(self)
}
}
impl<K, V, S> StoreMut<K, V> for HashMap<K, V, S>
where
K: Key,
V: Value,
S: BuildHasher,
{
#[inline]
fn insert(&mut self, key: K, value: V) -> Option<V> {
match HashMap::entry(self, key) {
hash_map::Entry::Vacant(entry) => {
entry.insert(value);
None
}
hash_map::Entry::Occupied(mut entry) => {
if entry.get() == &value {
None
} else {
Some(entry.insert(value))
}
}
}
}
#[inline]
fn remove<Q>(&mut self, key: &Q) -> Option<V>
where
K: Borrow<Q>,
Q: Key,
{
HashMap::remove(self, key)
}
#[inline]
fn remove_entry<Q>(&mut self, key: &Q) -> Option<(K, V)>
where
K: Borrow<Q>,
Q: Key,
{
HashMap::remove_entry(self, key)
}
#[inline]
fn clear(&mut self) {
HashMap::clear(self);
}
}
impl<K, V, S> StoreMutRef<K, V> for HashMap<K, V, S>
where
K: Key,
S: BuildHasher,
{
#[inline]
fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
where
K: Borrow<Q>,
Q: Key,
{
HashMap::get_mut(self, key)
}
#[inline]
fn get_or_insert_default(&mut self, key: &K) -> &mut V
where
V: Default,
{
HashMap::entry(self, key.clone()).or_default()
}
}
impl<K, V> Store<K, V> for BTreeMap<K, V>
where
K: Key,
{
#[inline]
fn get<Q>(&self, key: &Q) -> Option<&V>
where
K: Borrow<Q>,
Q: Key,
{
BTreeMap::get(self, key)
}
#[inline]
fn contains_key<Q>(&self, key: &Q) -> bool
where
K: Borrow<Q>,
Q: Key,
{
BTreeMap::contains_key(self, key)
}
#[inline]
fn len(&self) -> usize {
BTreeMap::len(self)
}
}
impl<K, V> StoreMut<K, V> for BTreeMap<K, V>
where
K: Key,
V: Value,
{
#[inline]
fn insert(&mut self, key: K, value: V) -> Option<V> {
match BTreeMap::entry(self, key) {
btree_map::Entry::Vacant(entry) => {
entry.insert(value);
None
}
btree_map::Entry::Occupied(mut entry) => {
if entry.get() == &value {
None
} else {
Some(entry.insert(value))
}
}
}
}
#[inline]
fn remove<Q>(&mut self, key: &Q) -> Option<V>
where
K: Borrow<Q>,
Q: Key,
{
BTreeMap::remove(self, key)
}
#[inline]
fn remove_entry<Q>(&mut self, key: &Q) -> Option<(K, V)>
where
K: Borrow<Q>,
Q: Key,
{
BTreeMap::remove_entry(self, key)
}
#[inline]
fn clear(&mut self) {
BTreeMap::clear(self);
}
}
impl<K, V> StoreMutRef<K, V> for BTreeMap<K, V>
where
K: Key,
{
#[inline]
fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
where
K: Borrow<Q>,
Q: Key,
{
BTreeMap::get_mut(self, key)
}
#[inline]
fn get_or_insert_default(&mut self, key: &K) -> &mut V
where
V: Default,
{
BTreeMap::entry(self, key.clone()).or_default()
}
}