mdarray 0.3.0

Multidimensional array for Rust
Documentation
use std::cmp::Ordering;

use crate::buffer::Buffer;
use crate::dimension::{Const, Dim};
use crate::grid::GridBase;
use crate::layout::Layout;
use crate::order::Order;
use crate::span::SpanBase;

impl<B: Buffer> Eq for GridBase<B> where SpanBase<B::Item, B::Layout>: Eq {}
impl<T: Eq, L: Layout> Eq for SpanBase<T, L> {}

impl<B: Buffer> Ord for GridBase<B>
where
    SpanBase<B::Item, B::Layout>: Ord,
{
    fn cmp(&self, other: &GridBase<B>) -> Ordering {
        self.as_span().cmp(other.as_span())
    }
}

impl<T: Ord, L: Layout<Dim = Const<1>>> Ord for SpanBase<T, L> {
    fn cmp(&self, other: &SpanBase<T, L>) -> Ordering {
        if L::IS_UNIT_STRIDED {
            self.as_slice().cmp(other.as_slice())
        } else {
            self.iter().cmp(other)
        }
    }
}

impl<B: Buffer, C: Buffer> PartialOrd<GridBase<C>> for GridBase<B>
where
    SpanBase<B::Item, B::Layout>: PartialOrd<SpanBase<C::Item, C::Layout>>,
{
    fn partial_cmp(&self, other: &GridBase<C>) -> Option<Ordering> {
        self.as_span().partial_cmp(other.as_span())
    }
}

impl<B: Buffer, T, L: Layout> PartialOrd<SpanBase<T, L>> for GridBase<B>
where
    SpanBase<B::Item, B::Layout>: PartialOrd<SpanBase<T, L>>,
{
    fn partial_cmp(&self, other: &SpanBase<T, L>) -> Option<Ordering> {
        self.as_span().partial_cmp(other)
    }
}

impl<T, L: Layout, B: Buffer> PartialOrd<GridBase<B>> for SpanBase<T, L>
where
    SpanBase<T, L>: PartialOrd<SpanBase<B::Item, B::Layout>>,
{
    fn partial_cmp(&self, other: &GridBase<B>) -> Option<Ordering> {
        self.partial_cmp(other.as_span())
    }
}

impl<O: Order, T: PartialOrd<U>, L, U, M> PartialOrd<SpanBase<U, M>> for SpanBase<T, L>
where
    L: Layout<Dim = Const<1>, Order = O>,
    M: Layout<Dim = Const<1>, Order = O>,
{
    fn partial_cmp(&self, other: &SpanBase<U, M>) -> Option<Ordering> {
        self.iter().partial_cmp(other)
    }
}

impl<B: Buffer, C: Buffer> PartialEq<GridBase<C>> for GridBase<B>
where
    SpanBase<B::Item, B::Layout>: PartialEq<SpanBase<C::Item, C::Layout>>,
{
    fn eq(&self, other: &GridBase<C>) -> bool {
        self.as_span().eq(other.as_span())
    }
}

impl<B: Buffer, T, L: Layout> PartialEq<SpanBase<T, L>> for GridBase<B>
where
    SpanBase<B::Item, B::Layout>: PartialEq<SpanBase<T, L>>,
{
    fn eq(&self, other: &SpanBase<T, L>) -> bool {
        self.as_span().eq(other)
    }
}

impl<T, L: Layout, B: Buffer> PartialEq<GridBase<B>> for SpanBase<T, L>
where
    SpanBase<T, L>: PartialEq<SpanBase<B::Item, B::Layout>>,
{
    fn eq(&self, other: &GridBase<B>) -> bool {
        self.eq(other.as_span())
    }
}

impl<D: Dim, O: Order, T: PartialEq<U>, L, U, M> PartialEq<SpanBase<U, M>> for SpanBase<T, L>
where
    L: Layout<Dim = D, Order = O>,
    M: Layout<Dim = D, Order = O>,
{
    fn eq(&self, other: &SpanBase<U, M>) -> bool {
        if D::RANK == 0 {
            self[D::Shape::default()] == other[D::Shape::default()]
        } else if D::RANK == 1 {
            if L::IS_UNIT_STRIDED && M::IS_UNIT_STRIDED {
                self.as_slice().eq(other.as_slice())
            } else {
                self.flat_iter().eq(other.flat_iter())
            }
        } else if L::IS_DENSE && M::IS_DENSE {
            self.shape().as_ref() == other.shape().as_ref() && self.as_slice().eq(other.as_slice())
        } else {
            self.outer_iter().eq(other.outer_iter())
        }
    }
}