with Token_Package;
with List_Double_Iterator_Managed_Unbounded;
package Compilation_Unit is
    --=================================================================
    -- This packages provides a user with the neccessary operations  ==
    -- to support an abstract data type for an Ada compilation unit. ==
    -- These operations include the following :                      ==
    --    1. initializing an Ada compilation unit,                   ==
    --    2. appending a token (defined in Token_Package) to         ==
    --       an Ada compilation unit,                                ==
    --    3. appending TWO Ada compilation units, and                ==
    --    4. producing METRICS for a given Ada compilation unit.     ==
    --                                                               ==
    -- Exception SYNTAX_ERROR will be raised by PRODUCE_METRICS if   ==
    -- a SYNTAX_ERROR is found in a given Ada compilation unit.      ==
    --=================================================================

    type Ada_Compilation_Unit is limited private;

    procedure Initialize_Compilation_Unit
                 (Initialized_Unit : in out Ada_Compilation_Unit);

    procedure Add_Token_To_Compilation_Unit
                 (Token_To_Add : in Token_Package.Token;
                  Unit_To_Add_To : in out Ada_Compilation_Unit);

    procedure Add_Compilation_Units
                 (Added_Unit : in Ada_Compilation_Unit;
                  Unit_To_Add_To : in out Ada_Compilation_Unit);

    procedure Produce_Metrics
                 (This_Compilation_Unit : in out Ada_Compilation_Unit);

    Syntax_Error : exception;

private

    package New_List is new List_Double_Iterator_Managed_Unbounded
                               (Item => Token_Package.Token);

    type Ada_Compilation_Unit is new New_List.List;

end Compilation_Unit;