Doubly_Linked_Lists#
The language-defined generic package Containers.Doubly_Linked_Lists
provides private types List
and
Cursor
, and a set of operations for each type. A list container is optimized for insertion and deletion at any
position.
A doubly-linked list container object manages a linked list of internal nodes, each of which contains an element and pointers to the next (successor) and previous (predecessor) internal nodes. A cursor designates a particular node within a list (and by extension the element contained in that node). A cursor keeps designating the same node (and element) as long as the node is part of the container, even if the node is moved in the container.
The length of a list is the number of elements it contains.
with Ada.Iterator_Interfaces;
generic
type Element_Type is private;
with function "="(Left, Right: Element_Type) return Boolean is <>;
package Ada.Containers.Doubly_Linked_Lists is
with Preelaborate, Remote_Types, Nonblocking,
Global => in out synchronized is
type List is tagged private;
type Cursor is private;
Empty_List: constant List;
No_Element: constant Cursor;
function Has_Element( Position: Cursor) return Boolean;
function Has_Element(Container: List; Position: Cursor) return Boolean;
package List_Iterator_Interfaces is new Ada.Iterator_Interfaces(Cursor, Has_Element);
function "="(Left, Right: List) return Boolean;
function Tampering_With_Cursors_Prohibited (Container: List) return Boolean;
function Tampering_With_Elements_Prohibited(Container: List) return Boolean;
function Empty return List is
(Empty_List);
function Length (Container: List) return Count_Type;
function Is_Empty(Container: List) return Boolean;
procedure Clear(Container: in out List);
function Element( Position: Cursor) return Element_Type;
function Element(Container: List; Position: Cursor) return Element_Type;
procedure Replace_Element(Container: in out List; Position: Cursor; New_item: Element_Type);
procedure Query_Element(Position: Cursor;
Process : not null access procedure(Element: Element_Type));
procedure Query_Element(Container: List;
Position : Cursor;
Process : not null access procedure(Element: Element_Type));
procedure Update_Element(Container: in out List;
Position : Cursor;
Process : not null access procedure(Element: in out Element_Type));
type Constant_Reference_Type(Element: not null access constant Element_Type) is private;
type Reference_Type (Element: not null access Element_Type) is private;
function Constant_Reference(Container: aliased List; Position: Cursor) return Constant_Reference_Type;
function Reference (Container: aliased in out List; Position: Cursor) return Reference_Type;
procedure Assign(Target: in out List; Source: List);
function Copy(Source: List) return List;
procedure Move(Target: in out List; Source: in out List);
procedure Insert(Container: in out List;
Before : Cursor;
New_Item : Element_Type;
Position : out Cursor;
Count : Count_Type := 1);
procedure Insert (Container: in out List; Before: Cursor; Position: out Cursor ; Count: Count_Type := 1);
procedure Insert (Container: in out List; Before: Cursor; New_Item: Element_Type; Count: Count_Type := 1);
procedure Prepend(Container: in out List ; New_Item: Element_Type; Count: Count_Type := 1);
procedure Append (Container: in out List ; New_Item: Element_Type; Count: Count_Type := 1);
procedure Append (Container: in out List ; New_Item: Element_Type);
procedure Delete (Container: in out List; Position : in out Cursor; Count: Count_Type := 1);
procedure Delete_First(Container: in out List; Count: Count_Type := 1);
procedure Delete_Last (Container: in out List; Count: Count_Type := 1);
procedure Reverse_Elements(Container: in out List);
procedure Swap (Container: in out List; I, J: Cursor);
procedure Swap_Links(Container: in out List; I, J: Cursor);
procedure Splice(Target: in out List; Before: Cursor; Source: in out List);
procedure Splice(Target: in out List; Before: Cursor; Source: in out List; Position: in out Cursor);
procedure Splice(Container: in out List; Before: Cursor; Position: Cursor);
function First (Container: List) return Cursor;
function First_Element(Container: List) return Element_Type;
function Last (Container: List) return Cursor;
function Last_Element (Container: List) return Element_Type;
function Next (Position: Cursor) return Cursor;
function Previous(Position: Cursor) return Cursor;
function Next (Container: List; Position: Cursor) return Cursor;
function Previous(Container: List; Position: Cursor) return Cursor;
procedure Next(Position: in out Cursor);
procedure Next(Container: List; Position: in out Cursor);
procedure Previous(Position: in out Cursor);
procedure Previous(Container: List; Position: in out Cursor);
function Find (Container: List; Item: Element_Type; Position: Cursor := No_Element) return Cursor;
function Reverse_Find(Container: List; Item: Element_Type; Position: Cursor := No_Element) return Cursor;
function Contains(Container: List; Item: Element_Type) return Boolean;
procedure Iterate (Container: List; Process: not null access procedure(Position: Cursor));
procedure Reverse_Iterate(Container: List; Process: not null access procedure(Position: Cursor));
function Iterate(Container: List) return List_Iterator_Interfaces.Parallel_Reversible_Iterator'Class;
function Iterate(Container: List; Start: Cursor) return List_Iterator_Interfaces.Reversible_Iterator'Class;
generic
with function "<"(Left, Right: Element_Type) return Boolean is <>;
package Generic_Sorting
with Nonblocking, Global => null is
function Is_Sorted(Container: List) return Boolean;
procedure Sort(Container: in out List);
procedure Merge(Target: in out List; Source: in out List);
end Generic_Sorting;
package Stable is
type List(Base: not null access Doubly_Linked_Lists.List) is tagged limited private;
type Cursor is private;
Empty_List: constant List;
No_Element: constant Cursor;
function Has_Element(Position: Cursor) return Boolean;
package List_Iterator_Interfaces is new Ada.Iterator_Interfaces(Cursor, Has_Element);
procedure Assign(Target: in out Doubly_Linked_Lists.List; Source: List);
function Copy(Source: Doubly_Linked_Lists.List) return List;
type Constant_Reference_Type(Element: not null access constant Element_Type) is private;
type Reference_Type (Element: not null access Element_Type) is private;
end Stable;
end Ada.Containers.Doubly_Linked_Lists;
Bounded (Run-Time) Errors
Calling Merge
in an instance of Generic_Sorting
with either Source
or Target
not
ordered smallest first using the provided generic formal "<"
operator is a bounded error. Either
Program_Error
is raised after Target
is updated as described for Merge
, or the operation
works as defined.
It is a bounded error for the actual function associated with a generic formal subprogram, when called as part of an
operation of this package, to tamper with elements of any List
parameter of the operation. Either
Program_Error
is raised, or the operation works as defined on the value of the List
either prior to,
or subsequent to, some or all of the modifications to the List
.
It is a bounded error to call any subprogram declared in the visible part of Containers.Doubly_Linked_Lists
when the associated container has been finalized. If the operation takes Container
as an in out parameter,
then it raises Constraint_Error
or Program_Error
. Otherwise, the operation either proceeds as it
would for an empty container, or it raises Constraint_Error
or Program_Error
.
Erroneous Execution
A Cursor
value is invalid if any of the following have occurred since it was created:
- The list that contains the element it designates has been finalized.
- The list that contains the element it designates has been used as the Target of a call to
Assign
, or as the target of an assignment_statement. - The list that contains the element it designates has been used as the
Source
orTarget
of a call toMove
. - The element it designates has been removed from the list that previously contained the element.
The result of "="
or Has_Element
is unspecified if it is called with an invalid cursor parameter.
Execution is erroneous if any other subprogram declared in Containers.Doubly_Linked_Lists
is called with an
invalid cursor parameter.
Execution is erroneous if the list associated with the result of a call to Reference
or
Constant_Reference
is finalized before the result object returned by the call to Reference
or
Constant_Reference
is finalized.
Indefinite Double-Linked Lists#
The language-defined generic package Containers.Indefinite_Doubly_Linked_Lists
provides private types
List
and Cursor
, and a set of operations for each type. It provides the same operations as the package
Containers.Doubly_Linked_Lists
(see A.18.3), with the difference that the generic formal
Element_Type
is indefinite.
procedure Insert(Container: in out List;
Before : Cursor;
Position : out Cursor;
Count : Count_Type := 1);
Bounded Doubly-Linked Lists#
The language-defined generic package Containers.Bounded_Doubly_Linked_Lists
provides a private type List
and a set of operations. It provides the same operations as the package Containers.Doubly_Linked_Lists
(see
A.18.3), with the difference that the maximum storage is bounded.
type List(Capacity: Count_Type) is tagged private...
function Empty(Capacity: Count_Type := <implementation-defined>) return List;
function Copy(Source: List; Capacity: Count_Type := 0) return List;
Bounded (Run-Time) Errors
It is a bounded error to assign from a bounded list object while tampering with elements [or cursors] of that object
is prohibited. Either Program_Error
is raised by the assignment, execution proceeds with the target object
prohibiting tampering with elements [or cursors], or execution proceeds normally.
Erroneous Execution
When a bounded list object L
is finalized, if tampering with cursors is prohibited for L
other than
due to an assignment from another list, then execution is erroneous.