//! Abstract definition of a matrix data storage allocator. use std::any::Any; use core::Scalar; use core::constraint::{SameNumberOfRows, SameNumberOfColumns, ShapeConstraint}; use core::dimension::{Dim, U1}; use core::storage::{Storage, OwnedStorage}; /// A matrix allocator of a memory buffer that may contain `R::to_usize() * C::to_usize()` /// elements of type `N`. /// /// An allocator is said to be: /// − static: if `R` and `C` both implement `DimName`. /// − dynamic: if either one (or both) of `R` or `C` is equal to `Dynamic`. /// /// Every allocator must be both static and dynamic. Though not all implementations may share the /// same `Buffer` type. pub trait Allocator: Any + Sized { /// The type of buffer this allocator can instanciate. type Buffer: OwnedStorage; /// Allocates a buffer with the given number of rows and columns without initializing its content. unsafe fn allocate_uninitialized(nrows: R, ncols: C) -> Self::Buffer; /// Allocates a buffer initialized with the content of the given iterator. fn allocate_from_iterator>(nrows: R, ncols: C, iter: I) -> Self::Buffer; } /// A matrix data allocator dedicated to the given owned matrix storage. pub trait OwnedAllocator>: Allocator { } impl OwnedAllocator for T where N: Scalar, R: Dim, C: Dim, T: Allocator, S: OwnedStorage { } /// The number of rows of the result of a componentwise operation on two matrices. pub type SameShapeR = >::Representative; /// The number of columns of the result of a componentwise operation on two matrices. pub type SameShapeC = >::Representative; // FIXME: Bad name. /// Restricts the given number of rows and columns to be respectively the same. Can only be used /// when `Self = SA::Alloc`. pub trait SameShapeAllocator: Allocator + Allocator, SameShapeC> where R1: Dim, R2: Dim, C1: Dim, C2: Dim, N: Scalar, SA: Storage, ShapeConstraint: SameNumberOfRows + SameNumberOfColumns { } impl SameShapeAllocator for SA::Alloc where R1: Dim, R2: Dim, C1: Dim, C2: Dim, N: Scalar, SA: Storage, SA::Alloc: Allocator + Allocator, SameShapeC>, ShapeConstraint: SameNumberOfRows + SameNumberOfColumns { } // XXX: Bad name. /// Restricts the given number of rows to be equal. Can only be used when `Self = SA::Alloc`. pub trait SameShapeColumnVectorAllocator: Allocator + Allocator, U1> + SameShapeAllocator where R1: Dim, R2: Dim, N: Scalar, SA: Storage, ShapeConstraint: SameNumberOfRows { } impl SameShapeColumnVectorAllocator for SA::Alloc where R1: Dim, R2: Dim, N: Scalar, SA: Storage, SA::Alloc: Allocator + Allocator, U1>, ShapeConstraint: SameNumberOfRows { }