# Implement left/right-multiplyany in the DenseMatrix base class

### Summary

This is a possible solution to the problem of implementing dense matrix multiply in case the type of the matrix could be either of static or dynamic size. The solution proposed here follows the design of the mdspan proposal by having two size function in the matrix classes, the regular `rows()`

and `cols()`

function as before, and additionally the functions `static_rows()`

and `static_cols()`

that are, as the same suggests, `static`

functions that can be implemented for all matrix types by defining the size as `Std::dynamic_extent`

(a special value, probably equal to -1) in case the size is available only as dynamic information. This static size information can be used, for example, to implement a matrix factory with specializations of dynamic and static extents.

The essential addition in this MR is the class `MatrixFactory`

, that is parametrized with the field type and the static sizes or the special value `Std::dynamic_extent`

. The latter means that the matrix does not have static size. This class defines a `::type`

alias to denote the matrix type to construct. And a `create(size_t,size_t,field_type=0)`

static function is provided that constructs the matrix type. The `MatrixFactory`

is specialized for row or column size is dynamic to return a `DynamicMatrix`

and otherwise return a `FieldMatrix`

.

The second addition are the static functions `static_rows()`

and `static_cols()`

that every matrix type derived from `DenseMatrix`

should provide. These either return the static dimensions, or the special value `Std::dynamic_extent`

. This is a pattern learned from `std::mdspan`

where an analog `static_extent`

static function is defined with the same behavior.

This MR is related to !1289 and !1360 where a different approach is followed.