A.18.11 The Generic Package Containers.Indefinite_Vectors
{
AI95-00302-03}
The language-defined generic package Containers.Indefinite_Vectors provides
a private type Vector and a set of operations. It provides the same operations
as the package Containers.Vectors (see
A.18.2),
with the difference that the generic formal Element_Type is indefinite.
Static Semantics
{
AI95-00302-03}
{
AI05-0092-1}
The declaration of the generic library package Containers.Indefinite_Vectors
has the same contents and semantics as Containers.Vectors except:
The generic formal Element_Type is indefinite.
The procedures with
the profiles:
procedure Insert (Container : in out Vector;
Before : in Extended_Index;
Count : in Count_Type := 1);
procedure Insert (Container : in out Vector;
Before : in Cursor;
Position : out Cursor;
Count : in Count_Type := 1);
are omitted.
Discussion: These procedures are omitted
because there is no way to create a default-initialized object of an
indefinite type. Note that Insert_Space can be used instead of this routine
in most cases. Omitting the routine completely allows any problems to
be diagnosed by the compiler when converting from a definite to indefinite
vector.
The actual Element parameter of access subprogram
Process of Update_Element may be constrained even if Element_Type is
unconstrained.
{
AI12-0035-1}
The operations "&", Append, Insert, Prepend, Replace_Element,
and To_Vector that have a formal parameter of type Element_Type perform
indefinite insertion (see
A.18).
Returns True if tampering with elements is prohibited
for Container, and False otherwise.
Reason: Complete replacement of an element
can cause its memory to be deallocated while another operation is holding
onto a reference to it. That can't be allowed. However, a simple modification
of (part of) an element is not a problem, so Update_Element does not
cause a problem.
{
AI12-0111-1}
{
AI12-0112-1}
Tampering_With_Cursors_Prohibited is replaced by Tampering_With_Elements_Prohibited
in the postcondition for the operations Reference and Constant_Reference.
{
AI12-0111-1}
The operations Replace_Element, Reverse_Elements, and Swap, and the nested
generic unit Generic_Sorting are omitted from the nested package Stable.
Extensions to Ada 95
{
AI95-00302-03}
The generic package Containers.Indefinite_Vectors
is new.
Inconsistencies With Ada 2012
{
AI12-0035-1}
Corrigendum: Defined some routines to “perform
indefinite insertion”. This could mean that some calls to those
routines would now raise Program_Error where they previously worked.
However, this is extremely unlikely, as it would require that the package
was not implemented in Ada (an Ada
allocator
would raise Program_Error in these circumstances), and that a program
inserted a more nested tagged type (or access discriminant) into a container,
and then used that object before its type or discriminant went out of
scope. All known implementations are implemented in Ada, so we believe
there is no practical incompatibility. As such, we mention this only
for completeness.
{
AI12-0111-1}
Defined the Iterator_View aspect, so that the stable view is used for
container element iterators. This means that tampering with elements
is prohibited during the entire loop, rather than tampering with cursors
being prohibited during the loop, and tampering with elements being prohibited
only during the lifetimes of references to the loop parameter. Thus,
if a container element iterator does an operation that tampers with elements
on the iterated container, that operation will fail a tampering check
in Ada 2022 (and thus raise Program_Error), while it would have worked
in Ada 2012 so long as the loop parameter is not involved. We believe
this to be a dubious loop structure that should be rare. Note that this
issue only occurs for the indefinite container form, the ordinary and
bounded containers allow such operations at any time in Ada 2022.
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe