with Abstract_Ring;
generic
with package Ring is new Abstract_Ring(<>);
package Generic_Vectors is
-- DESCRIPTION :
-- An abstraction for vectors with coefficients over any ring.
-- The same functionality is provided for pointers to vectors.
use Ring;
type Vector is array ( integer range <> ) of number;
type Link_to_Vector is access Vector;
-- COMPARISON AND COPYING :
function Equal ( v1,v2 : Vector ) return boolean;
function Equal ( v1,v2 : Link_to_Vector ) return boolean;
procedure Copy ( v1 : in Vector; v2 : in out Vector );
procedure Copy ( v1 : in Link_to_Vector; v2 : in out Link_to_Vector );
-- ARITHMETIC OPERATIONS AS FUNCTIONS :
function "+" ( v1,v2 : Vector ) return Vector; -- return v1+v2;
function "+" ( v1,v2 : Link_to_Vector ) return Link_to_Vector;
function "+" ( v : Vector ) return Vector; -- return +v;
function "+" ( v : Link_to_Vector ) return Link_to_Vector;
function "-" ( v : Vector ) return Vector; -- return -v;
function "-" ( v : Link_to_Vector ) return Link_to_Vector;
function "-" ( v1,v2 : Vector ) return Vector; -- return v1-v2;
function "-" ( v1,v2 : Link_to_Vector ) return Link_to_Vector;
function "*" ( v : Vector; a : number ) return Vector; -- return v*a;
function "*" ( v : Link_to_Vector; a : number ) return Link_to_Vector;
function "*" ( a : number; v : Vector ) return Vector; -- return a*v;
function "*" ( a : number; v : Link_to_Vector ) return Link_to_Vector;
function "*" ( v1,v2 : Vector ) return number;
function "*" ( v1,v2 : Link_to_Vector ) return number;
-- returns the inner product of the vectors v1 and v2;
-- requires v1 /= null /= v2, in case of link_to_vector.
function "*" ( v1,v2 : Vector ) return Vector;
function "*" ( v1,v2 : Link_to_Vector ) return Link_to_Vector;
-- returns the vector v, with v(k) = v1(k)*v2(k);
-- requires v1 /= null /= v2, in case of link_to_vector.
function Sum ( v : Vector ) return number;
function Sum ( v : Link_to_Vector ) return number;
-- returns the sum of all components of v;
-- ARITHMETIC OPERATIONS AS PROCEDURES :
procedure Add ( v1 : in out Vector; v2 : in Vector ); -- v1 := v1+v2
procedure Add ( v1 : in out Link_to_Vector; v2 : in Link_to_Vector );
procedure Min ( v : in out Vector); -- v := -v
procedure Min ( v : in out Link_to_Vector );
procedure Sub ( v1 : in out Vector; v2 : in Vector ); -- v1 := v1-v2
procedure Sub ( v1 : in out Link_to_Vector; v2 : in Link_to_Vector );
procedure Mul ( v : in out Vector; a : in number ); -- v := v*a
procedure Mul ( v : in out Link_to_Vector; a : in number );
procedure Mul ( v1 : in out Vector; v2 : in Vector ); -- v1 := v1*v2
procedure Mul ( v1 : in out Link_to_Vector; v2 : in Link_to_Vector );
-- DESTRUCTORS :
procedure Clear ( v : in out Vector );
procedure Clear ( v : in out Link_to_Vector );
end Generic_Vectors;