use core::cmp::Ordering;
pub trait NodesLink<Index> {
fn node_parent(&self, node: Index) -> Option<Index>;
fn node_left(&self, node: Index) -> Option<Index>;
fn node_right(&self, node: Index) -> Option<Index>;
}
impl<T, Index> NodesLink<Index> for &T
where
T: ?Sized + NodesLink<Index>,
{
#[inline]
#[track_caller]
fn node_parent(&self, node: Index) -> Option<Index> {
(**self).node_parent(node)
}
#[inline]
#[track_caller]
fn node_left(&self, node: Index) -> Option<Index> {
(**self).node_left(node)
}
#[inline]
#[track_caller]
fn node_right(&self, node: Index) -> Option<Index> {
(**self).node_right(node)
}
}
impl<T, Index> NodesLink<Index> for &mut T
where
T: ?Sized + NodesLink<Index>,
{
#[inline]
#[track_caller]
fn node_parent(&self, node: Index) -> Option<Index> {
(**self).node_parent(node)
}
#[inline]
#[track_caller]
fn node_left(&self, node: Index) -> Option<Index> {
(**self).node_left(node)
}
#[inline]
#[track_caller]
fn node_right(&self, node: Index) -> Option<Index> {
(**self).node_right(node)
}
}
pub trait NodesLinkMut<Index>: NodesLink<Index> {
fn set_node_parent(&mut self, node: Index, parent: Option<Index>);
fn set_node_left(&mut self, node: Index, left: Option<Index>);
fn set_node_right(&mut self, node: Index, right: Option<Index>);
}
impl<T, Index> NodesLinkMut<Index> for &mut T
where
T: ?Sized + NodesLinkMut<Index>,
{
#[inline]
#[track_caller]
fn set_node_parent(&mut self, node: Index, parent: Option<Index>) {
(**self).set_node_parent(node, parent)
}
#[inline]
#[track_caller]
fn set_node_left(&mut self, node: Index, left: Option<Index>) {
(**self).set_node_left(node, left)
}
#[inline]
#[track_caller]
fn set_node_right(&mut self, node: Index, right: Option<Index>) {
(**self).set_node_right(node, right)
}
}
pub trait NodesCmp<Index> {
fn cmp_nodes(&self, lhs: Index, rhs: Index) -> Ordering;
}
impl<T, Index> NodesCmp<Index> for &T
where
T: ?Sized + NodesCmp<Index>,
{
#[inline]
#[track_caller]
fn cmp_nodes(&self, lhs: Index, rhs: Index) -> Ordering {
(**self).cmp_nodes(lhs, rhs)
}
}
impl<T, Index> NodesCmp<Index> for &mut T
where
T: ?Sized + NodesCmp<Index>,
{
#[inline]
#[track_caller]
fn cmp_nodes(&self, lhs: Index, rhs: Index) -> Ordering {
(**self).cmp_nodes(lhs, rhs)
}
}
pub trait NodesCmpKey<Index, Key> {
fn cmp_node_key(&self, node: Index, key: &Key) -> Ordering;
}
impl<T, Index, Key> NodesCmpKey<Index, Key> for &T
where
T: ?Sized + NodesCmpKey<Index, Key>,
{
#[inline]
#[track_caller]
fn cmp_node_key(&self, node: Index, key: &Key) -> Ordering {
(**self).cmp_node_key(node, key)
}
}
impl<T, Index, Key> NodesCmpKey<Index, Key> for &mut T
where
T: ?Sized + NodesCmpKey<Index, Key>,
{
#[inline]
#[track_caller]
fn cmp_node_key(&self, node: Index, key: &Key) -> Ordering {
(**self).cmp_node_key(node, key)
}
}