Holders
Indefinite Holders#
The language-defined generic package Containers.Indefinite_Holders
provides a private type Holder
and a
set of operations for that type. A holder container holds a single element of an indefinite type.
A holder container allows the declaration of an object that can be used like an uninitialized variable or component of an indefinite type.
A holder container may be empty. An empty holder does not contain an element.
generic
type Element_Type (<>) is private;
with function "="(Left, Right: Element_Type) return Boolean is <>;
package Ada.Containers.Indefinite_Holders
with Preelaborate, Remote_Types, Nonblocking,
Global => in out synchronized is
type Holder is tagged private;
Empty_Holder: constant Holder;
function Equal_Element(Left, Right: Element_Type) return Boolean renames "=";
function "="(Left, Right: Holder) return Boolean;
function Tampering_With_The_Element_Prohibited(Container: Holder) return Boolean;
function Empty return Holder is
(Empty_Holder);
procedure Clear (Container: in out Holder);
procedure Replace_Element(Container: in out Holder; New_Item: Element_Type);
function To_Holder(New_Item: Element_Type) return Holder;
function Is_Empty(Container: Holder) return Boolean;
function Element (Container: Holder) return Element_Type;
procedure Query_Element(Container: Holder;
Process : not null access procedure(Element: Element_Type));
procedure Update_Element(Container: in out Holder;
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 Holder) return Constant_Reference_Type;
function Reference (Container: aliased in out Holder) return Reference_Type;
function Copy ( Source: Holder) return Holder;
procedure Assign(Target: in out Holder; Source: Holder);
procedure Move (Target: in out Holder; Source: in out Holder);
procedure Swap(Left, Right: in out Holder);
end Ada.Containers.Indefinite_Holders;
Bounded (Run-Time) Errors
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 the element of any Holder
parameter of the operation. Either
Program_Error
is raised, or the operation works as defined on the value of the Holder
either prior
to, or subsequent to, some or all of the modifications to the Holder
.
It is a bounded error to call any subprogram declared in the visible part of Containers.Indefinite_Holders
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
Execution is erroneous if the holder container 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.
Bounded Indefinite Holders#
The language-defined generic package Containers.Bounded_Indefinite_Holders
provides a private type
Holder
and a set of operations for that type. It provides the same operations as the package
Containers.Indefinite_Holders
(see A.18.18), with the difference that the maximum storage is bounded.
-- Following the generic parameter Element_Type
Max_Element_Size_in_Storage_Elements: Storage_Count;
Bounded (Run-Time) Errors
It is a bounded error to assign from a bounded holder object while tampering with elements of that object is
prohibited. Either Program_Error
is raised by the assignment, execution proceeds with the target object
prohibiting tampering with elements, or execution proceeds normally.