--::::::::::
--lilpbadv.ads  -- list_lpbase-Advanced
--::::::::::
generic
package List_LPBase.Advanced is

type EQ_Type is access function (L, R: Object_Type) return boolean;

function Identical (List_1, List_2: LPList_Type;
                    Equal:          EQ_Type) return boolean;
   ------------------------------------------------------------------
   -- Pre Cond : None
   -- Post Cond: returns (#(List_1) = #(List_2), FORALL i IN 1..#(List_1)
   --             List_1(i) = List_2(i)
   -- Exception: None
   ------------------------------------------------------------------

function Size (List: LPList_Type) return integer;
   ------------------------------------------------------------------
   -- Pre Cond : None
   -- Post Cond: returns the number of objects in the list
   -- Exception: None
   ------------------------------------------------------------------

procedure Insert (Object  : in out Object_Type;
                  Position: in     positive;
                  List    : in     LPList_Type);
   ---------------------------------------------------------------------
   -- Pre  Cond : 1 <= Position <= Size (List)
   -- Post Cond : List'=(a ,...,a          ,Object,a        ,...,a )
   --                     1      position-1         position      n
   -- Exceptions: constraint_error
   -- NOTE:   Swap used to exchange value of Object_Type
   ---------------------------------------------------------------------

procedure Remove (List    : in     LPList_Type;
                  Position: in     positive;
                  Object  : in out Object_Type);
   ---------------------------------------------------------------------
   -- Pre  Cond : 1 <= Position <= Size (List)
   -- Post Cond : List'=(a ,...,a          ,a          ,...,a )
   --                     1      position-1  position+1      n
   --             Object' = List(position)
   -- Exceptions: constraint_error
   -- NOTE:   Swap used to exchange value of Object_Type
   ---------------------------------------------------------------------

function Peek (List : LPList_Type;
               Index: positive) return Object_Type;
   ------------------------------------------------------------------
   -- Pre Cond : List /= {}, 1 <= Index <= #(List)
   -- Post Cond: Returns List(Index)
   -- Exception: List_Underflow or constraint_error
   ------------------------------------------------------------------

procedure Poke (List  : in out LPList_Type;
                Index : in     positive;
                Object: in out Object_Type);
   ----------------------------------------------------------------
   -- Pre Cond : 1 <= Index <= #(List)
   -- Post Cond: List(Index)' = Object
   -- Exception: constraint_error
   -- NOTE:   Swap used to exchange value of Object_Type
   ------------------------------------------------------------------

end List_LPBase.Advanced;