use crate::values::ValuesInner;
use crate::{inner::Inner, values::Values, Aliased};
use left_right::ReadGuard;
use std::borrow::Borrow;
use std::collections::hash_map::RandomState;
use std::fmt;
use std::hash::{BuildHasher, Hash};
#[cfg(doc)]
use crate::WriteHandle;
pub struct MapReadRef<'rh, K, V, M = (), S = RandomState>
where
K: Hash + Eq,
V: Eq + Hash,
S: BuildHasher,
{
pub(super) guard: ReadGuard<'rh, Inner<K, V, M, S>>,
}
impl<'rh, K, V, M, S> fmt::Debug for MapReadRef<'rh, K, V, M, S>
where
K: Hash + Eq,
V: Eq + Hash,
S: BuildHasher,
K: fmt::Debug,
M: fmt::Debug,
V: fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("MapReadRef")
.field("guard", &self.guard)
.finish()
}
}
impl<'rh, K, V, M, S> MapReadRef<'rh, K, V, M, S>
where
K: Hash + Eq,
V: Eq + Hash,
S: BuildHasher,
{
pub fn iter(&self) -> ReadGuardIter<'_, K, V, S> {
ReadGuardIter {
iter: self.guard.data.iter(),
}
}
pub fn keys(&self) -> KeysIter<'_, K, V, S> {
KeysIter {
iter: self.guard.data.iter(),
}
}
pub fn values(&self) -> ValuesIter<'_, K, V, S> {
ValuesIter {
iter: self.guard.data.iter(),
}
}
pub fn len(&self) -> usize {
self.guard.data.len()
}
pub fn is_empty(&self) -> bool {
self.guard.data.is_empty()
}
pub fn meta(&self) -> &M {
&self.guard.meta
}
pub fn get<'a, Q: ?Sized>(&'a self, key: &'_ Q) -> Option<&'a Values<V, S>>
where
K: Borrow<Q>,
Q: Hash + Eq,
{
self.guard.data.get(key).map(AsRef::as_ref)
}
pub fn get_one<'a, Q: ?Sized>(&'a self, key: &'_ Q) -> Option<&'a V>
where
K: Borrow<Q>,
Q: Hash + Eq,
{
self.guard
.data
.get(key)
.and_then(|values| values.as_ref().get_one())
}
pub fn contains_key<Q: ?Sized>(&self, key: &Q) -> bool
where
K: Borrow<Q>,
Q: Hash + Eq,
{
self.guard.data.contains_key(key)
}
pub fn contains_value<Q: ?Sized, W: ?Sized>(&self, key: &Q, value: &W) -> bool
where
K: Borrow<Q>,
Aliased<V, crate::aliasing::NoDrop>: Borrow<W>,
Q: Hash + Eq,
W: Hash + Eq,
{
self.guard
.data
.get(key)
.map_or(false, |values| values.as_ref().contains(value))
}
}
impl<'rh, K, Q, V, M, S> std::ops::Index<&'_ Q> for MapReadRef<'rh, K, V, M, S>
where
K: Eq + Hash + Borrow<Q>,
V: Eq + Hash,
Q: Eq + Hash + ?Sized,
S: BuildHasher,
{
type Output = Values<V, S>;
fn index(&self, key: &Q) -> &Self::Output {
self.get(key).unwrap()
}
}
impl<'rg, 'rh, K, V, M, S> IntoIterator for &'rg MapReadRef<'rh, K, V, M, S>
where
K: Eq + Hash,
V: Eq + Hash,
S: BuildHasher,
{
type Item = (&'rg K, &'rg Values<V, S>);
type IntoIter = ReadGuardIter<'rg, K, V, S>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
pub struct ReadGuardIter<'rg, K, V, S>
where
K: Eq + Hash,
V: Eq + Hash,
S: BuildHasher,
{
iter: <&'rg crate::inner::MapImpl<K, ValuesInner<V, S, crate::aliasing::NoDrop>, S> as IntoIterator>::IntoIter,
}
impl<'rg, K, V, S> fmt::Debug for ReadGuardIter<'rg, K, V, S>
where
K: Eq + Hash + fmt::Debug,
V: Eq + Hash,
S: BuildHasher,
V: fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("ReadGuardIter").field(&self.iter).finish()
}
}
impl<'rg, K, V, S> Iterator for ReadGuardIter<'rg, K, V, S>
where
K: Eq + Hash,
V: Eq + Hash,
S: BuildHasher,
{
type Item = (&'rg K, &'rg Values<V, S>);
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(|(k, v)| (k, v.as_ref()))
}
}
pub struct KeysIter<'rg, K, V, S>
where
K: Eq + Hash,
V: Eq + Hash,
S: BuildHasher,
{
iter: <&'rg crate::inner::MapImpl<K, ValuesInner<V, S, crate::aliasing::NoDrop>, S> as IntoIterator>::IntoIter,
}
impl<'rg, K, V, S> fmt::Debug for KeysIter<'rg, K, V, S>
where
K: Eq + Hash + fmt::Debug,
V: Eq + Hash,
S: BuildHasher,
V: fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("KeysIter").field(&self.iter).finish()
}
}
impl<'rg, K, V, S> Iterator for KeysIter<'rg, K, V, S>
where
K: Eq + Hash,
V: Eq + Hash,
S: BuildHasher,
{
type Item = &'rg K;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(|(k, _)| k)
}
}
pub struct ValuesIter<'rg, K, V, S>
where
K: Eq + Hash,
V: Eq + Hash,
S: BuildHasher,
{
iter: <&'rg crate::inner::MapImpl<K, ValuesInner<V, S, crate::aliasing::NoDrop>, S> as IntoIterator>::IntoIter,
}
impl<'rg, K, V, S> fmt::Debug for ValuesIter<'rg, K, V, S>
where
K: Eq + Hash + fmt::Debug,
V: Eq + Hash,
S: BuildHasher,
V: fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("ValuesIter").field(&self.iter).finish()
}
}
impl<'rg, K, V, S> Iterator for ValuesIter<'rg, K, V, S>
where
K: Eq + Hash,
V: Eq + Hash,
S: BuildHasher,
{
type Item = &'rg Values<V, S>;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(|(_, v)| v.as_ref())
}
}