-- $Date: 2004/01/10 11:49:40 $
-- $Revision: 1.5 $
-- $Author: jcrocholl $

generic

   -- Generic type for simple numbers.
   -- Can be Integer or Float, for example.
   type Number is private;

   -- Generic value for the zero number.
   -- Can be 0 or 0.0, for example.
   Zero : Number;

   -- Convert a number to a string.
   with function To_String
     (A : in Number-- Convert this number.
     return String   -- The string representation.
     is <>;

   -- Calculate the square root of a non-negative number.
   with function Sqrt
     (A : in Number-- Non-negative input value.
     return Number   -- Square root of input value.
     is <>;

   -- with function "abs"(A : in Number) return Number is <>;

   with function "+"(A : in Number) return Number is <>;
   with function "-"(A : in Number) return Number is <>;

   with function "+"(A, B : in Number) return Number is <>;
   with function "-"(A, B : in Number) return Number is <>;
   with function "*"(A, B : in Number) return Number is <>;
   with function "/"(A, B : in Number) return Number is <>;

   with function ">"(A, B : in Number) return Boolean is <>;
   with function "<"(A, B : in Number) return Boolean is <>;
   with function ">="(A, B : in Number) return Boolean is <>;
   with function "<="(A, B : in Number) return Boolean is <>;
   with function "="(A, B : in Number) return Boolean is <>;

package Vectors is

   ----------
   -- Vectors
   ----------

   -- A two-dimensional vector.
   type Vector is record
      X, Y : Number;
   end record;

   -- Unary operators.
   function "+"(A : in Vector) return Vector;
   function "-"(A : in Vector) return Vector;

   -- Addition and substraction.
   function "+"(A, B : in Vector) return Vector;
   function "-"(A, B : in Vector) return Vector;

   -- Multiplication for corresponding components.
   function "*"(A, B : in Vector) return Vector;

   -- Operations with scalars.
   function "*"(A : in Vector; B : in Number) return Vector;
   function "*"(A : in Number; B : in Vector) return Vector;
   function "/"(A : in Vector; B : in Number) return Vector;
   function "abs"(A : in Vector) return Number;

   -- Convert a vector to a string.
   function To_String
     (A : in Vector-- Convert this vector.
     return String;  -- The string representation.

   --------
   -- Boxes
   --------

   -- A rectangular box, specified by coordinates of left bottom and
   -- right top corner. Orientation is similar to postscript: X
   -- values increase from left to right, Y values increase from
   -- bottom to top.
   type Box is record
      Left   : Number-- Minimum value of horizontal coordinates.
      Bottom : Number-- Minimum value of vertical coordinates.
      Right  : Number-- Maximum value of horizontal coordinates.
      Top    : Number-- Maximum value of vertical coordinates.
   end record;

   -- Calculate the width of the box.
   function Get_Width
     (This : in Box-- Calculate width of this box.
     return Number;  -- Difference between right and left.

   -- Calculate the height of the box.
   function Get_Height
     (This : in Box-- Calculate height of this box.
     return Number;  -- Difference between top and bottom.

   -- Get the bottom left corner.
   function Get_Bottom_Left
     (This : in Box-- Get corner from this box.
     return Vector;  -- A vector containing left and bottom.

   -- Get the top right corner.
   function Get_Top_Right
     (This : in Box-- Get corner from this box.
     return Vector;  -- A vector containing right and top.

end Vectors;