with Abstract_Ring,Generic_Vectors;
generic
with package Ring is new Abstract_Ring(<>);
with package Vectors is new Generic_Vectors(Ring);
package Generic_Matrices is
-- DESCRIPTION :
-- An abstraction for matrices with coefficients over any ring.
use Ring; use Vectors;
type Matrix is array ( integer range <>, integer range <> ) of number;
type Link_to_Matrix is access Matrix;
-- COMPARISON AND COPYING :
function Equal ( a,b : Matrix ) return boolean;
-- DESCRIPTION :
-- Comparing by using the comparison operations of the Ring.
procedure Copy ( a : in Matrix; b : in out Matrix );
-- DESCRIPTION :
-- Makes a deep copy of the matrix a to the matrix b.
-- REQUIRED : a'range(1) = b'range(1) and a'range(2) = b'range(2).
-- MATRIX-MATRIX OPERATIONS :
function "+" ( a,b : Matrix ) return Matrix; -- return a+b
function "+" ( a : Matrix ) return Matrix; -- copies a
function "-" ( a,b : Matrix ) return Matrix; -- return a-b
function "-" ( a : Matrix ) return Matrix; -- return -a
function "*" ( a,b : Matrix ) return Matrix; -- return a*b
procedure Mul1 ( a : in out Matrix; b : in Matrix ); -- a := a*b
procedure Mul2 ( a : in Matrix; b : in out Matrix ); -- b := a*b
-- MATRIX-VECTOR OPERATIONS :
function "*" ( a : Matrix; v : Vector ) return Vector; -- return a*v
function "*" ( v : Vector; a : Matrix ) return Vector; -- return v*a
procedure Mul ( a : in Matrix; v : in out Vector ); -- v := a*v
procedure Mul ( v : in out Vector; a : in Matrix ); -- v := a*v
-- DESTRUCTORS :
procedure Clear ( a : in out Matrix );
procedure Clear ( a : in out Link_to_Matrix );
-- DESCRIPTION :
-- Deallocation of memory.
end Generic_Matrices;