use std::{
fmt::{self, Debug, Formatter},
marker::PhantomData,
};
#[cfg(feature = "num-traits")]
pub use self::nonzero::{NonZeroBTreeMap, NonZeroHashMap, ZeroCommonality};
pub use self::{btree_map::TotalBTreeMap, empty::EmptyCommonality, hash_map::TotalHashMap};
pub mod btree_map;
pub mod empty;
pub mod hash_map;
#[cfg(feature = "num-traits")]
pub mod nonzero;
#[cfg(feature = "serde")]
mod serde;
#[cfg_attr(
feature = "num-traits",
doc = "- [ZeroCommonality] is based on the [num_traits::Zero] trait."
)]
pub trait Commonality<V> {
fn common() -> V;
fn is_common(value: &V) -> bool;
}
pub struct DefaultCommonality(());
impl<T: PartialEq + Default> Commonality<T> for DefaultCommonality {
fn common() -> T {
T::default()
}
fn is_common(value: &T) -> bool {
value == &T::default()
}
}
struct PhantomPtr<T>(PhantomData<*const T>);
impl<T> Default for PhantomPtr<T> {
fn default() -> Self {
Self(PhantomData)
}
}
impl<T> Debug for PhantomPtr<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
f.debug_tuple("PhantomPtr").field(&self.0).finish()
}
}
unsafe impl<T> Send for PhantomPtr<T> {}
unsafe impl<T> Sync for PhantomPtr<T> {}