package body List_Polymorphic_Cntl.Advanced is function Size (List: List_Type) return integer is function Rec_Size (Point: Holder_Class_Ptr) return integer is begin -- Rec_Size if Point = null then return 0; else return 1+Rec_Size (Point.Next); end if; end Rec_Size; ---------------------------------------------------- begin -- Size return Rec_Size (List.Actual.all); end Size; ------------------------------------------------------- procedure Insert (Object : in out Place_Holder'Class; Position: in positive; List : in List_Type) is procedure Rec_Insert (Sublist: in List_Type; Count : in natural) is begin -- Rec_Insert if Count = Position then New_Head (Object, Sublist); else Rec_Insert (Tail_Of(Sublist), Count+1); end if; end Rec_Insert; ----------------------------------------------- begin -- Insert if Position > (Size (List)+1) then raise List_Underflow; elsif Position = (Size (List)+1) then Append (List, Object); else Rec_Insert (List, 1); end if; end Insert; -------------------------------------------------- procedure Remove (List : in List_Type; Position: in positive; Object : in out Holder_Class_Ptr) is procedure Rec_Remove (Sublist: in List_Type; Count : in natural) is begin -- Rec_Remove if Count = Position then Remove_Head (Sublist, Object); else Rec_Remove (Tail_Of(Sublist), Count+1); end if; end Rec_Remove; ----------------------------------------------- begin -- Remove if Position > Size(List) then raise constraint_error; else Rec_Remove (List, 1); end if; end Remove; --------------------------------------------------- procedure g_Remove (List : in List_Type; Position: in positive; Object : in out Extended_Type) is Ptr: Holder_Class_Ptr; begin -- g_Remove Remove (List, Position, Ptr); Object:= Extended_Type(Ptr.all); end g_Remove; --------------------------------------------------- procedure Poke (List : in out List_Type; Index : in positive; Object: in Place_Holder'Class) is procedure Rec_Poke (Sublist: in List_Type; Count : in natural) is begin -- Rec_Poke if Count = Index then Update_Head (Sublist, Object); else Rec_Poke (Tail_Of(Sublist), Count+1); end if; end Rec_Poke; ----------------------------------------------- begin -- Poke if List.Actual = null then raise List_Underflow; elsif Index > Size (List) then raise constraint_error; else Rec_Poke (List, 1); end if; end Poke; -------------------------------------------------- function Peek (List: List_Type; Index : positive) return Holder_Class_Ptr is --Answer: Holder_Class_Ptr; function Rec_Peek (Sublist: in List_Type; Count : in natural) return Holder_Class_Ptr is begin -- Rec_Peek if Count = Index then return Head_Of(Sublist); else return Rec_Peek (Tail_Of(Sublist), Count+1); end if; end Rec_Peek; ----------------------------------------------- begin -- Peek if List.Actual = null then raise List_Underflow; elsif Index > Size (List) then raise constraint_error; else return Rec_Peek(List, 1); end if; end Peek; -------------------------------------------------- function g_Peek (List : List_Type; Index: positive) return Extended_Type is begin -- g_Peek return Extended_Type(Peek(List, Index).all); end g_Peek; -------------------------------------------------- end List_Polymorphic_Cntl.Advanced;