diff --git a/src/base/dimension.rs b/src/base/dimension.rs index 77ba1c3d..7a47d28c 100644 --- a/src/base/dimension.rs +++ b/src/base/dimension.rs @@ -2,12 +2,13 @@ //! Traits and tags for identifying the dimension of all algebraic entities. -use std::fmt::Debug; use std::any::{Any, TypeId}; use std::cmp; +use std::fmt::Debug; use std::ops::{Add, Div, Mul, Sub}; -use typenum::{self, B1, Bit, Diff, Max, Maximum, Min, Minimum, Prod, Quot, Sum, UInt, UTerm, - Unsigned}; +use typenum::{ + self, B1, Bit, Diff, Max, Maximum, Min, Minimum, Prod, Quot, Sum, UInt, UTerm, Unsigned, +}; #[cfg(feature = "serde-serialize")] 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 /// 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)] fn is() -> bool { TypeId::of::() == TypeId::of::() @@ -286,157 +287,40 @@ macro_rules! named_dimension( // We give explicit names to all Unsigned in [0, 128[ named_dimension!( - U0, - /*U1,*/ U2, - U3, - U4, - U5, - U6, - U7, - 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, + U0, /*U1,*/ U2, U3, U4, U5, U6, U7, 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 ); // For values greater than U1023, just use the typenum binary representation directly. impl< - A: Bit + Any + Debug + Copy + PartialEq + Send, - B: Bit + Any + Debug + Copy + PartialEq + Send, - C: Bit + Any + Debug + Copy + PartialEq + Send, - D: Bit + Any + Debug + Copy + PartialEq + Send, - E: Bit + Any + Debug + Copy + PartialEq + Send, - F: Bit + Any + Debug + Copy + PartialEq + Send, - G: Bit + Any + Debug + Copy + PartialEq + Send, -> NamedDim for UInt, A>, B>, C>, D>, E>, F>, G> { + A: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + B: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + C: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + D: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + E: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + F: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + G: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + > NamedDim for UInt, A>, B>, C>, D>, E>, F>, G> +{ type Name = Self; } impl< - A: Bit + Any + Debug + Copy + PartialEq + Send, - B: Bit + Any + Debug + Copy + PartialEq + Send, - C: Bit + Any + Debug + Copy + PartialEq + Send, - D: Bit + Any + Debug + Copy + PartialEq + Send, - E: Bit + Any + Debug + Copy + PartialEq + Send, - F: Bit + Any + Debug + Copy + PartialEq + Send, - G: Bit + Any + Debug + Copy + PartialEq + Send, -> Dim for UInt, A>, B>, C>, D>, E>, F>, G> { + A: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + B: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + C: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + D: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + E: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + F: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + G: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + > Dim for UInt, A>, B>, C>, D>, E>, F>, G> +{ #[inline] fn try_to_usize() -> Option { Some(Self::to_usize()) @@ -455,14 +339,15 @@ impl< } impl< - A: Bit + Any + Debug + Copy + PartialEq + Send, - B: Bit + Any + Debug + Copy + PartialEq + Send, - C: Bit + Any + Debug + Copy + PartialEq + Send, - D: Bit + Any + Debug + Copy + PartialEq + Send, - E: Bit + Any + Debug + Copy + PartialEq + Send, - F: Bit + Any + Debug + Copy + PartialEq + Send, - G: Bit + Any + Debug + Copy + PartialEq + Send, -> DimName for UInt, A>, B>, C>, D>, E>, F>, G> { + A: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + B: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + C: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + D: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + E: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + F: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + G: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + > DimName for UInt, A>, B>, C>, D>, E>, F>, G> +{ type Value = Self; #[inline] @@ -472,23 +357,26 @@ impl< } impl< - A: Bit + Any + Debug + Copy + PartialEq + Send, - B: Bit + Any + Debug + Copy + PartialEq + Send, - C: Bit + Any + Debug + Copy + PartialEq + Send, - D: Bit + Any + Debug + Copy + PartialEq + Send, - E: Bit + Any + Debug + Copy + PartialEq + Send, - F: Bit + Any + Debug + Copy + PartialEq + Send, - G: Bit + Any + Debug + Copy + PartialEq + Send, -> IsNotStaticOne - for UInt, A>, B>, C>, D>, E>, F>, G> { -} + A: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + B: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + C: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + D: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + E: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + F: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + G: Bit + Any + Debug + Copy + PartialEq + Send + Sync, + > IsNotStaticOne + for UInt, A>, B>, C>, D>, E>, F>, G> +{} -impl NamedDim - for UInt { +impl NamedDim + for UInt +{ type Name = UInt; } -impl Dim for UInt { +impl Dim + for UInt +{ #[inline] fn try_to_usize() -> Option { Some(Self::to_usize()) @@ -506,7 +394,9 @@ impl Dim } } -impl DimName for UInt { +impl DimName + for UInt +{ type Value = UInt; #[inline] @@ -515,6 +405,6 @@ impl DimN } } -impl IsNotStaticOne - for UInt { -} +impl IsNotStaticOne + for UInt +{} diff --git a/src/base/matrix_slice.rs b/src/base/matrix_slice.rs index 871aee41..3067dc55 100644 --- a/src/base/matrix_slice.rs +++ b/src/base/matrix_slice.rs @@ -2,12 +2,12 @@ use std::marker::PhantomData; use std::ops::{Range, RangeFrom, RangeFull, RangeTo}; 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::iter::MatrixIter; use base::storage::{Owned, Storage, StorageMut}; -use base::allocator::Allocator; -use base::default_allocator::DefaultAllocator; +use base::{Matrix, Scalar}; macro_rules! slice_storage_impl( ($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>, } + 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> { /// Create a new matrix slice without bound checking and from a raw pointer. #[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 - 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 - for SliceStorage<'a, N, R, C, RStride, CStride> { + for SliceStorage<'a, N, R, C, RStride, CStride> +{ #[inline] fn clone(&self) -> Self { SliceStorage { @@ -171,7 +180,8 @@ macro_rules! storage_impl( storage_impl!(SliceStorage, SliceStorageMut); unsafe impl<'a, N: Scalar, R: Dim, C: Dim, RStride: Dim, CStride: Dim> StorageMut - for SliceStorageMut<'a, N, R, C, RStride, CStride> { + for SliceStorageMut<'a, N, R, C, RStride, CStride> +{ #[inline] fn ptr_mut(&mut self) -> *mut N { self.ptr