parent
f9ea9f0795
commit
dba752e91e
|
@ -2,12 +2,13 @@
|
||||||
|
|
||||||
//! Traits and tags for identifying the dimension of all algebraic entities.
|
//! Traits and tags for identifying the dimension of all algebraic entities.
|
||||||
|
|
||||||
use std::fmt::Debug;
|
|
||||||
use std::any::{Any, TypeId};
|
use std::any::{Any, TypeId};
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
|
use std::fmt::Debug;
|
||||||
use std::ops::{Add, Div, Mul, Sub};
|
use std::ops::{Add, Div, Mul, Sub};
|
||||||
use typenum::{self, B1, Bit, Diff, Max, Maximum, Min, Minimum, Prod, Quot, Sum, UInt, UTerm,
|
use typenum::{
|
||||||
Unsigned};
|
self, B1, Bit, Diff, Max, Maximum, Min, Minimum, Prod, Quot, Sum, UInt, UTerm, Unsigned,
|
||||||
|
};
|
||||||
|
|
||||||
#[cfg(feature = "serde-serialize")]
|
#[cfg(feature = "serde-serialize")]
|
||||||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||||
|
@ -56,7 +57,7 @@ impl IsNotStaticOne for Dynamic {}
|
||||||
|
|
||||||
/// Trait implemented by any type that can be used as a dimension. This includes type-level
|
/// Trait implemented by any type that can be used as a dimension. This includes type-level
|
||||||
/// integers and `Dynamic` (for dimensions not known at compile-time).
|
/// integers and `Dynamic` (for dimensions not known at compile-time).
|
||||||
pub trait Dim: Any + Debug + Copy + PartialEq + Send {
|
pub trait Dim: Any + Debug + Copy + PartialEq + Send + Sync {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn is<D: Dim>() -> bool {
|
fn is<D: Dim>() -> bool {
|
||||||
TypeId::of::<Self>() == TypeId::of::<D>()
|
TypeId::of::<Self>() == TypeId::of::<D>()
|
||||||
|
@ -286,157 +287,40 @@ macro_rules! named_dimension(
|
||||||
|
|
||||||
// We give explicit names to all Unsigned in [0, 128[
|
// We give explicit names to all Unsigned in [0, 128[
|
||||||
named_dimension!(
|
named_dimension!(
|
||||||
U0,
|
U0, /*U1,*/ U2, U3, U4, U5, U6, U7, U8, U9, U10, U11, U12, U13, U14, U15, U16, U17, U18,
|
||||||
/*U1,*/ U2,
|
U19, U20, U21, U22, U23, U24, U25, U26, U27, U28, U29, U30, U31, U32, U33, U34, U35, U36, U37,
|
||||||
U3,
|
U38, U39, U40, U41, U42, U43, U44, U45, U46, U47, U48, U49, U50, U51, U52, U53, U54, U55, U56,
|
||||||
U4,
|
U57, U58, U59, U60, U61, U62, U63, U64, U65, U66, U67, U68, U69, U70, U71, U72, U73, U74, U75,
|
||||||
U5,
|
U76, U77, U78, U79, U80, U81, U82, U83, U84, U85, U86, U87, U88, U89, U90, U91, U92, U93, U94,
|
||||||
U6,
|
U95, U96, U97, U98, U99, U100, U101, U102, U103, U104, U105, U106, U107, U108, U109, U110,
|
||||||
U7,
|
U111, U112, U113, U114, U115, U116, U117, U118, U119, U120, U121, U122, U123, U124, U125, U126,
|
||||||
U8,
|
|
||||||
U9,
|
|
||||||
U10,
|
|
||||||
U11,
|
|
||||||
U12,
|
|
||||||
U13,
|
|
||||||
U14,
|
|
||||||
U15,
|
|
||||||
U16,
|
|
||||||
U17,
|
|
||||||
U18,
|
|
||||||
U19,
|
|
||||||
U20,
|
|
||||||
U21,
|
|
||||||
U22,
|
|
||||||
U23,
|
|
||||||
U24,
|
|
||||||
U25,
|
|
||||||
U26,
|
|
||||||
U27,
|
|
||||||
U28,
|
|
||||||
U29,
|
|
||||||
U30,
|
|
||||||
U31,
|
|
||||||
U32,
|
|
||||||
U33,
|
|
||||||
U34,
|
|
||||||
U35,
|
|
||||||
U36,
|
|
||||||
U37,
|
|
||||||
U38,
|
|
||||||
U39,
|
|
||||||
U40,
|
|
||||||
U41,
|
|
||||||
U42,
|
|
||||||
U43,
|
|
||||||
U44,
|
|
||||||
U45,
|
|
||||||
U46,
|
|
||||||
U47,
|
|
||||||
U48,
|
|
||||||
U49,
|
|
||||||
U50,
|
|
||||||
U51,
|
|
||||||
U52,
|
|
||||||
U53,
|
|
||||||
U54,
|
|
||||||
U55,
|
|
||||||
U56,
|
|
||||||
U57,
|
|
||||||
U58,
|
|
||||||
U59,
|
|
||||||
U60,
|
|
||||||
U61,
|
|
||||||
U62,
|
|
||||||
U63,
|
|
||||||
U64,
|
|
||||||
U65,
|
|
||||||
U66,
|
|
||||||
U67,
|
|
||||||
U68,
|
|
||||||
U69,
|
|
||||||
U70,
|
|
||||||
U71,
|
|
||||||
U72,
|
|
||||||
U73,
|
|
||||||
U74,
|
|
||||||
U75,
|
|
||||||
U76,
|
|
||||||
U77,
|
|
||||||
U78,
|
|
||||||
U79,
|
|
||||||
U80,
|
|
||||||
U81,
|
|
||||||
U82,
|
|
||||||
U83,
|
|
||||||
U84,
|
|
||||||
U85,
|
|
||||||
U86,
|
|
||||||
U87,
|
|
||||||
U88,
|
|
||||||
U89,
|
|
||||||
U90,
|
|
||||||
U91,
|
|
||||||
U92,
|
|
||||||
U93,
|
|
||||||
U94,
|
|
||||||
U95,
|
|
||||||
U96,
|
|
||||||
U97,
|
|
||||||
U98,
|
|
||||||
U99,
|
|
||||||
U100,
|
|
||||||
U101,
|
|
||||||
U102,
|
|
||||||
U103,
|
|
||||||
U104,
|
|
||||||
U105,
|
|
||||||
U106,
|
|
||||||
U107,
|
|
||||||
U108,
|
|
||||||
U109,
|
|
||||||
U110,
|
|
||||||
U111,
|
|
||||||
U112,
|
|
||||||
U113,
|
|
||||||
U114,
|
|
||||||
U115,
|
|
||||||
U116,
|
|
||||||
U117,
|
|
||||||
U118,
|
|
||||||
U119,
|
|
||||||
U120,
|
|
||||||
U121,
|
|
||||||
U122,
|
|
||||||
U123,
|
|
||||||
U124,
|
|
||||||
U125,
|
|
||||||
U126,
|
|
||||||
U127
|
U127
|
||||||
);
|
);
|
||||||
|
|
||||||
// For values greater than U1023, just use the typenum binary representation directly.
|
// For values greater than U1023, just use the typenum binary representation directly.
|
||||||
impl<
|
impl<
|
||||||
A: Bit + Any + Debug + Copy + PartialEq + Send,
|
A: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
B: Bit + Any + Debug + Copy + PartialEq + Send,
|
B: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
C: Bit + Any + Debug + Copy + PartialEq + Send,
|
C: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
D: Bit + Any + Debug + Copy + PartialEq + Send,
|
D: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
E: Bit + Any + Debug + Copy + PartialEq + Send,
|
E: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
F: Bit + Any + Debug + Copy + PartialEq + Send,
|
F: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
G: Bit + Any + Debug + Copy + PartialEq + Send,
|
G: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
> NamedDim for UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, A>, B>, C>, D>, E>, F>, G> {
|
> NamedDim for UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, A>, B>, C>, D>, E>, F>, G>
|
||||||
|
{
|
||||||
type Name = Self;
|
type Name = Self;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<
|
impl<
|
||||||
A: Bit + Any + Debug + Copy + PartialEq + Send,
|
A: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
B: Bit + Any + Debug + Copy + PartialEq + Send,
|
B: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
C: Bit + Any + Debug + Copy + PartialEq + Send,
|
C: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
D: Bit + Any + Debug + Copy + PartialEq + Send,
|
D: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
E: Bit + Any + Debug + Copy + PartialEq + Send,
|
E: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
F: Bit + Any + Debug + Copy + PartialEq + Send,
|
F: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
G: Bit + Any + Debug + Copy + PartialEq + Send,
|
G: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
> Dim for UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, A>, B>, C>, D>, E>, F>, G> {
|
> Dim for UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, A>, B>, C>, D>, E>, F>, G>
|
||||||
|
{
|
||||||
#[inline]
|
#[inline]
|
||||||
fn try_to_usize() -> Option<usize> {
|
fn try_to_usize() -> Option<usize> {
|
||||||
Some(Self::to_usize())
|
Some(Self::to_usize())
|
||||||
|
@ -455,14 +339,15 @@ impl<
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<
|
impl<
|
||||||
A: Bit + Any + Debug + Copy + PartialEq + Send,
|
A: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
B: Bit + Any + Debug + Copy + PartialEq + Send,
|
B: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
C: Bit + Any + Debug + Copy + PartialEq + Send,
|
C: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
D: Bit + Any + Debug + Copy + PartialEq + Send,
|
D: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
E: Bit + Any + Debug + Copy + PartialEq + Send,
|
E: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
F: Bit + Any + Debug + Copy + PartialEq + Send,
|
F: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
G: Bit + Any + Debug + Copy + PartialEq + Send,
|
G: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
> DimName for UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, A>, B>, C>, D>, E>, F>, G> {
|
> DimName for UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, A>, B>, C>, D>, E>, F>, G>
|
||||||
|
{
|
||||||
type Value = Self;
|
type Value = Self;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -472,23 +357,26 @@ impl<
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<
|
impl<
|
||||||
A: Bit + Any + Debug + Copy + PartialEq + Send,
|
A: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
B: Bit + Any + Debug + Copy + PartialEq + Send,
|
B: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
C: Bit + Any + Debug + Copy + PartialEq + Send,
|
C: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
D: Bit + Any + Debug + Copy + PartialEq + Send,
|
D: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
E: Bit + Any + Debug + Copy + PartialEq + Send,
|
E: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
F: Bit + Any + Debug + Copy + PartialEq + Send,
|
F: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
G: Bit + Any + Debug + Copy + PartialEq + Send,
|
G: Bit + Any + Debug + Copy + PartialEq + Send + Sync,
|
||||||
> IsNotStaticOne
|
> IsNotStaticOne
|
||||||
for UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, A>, B>, C>, D>, E>, F>, G> {
|
for UInt<UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, A>, B>, C>, D>, E>, F>, G>
|
||||||
}
|
{}
|
||||||
|
|
||||||
impl<U: Unsigned + DimName, B: Bit + Any + Debug + Copy + PartialEq + Send> NamedDim
|
impl<U: Unsigned + DimName, B: Bit + Any + Debug + Copy + PartialEq + Send + Sync> NamedDim
|
||||||
for UInt<U, B> {
|
for UInt<U, B>
|
||||||
|
{
|
||||||
type Name = UInt<U, B>;
|
type Name = UInt<U, B>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<U: Unsigned + DimName, B: Bit + Any + Debug + Copy + PartialEq + Send> Dim for UInt<U, B> {
|
impl<U: Unsigned + DimName, B: Bit + Any + Debug + Copy + PartialEq + Send + Sync> Dim
|
||||||
|
for UInt<U, B>
|
||||||
|
{
|
||||||
#[inline]
|
#[inline]
|
||||||
fn try_to_usize() -> Option<usize> {
|
fn try_to_usize() -> Option<usize> {
|
||||||
Some(Self::to_usize())
|
Some(Self::to_usize())
|
||||||
|
@ -506,7 +394,9 @@ impl<U: Unsigned + DimName, B: Bit + Any + Debug + Copy + PartialEq + Send> Dim
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<U: Unsigned + DimName, B: Bit + Any + Debug + Copy + PartialEq + Send> DimName for UInt<U, B> {
|
impl<U: Unsigned + DimName, B: Bit + Any + Debug + Copy + PartialEq + Send + Sync> DimName
|
||||||
|
for UInt<U, B>
|
||||||
|
{
|
||||||
type Value = UInt<U, B>;
|
type Value = UInt<U, B>;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -515,6 +405,6 @@ impl<U: Unsigned + DimName, B: Bit + Any + Debug + Copy + PartialEq + Send> DimN
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<U: Unsigned + DimName, B: Bit + Any + Debug + Copy + PartialEq + Send> IsNotStaticOne
|
impl<U: Unsigned + DimName, B: Bit + Any + Debug + Copy + PartialEq + Send + Sync> IsNotStaticOne
|
||||||
for UInt<U, B> {
|
for UInt<U, B>
|
||||||
}
|
{}
|
||||||
|
|
|
@ -2,12 +2,12 @@ use std::marker::PhantomData;
|
||||||
use std::ops::{Range, RangeFrom, RangeFull, RangeTo};
|
use std::ops::{Range, RangeFrom, RangeFull, RangeTo};
|
||||||
use std::slice;
|
use std::slice;
|
||||||
|
|
||||||
use base::{Matrix, Scalar};
|
use base::allocator::Allocator;
|
||||||
|
use base::default_allocator::DefaultAllocator;
|
||||||
use base::dimension::{Dim, DimName, Dynamic, U1};
|
use base::dimension::{Dim, DimName, Dynamic, U1};
|
||||||
use base::iter::MatrixIter;
|
use base::iter::MatrixIter;
|
||||||
use base::storage::{Owned, Storage, StorageMut};
|
use base::storage::{Owned, Storage, StorageMut};
|
||||||
use base::allocator::Allocator;
|
use base::{Matrix, Scalar};
|
||||||
use base::default_allocator::DefaultAllocator;
|
|
||||||
|
|
||||||
macro_rules! slice_storage_impl(
|
macro_rules! slice_storage_impl(
|
||||||
($doc: expr; $Storage: ident as $SRef: ty; $T: ident.$get_addr: ident ($Ptr: ty as $Ref: ty)) => {
|
($doc: expr; $Storage: ident as $SRef: ty; $T: ident.$get_addr: ident ($Ptr: ty as $Ref: ty)) => {
|
||||||
|
@ -20,6 +20,14 @@ macro_rules! slice_storage_impl(
|
||||||
_phantoms: PhantomData<$Ref>,
|
_phantoms: PhantomData<$Ref>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe impl<'a, N: Scalar + Send, R: Dim, C: Dim, RStride: Dim, CStride: Dim> Send
|
||||||
|
for $T<'a, N, R, C, RStride, CStride>
|
||||||
|
{}
|
||||||
|
|
||||||
|
unsafe impl<'a, N: Scalar + Sync, R: Dim, C: Dim, RStride: Dim, CStride: Dim> Sync
|
||||||
|
for $T<'a, N, R, C, RStride, CStride>
|
||||||
|
{}
|
||||||
|
|
||||||
impl<'a, N: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> $T<'a, N, R, C, RStride, CStride> {
|
impl<'a, N: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> $T<'a, N, R, C, RStride, CStride> {
|
||||||
/// Create a new matrix slice without bound checking and from a raw pointer.
|
/// Create a new matrix slice without bound checking and from a raw pointer.
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -82,11 +90,12 @@ slice_storage_impl!("A mutable matrix data storage for mutable matrix slice. Onl
|
||||||
);
|
);
|
||||||
|
|
||||||
impl<'a, N: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> Copy
|
impl<'a, N: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> Copy
|
||||||
for SliceStorage<'a, N, R, C, RStride, CStride> {
|
for SliceStorage<'a, N, R, C, RStride, CStride>
|
||||||
}
|
{}
|
||||||
|
|
||||||
impl<'a, N: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> Clone
|
impl<'a, N: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> Clone
|
||||||
for SliceStorage<'a, N, R, C, RStride, CStride> {
|
for SliceStorage<'a, N, R, C, RStride, CStride>
|
||||||
|
{
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
SliceStorage {
|
SliceStorage {
|
||||||
|
@ -171,7 +180,8 @@ macro_rules! storage_impl(
|
||||||
storage_impl!(SliceStorage, SliceStorageMut);
|
storage_impl!(SliceStorage, SliceStorageMut);
|
||||||
|
|
||||||
unsafe impl<'a, N: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> StorageMut<N, R, C>
|
unsafe impl<'a, N: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> StorageMut<N, R, C>
|
||||||
for SliceStorageMut<'a, N, R, C, RStride, CStride> {
|
for SliceStorageMut<'a, N, R, C, RStride, CStride>
|
||||||
|
{
|
||||||
#[inline]
|
#[inline]
|
||||||
fn ptr_mut(&mut self) -> *mut N {
|
fn ptr_mut(&mut self) -> *mut N {
|
||||||
self.ptr
|
self.ptr
|
||||||
|
|
Loading…
Reference in New Issue