//! Abstract definition of a matrix data storage allocator. use std::any::Any; use base::{DefaultAllocator, Scalar}; use base::constraint::{SameNumberOfColumns, SameNumberOfRows, ShapeConstraint}; use base::dimension::{Dim, U1}; use base::storage::ContiguousStorageMut; /// 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: ContiguousStorageMut + Clone; /// 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 reallocator. Changes the size of the memory buffer that initially contains (RFrom × /// CFrom) elements to a smaller or larger size (RTo, CTo). pub trait Reallocator : Allocator + Allocator { /// Reallocates a buffer of shape `(RTo, CTo)`, possibly reusing a previously allocated buffer /// `buf`. Data stored by `buf` are linearly copied to the output: /// /// * The copy is performed as if both were just arrays (without a matrix structure). /// * If `buf` is larger than the output size, then extra elements of `buf` are truncated. /// * If `buf` is smaller than the output size, then extra elements of the output are left /// uninitialized. unsafe fn reallocate_copy( nrows: RTo, ncols: CTo, buf: >::Buffer, ) -> >::Buffer; } /// 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. pub trait SameShapeAllocator : Allocator + Allocator, SameShapeC> where R1: Dim, R2: Dim, C1: Dim, C2: Dim, N: Scalar, ShapeConstraint: SameNumberOfRows + SameNumberOfColumns, { } impl SameShapeAllocator for DefaultAllocator where R1: Dim, R2: Dim, C1: Dim, C2: Dim, N: Scalar, DefaultAllocator: Allocator + Allocator, SameShapeC>, ShapeConstraint: SameNumberOfRows + SameNumberOfColumns, { } // XXX: Bad name. /// Restricts the given number of rows to be equal. pub trait SameShapeVectorAllocator : Allocator + Allocator> + SameShapeAllocator where R1: Dim, R2: Dim, N: Scalar, ShapeConstraint: SameNumberOfRows, { } impl SameShapeVectorAllocator for DefaultAllocator where R1: Dim, R2: Dim, N: Scalar, DefaultAllocator: Allocator + Allocator>, ShapeConstraint: SameNumberOfRows, { }