use core::cmp::Ordering;
#[cfg(feature = "clone-behavior")]
use clone_behavior::{DeepClone, MirroredClone, Speed};
#[cfg(feature = "generic-container")]
use generic_container::{FragileContainer, GenericContainer};
pub trait Comparator<Key: ?Sized> {
#[must_use]
fn cmp(&self, lhs: &Key, rhs: &Key) -> Ordering;
}
#[cfg(feature = "generic-container")]
impl<Key: ?Sized, C: FragileContainer<dyn Comparator<Key>>> Comparator<Key> for C {
#[inline]
fn cmp(&self, lhs: &Key, rhs: &Key) -> Ordering {
let inner = self.get_ref();
let inner: &dyn Comparator<Key> = &*inner;
inner.cmp(lhs, rhs)
}
}
#[cfg(feature = "generic-container")]
impl<T, C, Key> Comparator<Key> for GenericContainer<T, C>
where
T: ?Sized + Comparator<Key>,
C: ?Sized + FragileContainer<T>,
Key: ?Sized,
{
#[inline]
fn cmp(&self, lhs: &Key, rhs: &Key) -> Ordering {
let inner = self.container.get_ref();
let inner: &T = &inner;
inner.cmp(lhs, rhs)
}
}
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct OrdComparator;
impl<Key: ?Sized + Ord> Comparator<Key> for OrdComparator {
#[inline]
fn cmp(&self, lhs: &Key, rhs: &Key) -> Ordering {
Ord::cmp(lhs, rhs)
}
}
#[cfg(feature = "clone-behavior")]
impl<S: Speed> DeepClone<S> for OrdComparator {
#[inline]
fn deep_clone(&self) -> Self {
Self
}
}
#[cfg(feature = "clone-behavior")]
impl<S: Speed> MirroredClone<S> for OrdComparator {
#[inline]
fn mirrored_clone(&self) -> Self {
Self
}
}