use std::{
borrow::Borrow,
cmp::Ordering,
hash::Hash,
ops::{AddAssign, DivAssign, MulAssign, SubAssign},
};
#[derive(Debug)]
pub struct OrderVal<T, O: Ord> {
ord: O,
val: T,
}
impl<T, O: Ord> OrderVal<T, O> {
#[inline]
pub fn new(val: T, ord: O) -> Self {
Self { ord, val }
}
#[inline]
pub fn into_inner(self) -> T {
self.val
}
#[inline]
pub fn inner(&self) -> &T {
&self.val
}
#[inline]
pub fn ord(&self) -> &O {
&self.ord
}
#[inline]
pub fn set_ord(&mut self, ord: O) {
self.ord = ord;
}
}
impl<T: PartialEq, O: Ord> PartialOrd for OrderVal<T, O> {
#[inline]
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.ord.cmp(&other.ord))
}
}
impl<T: PartialEq, O: Ord> Ord for OrderVal<T, O> {
#[inline]
fn cmp(&self, other: &Self) -> Ordering {
self.ord.cmp(&other.ord)
}
}
impl<T: PartialEq, O: Ord> PartialEq for OrderVal<T, O> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.inner() == other.inner()
}
}
impl<T: PartialEq, O: Ord> Eq for OrderVal<T, O> {}
impl<T: Clone, O: Ord + Clone> Clone for OrderVal<T, O> {
#[inline]
fn clone(&self) -> Self {
Self {
ord: self.ord.clone(),
val: self.val.clone(),
}
}
}
impl<T: Copy, O: Ord + Copy> Copy for OrderVal<T, O> {}
impl<T, O: Ord> Borrow<T> for OrderVal<T, O> {
#[inline]
fn borrow(&self) -> &T {
self.inner()
}
}
impl<T, O: Ord> AsRef<T> for OrderVal<T, O> {
#[inline]
fn as_ref(&self) -> &T {
self.inner()
}
}
impl<T, O: Ord + AddAssign<O>> AddAssign<O> for OrderVal<T, O> {
#[inline]
fn add_assign(&mut self, rhs: O) {
self.ord.add_assign(rhs)
}
}
impl<T, O: Ord + SubAssign<O>> SubAssign<O> for OrderVal<T, O> {
#[inline]
fn sub_assign(&mut self, rhs: O) {
self.ord.sub_assign(rhs)
}
}
impl<T, O: Ord + DivAssign<O>> DivAssign<O> for OrderVal<T, O> {
#[inline]
fn div_assign(&mut self, rhs: O) {
self.ord.div_assign(rhs)
}
}
impl<T, O: Ord + MulAssign<O>> MulAssign<O> for OrderVal<T, O> {
#[inline]
fn mul_assign(&mut self, rhs: O) {
self.ord.mul_assign(rhs)
}
}
impl<T: Hash, O: Hash + Ord> Hash for OrderVal<T, O> {
#[inline]
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.val.hash(state);
}
}