Overview of Ada 2022
4.2 Container operation contracts
As described in the Contracts section (
Container
operation contracts (AI12-0112)
– see
3.3), expresses the checks to
be performed upon entry to a container's subprograms using Ada 2012 preconditions
rather than English.
All container operations
now have versions with the container as the first parameter. This allows
a more specific global contract to be specified. Thus:
function Next (Position : Cursor) return Cursor
with Nonblocking, Global => in all, ...
but:
function Next (Container : Vector; Position : Cursor)
return Cursor
with Nonblocking, Global => null, ...
The former has to allow anything to be read as the
container is not explicitly identified, whereas the latter does not access
any globals. The two parameter version also has the benefit of allowing
prefix notation to be used. The new versions include Element,
Query_Element, Next
and Previous for vectors and lists; Key,
Element, Query_Element,
Next and (if ordered) Previous
for maps; Element, Query_Element,
Next and (if ordered) Previous
for sets; and Subtree_Node_Count, Element,
Query_Element, Next_Sibling
and Previous_Sibling for multiway trees. If
the cursor points to a different container to the one given, then Program_Error
is raised.
Consider the following
example:
package String_Indexes is
new Indefinite_Hashed_Maps (Key_Type => String,
...
My_Index : constant String_Indexes.Map := String_Indexes.Empty_Map;
function Long_Strings_Count
(The_Index : String_Indexes.Map;
Min_Length : Positive) return Natural is
Count : Natural := 0;
begin
for My_Cursor in The_Index.Iterate loop
if String_Indexes.Key (Position =>
My_Cursor)'Length >= Min_Length then
Count := Count + 1;
end if;
end loop;
return Count;
end Long_Strings_Count;
Note the incongruous mixing of OO-style prefix notation
in The_Index.Iterate and traditional notation
in String_Indexes.Key. In Ada 2022 the latter
can be replaced by The_Index.Key, thus allowing
the consistent use of prefix notation.
© 2021, 2022 Jeff Cousins