#![allow(clippy::missing_safety_doc)]
pub mod raw;
#[cfg(feature = "serde")]
mod serde;
mod scopeguard;
#[doc(hidden)]
pub use self::map::HashMap;
#[doc(hidden)]
pub mod map;
#[doc(hidden)]
pub use self::set::HashSet;
#[doc(hidden)]
pub mod set;
use core::marker::PhantomData;
use crate::error::CustomError;
pub trait EqFn<C: ?Sized, T: ?Sized, E> {
fn eq(&self, cx: &mut C, key: &T) -> Result<bool, E>;
#[doc(hidden)]
fn into_tuple<V>(self) -> TupleFn<Self, V>
where
Self: Sized,
{
TupleFn {
this: self,
_marker: PhantomData,
}
}
}
impl<U, C: ?Sized, T: ?Sized, E> EqFn<C, T, E> for U
where
U: Fn(&mut C, &T) -> Result<bool, E>,
{
#[inline]
fn eq(&self, cx: &mut C, key: &T) -> Result<bool, E> {
self(cx, key)
}
}
pub trait HasherFn<C: ?Sized, T: ?Sized, E> {
fn hash(&self, cx: &mut C, key: &T) -> Result<u64, E>;
#[doc(hidden)]
fn into_tuple<V>(self) -> TupleFn<Self, V>
where
Self: Sized,
{
TupleFn {
this: self,
_marker: PhantomData,
}
}
}
impl<U, C: ?Sized, T: ?Sized, E> HasherFn<C, T, E> for U
where
U: Fn(&mut C, &T) -> Result<u64, E>,
{
#[inline]
fn hash(&self, cx: &mut C, key: &T) -> Result<u64, E> {
self(cx, key)
}
}
pub struct TupleFn<T, V> {
this: T,
_marker: PhantomData<V>,
}
impl<T, C: ?Sized, K, V, E> EqFn<C, (K, V), E> for TupleFn<T, V>
where
T: EqFn<C, K, E>,
{
#[inline]
fn eq(&self, cx: &mut C, (key, _): &(K, V)) -> Result<bool, E> {
self.this.eq(cx, key)
}
}
impl<T, C: ?Sized, K, V, E> HasherFn<C, (K, V), E> for TupleFn<T, V>
where
T: HasherFn<C, K, E>,
{
#[inline]
fn hash(&self, cx: &mut C, (key, _): &(K, V)) -> Result<u64, E> {
self.this.hash(cx, key)
}
}
pub enum ErrorOrInsertSlot<E> {
Error(CustomError<E>),
InsertSlot(raw::InsertSlot),
}
impl<E> From<CustomError<E>> for ErrorOrInsertSlot<E> {
#[inline]
fn from(error: CustomError<E>) -> Self {
Self::Error(error)
}
}
pub trait Equivalent<K: ?Sized> {
fn equivalent(&self, key: &K) -> bool;
}
impl<Q, K> Equivalent<K> for Q
where
Q: ?Sized + Eq,
K: ?Sized + core::borrow::Borrow<Q>,
{
#[inline]
fn equivalent(&self, key: &K) -> bool {
self == key.borrow()
}
}