shared-vec 0.1.0

Efficient shared container types
Documentation
use crate::{Counter, String, Vec};
use alloc::borrow::Cow;
use core::cmp::Ordering;

macro_rules! impl_eq_as_str {
    ($lhs:ty, $rhs:ty) => {
        impl<C: Counter<usize>> PartialEq<$rhs> for $lhs {
            fn eq(&self, other: &$rhs) -> bool {
                let lhs: &str = self;
                let rhs: &str = other;
                lhs == rhs
            }
        }
    };
}

impl_eq_as_str!(String<C>, Cow<'_, str>);
impl_eq_as_str!(Cow<'_, str>, String<C>);

impl_eq_as_str!(String<C>, str);
impl_eq_as_str!(str, String<C>);

impl_eq_as_str!(String<C>, alloc::string::String);
impl_eq_as_str!(alloc::string::String, String<C>);

impl<C1: Counter<usize>, C2: Counter<usize>> PartialEq<String<C2>> for String<C1> {
    fn eq(&self, other: &String<C2>) -> bool {
        let lhs: &str = self;
        let rhs: &str = other;
        lhs == rhs
    }
}
impl<C: Counter<usize>> Eq for String<C> {}
impl<C1: Counter<usize>, C2: Counter<usize>> PartialOrd<String<C2>> for String<C1> {
    fn partial_cmp(&self, other: &String<C2>) -> Option<Ordering> {
        Some(self.as_str().cmp(other.as_str()))
    }
}
impl<C: Counter<usize>> Ord for String<C> {
    fn cmp(&self, other: &Self) -> Ordering {
        self.as_str().cmp(other.as_str())
    }
}

macro_rules! impl_eq_as_slice {
    ($lhs:ty, $rhs:ty $(; $($tt:tt)+ )? ) => {
        impl<C: Counter<usize>, T: PartialEq $(, $($tt)+)? > PartialEq<$rhs> for $lhs {
            fn eq(&self, other: &$rhs) -> bool {
                let lhs: &[T] = self;
                let rhs: &[T] = other;
                lhs == rhs
            }
        }
    };
}

impl_eq_as_slice!(Vec<C, T>, [T; N]; const N: usize);
impl_eq_as_slice!([T; N], Vec<C, T>; const N: usize);

impl_eq_as_slice!(Vec<C, T>, [T]);
impl_eq_as_slice!([T], Vec<C, T>);

impl_eq_as_slice!(Vec<C, T>, Vec<C, T>);

impl<C: Counter<usize>, T> Eq for Vec<C, T> where T: Eq {}
impl<C: Counter<usize>, T> PartialOrd for Vec<C, T>
where
    T: PartialOrd,
{
    #[inline]
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        self.as_slice().partial_cmp(other.as_slice())
    }
}
impl<C: Counter<usize>, T> Ord for Vec<C, T>
where
    T: Ord,
{
    #[inline]
    fn cmp(&self, other: &Self) -> Ordering {
        self.as_slice().cmp(other.as_slice())
    }
}