Справочник по Ada (Ada 2022)
A.18.6 Общий пакет Containers.Ordered_Maps
Статическая семантика
Общий библиотечный пакет Containers.Ordered_Maps имеет следующее объявление:
with Ada.Iterator_Interfaces;
generic
type Key_Type is private;
type Element_Type is private;
with function "<" (Left, Right : Key_Type) return Boolean is <>;
with function "=" (Left, Right : Element_Type) return Boolean is <>;
package Ada.Containers.Ordered_Maps
with Preelaborate, Remote_Types,
Nonblocking, Global => in out synchronized is
generic
type Key_Type is private;
type Element_Type is private;
with function "<" (Left, Right : Key_Type) return Boolean is <>;
with function "=" (Left, Right : Element_Type) return Boolean is <>;
package Ada.Containers.Ordered_Maps
with Preelaborate, Remote_Types,
Nonblocking, Global => in out synchronized is
function Equivalent_Keys (Left, Right : Key_Type) return Boolean
is (not ((Left < Right) or (Right < Left)));
is (not ((Left < Right) or (Right < Left)));
type Map is tagged private
with Constant_Indexing => Constant_Reference,
Variable_Indexing => Reference,
Default_Iterator => Iterate,
Iterator_Element => Element_Type,
Iterator_View => Stable.Map,
Aggregate => (Empty => Empty,
Add_Named => Insert),
Stable_Properties => (Length,
Tampering_With_Cursors_Prohibited,
Tampering_With_Elements_Prohibited),
Default_Initial_Condition =>
Length (Map) = 0 and then
(not Tampering_With_Cursors_Prohibited (Map)) and then
(not Tampering_With_Elements_Prohibited (Map)),
Preelaborable_Initialization;
with Constant_Indexing => Constant_Reference,
Variable_Indexing => Reference,
Default_Iterator => Iterate,
Iterator_Element => Element_Type,
Iterator_View => Stable.Map,
Aggregate => (Empty => Empty,
Add_Named => Insert),
Stable_Properties => (Length,
Tampering_With_Cursors_Prohibited,
Tampering_With_Elements_Prohibited),
Default_Initial_Condition =>
Length (Map) = 0 and then
(not Tampering_With_Cursors_Prohibited (Map)) and then
(not Tampering_With_Elements_Prohibited (Map)),
Preelaborable_Initialization;
type Cursor is private
with Preelaborable_Initialization;
with Preelaborable_Initialization;
Empty_Map : constant Map;
No_Element : constant Cursor;
function Has_Element (Position : Cursor) return Boolean
with Nonblocking, Global => in all, Use_Formal => null;
with Nonblocking, Global => in all, Use_Formal => null;
function Has_Element (Container : Map; Position : Cursor)
return Boolean
with Nonblocking, Global => null, Use_Formal => null;
return Boolean
with Nonblocking, Global => null, Use_Formal => null;
package Map_Iterator_Interfaces is new
Ada.Iterator_Interfaces (Cursor, Has_Element);
Ada.Iterator_Interfaces (Cursor, Has_Element);
function "=" (Left, Right : Map) return Boolean;
function Tampering_With_Cursors_Prohibited
(Container : Map) return Boolean
with Nonblocking, Global => null, Use_Formal => null;
(Container : Map) return Boolean
with Nonblocking, Global => null, Use_Formal => null;
function Tampering_With_Elements_Prohibited
(Container : Map) return Boolean
with Nonblocking, Global => null, Use_Formal => null;
(Container : Map) return Boolean
with Nonblocking, Global => null, Use_Formal => null;
function Empty return Map
is (Empty_Map)
with Post =>
not Tampering_With_Elements_Prohibited (Empty'Result) and then
not Tampering_With_Cursors_Prohibited (Empty'Result) and then
Length (Empty'Result) = 0;
is (Empty_Map)
with Post =>
not Tampering_With_Elements_Prohibited (Empty'Result) and then
not Tampering_With_Cursors_Prohibited (Empty'Result) and then
Length (Empty'Result) = 0;
function Length (Container : Map) return Count_Type
with Nonblocking, Global => null, Use_Formal => null;
with Nonblocking, Global => null, Use_Formal => null;
function Is_Empty (Container : Map) return Boolean
with Nonblocking, Global => null, Use_Formal => null,
Post => Is_Empty'Result = (Length (Container) = 0);
with Nonblocking, Global => null, Use_Formal => null,
Post => Is_Empty'Result = (Length (Container) = 0);
procedure Clear (Container : in out Map)
with Pre => not Tampering_With_Cursors_Prohibited (Container)
or else raise Program_Error,
Post => Length (Container) = 0;
with Pre => not Tampering_With_Cursors_Prohibited (Container)
or else raise Program_Error,
Post => Length (Container) = 0;
function Key (Position : Cursor) return Key_Type
with Pre => Position /= No_Element or else raise Constraint_Error,
Nonblocking, Global => in all, Use_Formal => Key_Type;
with Pre => Position /= No_Element or else raise Constraint_Error,
Nonblocking, Global => in all, Use_Formal => Key_Type;
function Key (Container : Map;
Position : Cursor) return Key_Type
with Pre => (Position /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Position)
or else raise Program_Error),
Nonblocking, Global => null, Use_Formal => Key_Type;
Position : Cursor) return Key_Type
with Pre => (Position /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Position)
or else raise Program_Error),
Nonblocking, Global => null, Use_Formal => Key_Type;
function Element (Position : Cursor) return Element_Type
with Pre => Position /= No_Element or else raise Constraint_Error,
Nonblocking, Global => null, Use_Formal => Element_Type;
with Pre => Position /= No_Element or else raise Constraint_Error,
Nonblocking, Global => null, Use_Formal => Element_Type;
function Element (Container : Map;
Position : Cursor) return Element_Type
with Pre => (Position /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Position)
or else raise Program_Error),
Nonblocking, Global => null, Use_Formal => Element_Type;
Position : Cursor) return Element_Type
with Pre => (Position /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Position)
or else raise Program_Error),
Nonblocking, Global => null, Use_Formal => Element_Type;
procedure Replace_Element (Container : in out Map;
Position : in Cursor;
New_item : in Element_Type)
with Pre => (not Tampering_With_Elements_Prohibited (Container)
or else raise Program_Error) and then
(Position /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Position)
or else raise Program_Error);
Position : in Cursor;
New_item : in Element_Type)
with Pre => (not Tampering_With_Elements_Prohibited (Container)
or else raise Program_Error) and then
(Position /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Position)
or else raise Program_Error);
procedure Query_Element
(Position : in Cursor;
Process : not null access procedure (Key : in Key_Type;
Element : in Element_Type))
with Pre => Position /= No_Element
or else raise Constraint_Error,
Global => in all;
(Position : in Cursor;
Process : not null access procedure (Key : in Key_Type;
Element : in Element_Type))
with Pre => Position /= No_Element
or else raise Constraint_Error,
Global => in all;
procedure Query_Element
(Container : in Map;
Position : in Cursor;
Process : not null access procedure (Key : in Key_Type;
Element : in Element_Type))
with Pre => (Position /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Position)
or else raise Program_Error);
(Container : in Map;
Position : in Cursor;
Process : not null access procedure (Key : in Key_Type;
Element : in Element_Type))
with Pre => (Position /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Position)
or else raise Program_Error);
procedure Update_Element
(Container : in out Map;
Position : in Cursor;
Process : not null access procedure
(Key : in Key_Type;
Element : in out Element_Type))
with Pre => (Position /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Position)
or else raise Program_Error);
(Container : in out Map;
Position : in Cursor;
Process : not null access procedure
(Key : in Key_Type;
Element : in out Element_Type))
with Pre => (Position /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Position)
or else raise Program_Error);
type Constant_Reference_Type
(Element : not null access constant Element_Type) is private
with Implicit_Dereference => Element,
Nonblocking, Global => in out synchronized,
Default_Initial_Condition => (raise Program_Error);
(Element : not null access constant Element_Type) is private
with Implicit_Dereference => Element,
Nonblocking, Global => in out synchronized,
Default_Initial_Condition => (raise Program_Error);
type Reference_Type (Element : not null access Element_Type) is private
with Implicit_Dereference => Element,
Nonblocking, Global => in out synchronized,
Default_Initial_Condition => (raise Program_Error);
with Implicit_Dereference => Element,
Nonblocking, Global => in out synchronized,
Default_Initial_Condition => (raise Program_Error);
function Constant_Reference (Container : aliased in Map;
Position : in Cursor)
return Constant_Reference_Type
with Pre => (Position /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Position)
or else raise Program_Error),
Post => Tampering_With_Cursors_Prohibited (Container),
Nonblocking, Global => null, Use_Formal => null;
Position : in Cursor)
return Constant_Reference_Type
with Pre => (Position /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Position)
or else raise Program_Error),
Post => Tampering_With_Cursors_Prohibited (Container),
Nonblocking, Global => null, Use_Formal => null;
function Reference (Container : aliased in out Map;
Position : in Cursor)
return Reference_Type
with Pre => (Position /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Position)
or else raise Program_Error),
Post => Tampering_With_Cursors_Prohibited (Container),
Nonblocking, Global => null, Use_Formal => null;
Position : in Cursor)
return Reference_Type
with Pre => (Position /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Position)
or else raise Program_Error),
Post => Tampering_With_Cursors_Prohibited (Container),
Nonblocking, Global => null, Use_Formal => null;
function Constant_Reference (Container : aliased in Map;
Key : in Key_Type)
return Constant_Reference_Type
with Pre => Find (Container, Key) /= No_Element
or else raise Constraint_Error,
Post => Tampering_With_Cursors_Prohibited (Container),
Nonblocking, Global => null, Use_Formal => null;
Key : in Key_Type)
return Constant_Reference_Type
with Pre => Find (Container, Key) /= No_Element
or else raise Constraint_Error,
Post => Tampering_With_Cursors_Prohibited (Container),
Nonblocking, Global => null, Use_Formal => null;
function Reference (Container : aliased in out Map;
Key : in Key_Type)
return Reference_Type
with Pre => Find (Container, Key) /= No_Element
or else raise Constraint_Error,
Post => Tampering_With_Cursors_Prohibited (Container),
Nonblocking, Global => null, Use_Formal => null;
Key : in Key_Type)
return Reference_Type
with Pre => Find (Container, Key) /= No_Element
or else raise Constraint_Error,
Post => Tampering_With_Cursors_Prohibited (Container),
Nonblocking, Global => null, Use_Formal => null;
procedure Assign (Target : in out Map; Source : in Map)
with Pre => not Tampering_With_Cursors_Prohibited (Target)
or else raise Program_Error,
Post => Length (Source) = Length (Target);
with Pre => not Tampering_With_Cursors_Prohibited (Target)
or else raise Program_Error,
Post => Length (Source) = Length (Target);
function Copy (Source : Map)
return Map
with Post =>
Length (Copy'Result) = Length (Source) and then
not Tampering_With_Elements_Prohibited (Copy'Result) and then
not Tampering_With_Cursors_Prohibited (Copy'Result);
return Map
with Post =>
Length (Copy'Result) = Length (Source) and then
not Tampering_With_Elements_Prohibited (Copy'Result) and then
not Tampering_With_Cursors_Prohibited (Copy'Result);
procedure Move (Target : in out Map;
Source : in out Map)
with Pre => (not Tampering_With_Cursors_Prohibited (Target)
or else raise Program_Error) and then
(not Tampering_With_Cursors_Prohibited (Source)
or else raise Program_Error),
Post => (if not Target'Has_Same_Storage (Source) then
Length (Target) = Length (Source'Old) and then
Length (Source) = 0);
Source : in out Map)
with Pre => (not Tampering_With_Cursors_Prohibited (Target)
or else raise Program_Error) and then
(not Tampering_With_Cursors_Prohibited (Source)
or else raise Program_Error),
Post => (if not Target'Has_Same_Storage (Source) then
Length (Target) = Length (Source'Old) and then
Length (Source) = 0);
procedure Insert (Container : in out Map;
Key : in Key_Type;
New_Item : in Element_Type;
Position : out Cursor;
Inserted : out Boolean)
with Pre => (not Tampering_With_Cursors_Prohibited (Container)
or else raise Program_Error) and then
(Length (Container) <= Count_Type'Last - 1
or else raise Constraint_Error),
Post => (declare
Original_Length : constant Count_Type :=
Length (Container)'Old;
begin
Has_Element (Container, Position) and then
(if Inserted then
Length (Container) = Original_Length + 1
else
Length (Container) = Original_Length));
END_OF_DOCUMENT_MARKER Key : in Key_Type;
New_Item : in Element_Type;
Position : out Cursor;
Inserted : out Boolean)
with Pre => (not Tampering_With_Cursors_Prohibited (Container)
or else raise Program_Error) and then
(Length (Container) <= Count_Type'Last - 1
or else raise Constraint_Error),
Post => (declare
Original_Length : constant Count_Type :=
Length (Container)'Old;
begin
Has_Element (Container, Position) and then
(if Inserted then
Length (Container) = Original_Length + 1
else
Length (Container) = Original_Length));
процедура Insert (Container : in out Map;
Key : in Key_Type;
Position : out Cursor;
Inserted : out Boolean)
с Pre => (не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error) и затем
(Length (Container) <= Count_Type'Last - 1
иначе поднять Constraint_Error),
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начало
Has_Element (Container, Position) и затем
(если Inserted then
Length (Container) = Original_Length + 1
иначе
Length (Container) = Original_Length));
Key : in Key_Type;
Position : out Cursor;
Inserted : out Boolean)
с Pre => (не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error) и затем
(Length (Container) <= Count_Type'Last - 1
иначе поднять Constraint_Error),
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начало
Has_Element (Container, Position) и затем
(если Inserted then
Length (Container) = Original_Length + 1
иначе
Length (Container) = Original_Length));
процедура Insert (Container : in out Map;
Key : in Key_Type;
New_Item : in Element_Type)
с Pre => (не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error) и затем
(Length (Container) <= Count_Type'Last - 1
иначе поднять Constraint_Error),
Post => Length (Container) = Length (Container)'Old + 1;
Key : in Key_Type;
New_Item : in Element_Type)
с Pre => (не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error) и затем
(Length (Container) <= Count_Type'Last - 1
иначе поднять Constraint_Error),
Post => Length (Container) = Length (Container)'Old + 1;
процедура Include (Container : in out Map;
Key : in Key_Type;
New_Item : in Element_Type)
с Pre => (не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error) и затем
(Length (Container) <= Count_Type'Last - 1
иначе поднять Constraint_Error),
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начало
Length (Container)
в Original_Length | Original_Length + 1);
Key : in Key_Type;
New_Item : in Element_Type)
с Pre => (не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error) и затем
(Length (Container) <= Count_Type'Last - 1
иначе поднять Constraint_Error),
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начало
Length (Container)
в Original_Length | Original_Length + 1);
процедура Replace (Container : in out Map;
Key : in Key_Type;
New_Item : in Element_Type)
с Pre => не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error,
Post => Length (Container) = Length (Container)'Old;
Key : in Key_Type;
New_Item : in Element_Type)
с Pre => не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error,
Post => Length (Container) = Length (Container)'Old;
процедура Exclude (Container : in out Map;
Key : in Key_Type)
с Pre => не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error,
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начало
Length (Container)
в Original_Length - 1 | Original_Length);
Key : in Key_Type)
с Pre => не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error,
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начало
Length (Container)
в Original_Length - 1 | Original_Length);
процедура Delete (Container : in out Map;
Key : in Key_Type)
с Pre => не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error,
Post => Length (Container) = Length (Container)'Old - 1;
Key : in Key_Type)
с Pre => не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error,
Post => Length (Container) = Length (Container)'Old - 1;
процедура Delete (Container : in out Map;
Position : in out Cursor)
с Pre => (не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error) и затем
(Position /= No_Element
иначе поднять Constraint_Error) и затем
(Has_Element (Container, Position)
иначе поднять Program_Error),
Post => Length (Container) = Length (Container)'Old - 1 и затем
Position = No_Element;
Position : in out Cursor)
с Pre => (не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error) и затем
(Position /= No_Element
иначе поднять Constraint_Error) и затем
(Has_Element (Container, Position)
иначе поднять Program_Error),
Post => Length (Container) = Length (Container)'Old - 1 и затем
Position = No_Element;
процедура Delete_First (Container : in out Map)
с Pre => не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error,
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начало
(если Original_Length = 0 то Length (Container) = 0
иначе Length (Container) = Original_Length - 1));
с Pre => не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error,
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начало
(если Original_Length = 0 то Length (Container) = 0
иначе Length (Container) = Original_Length - 1));
процедура Delete_Last (Container : in out Map)
с Pre => не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error,
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начало
(если Original_Length = 0 то Length (Container) = 0
иначе Length (Container) = Original_Length - 1));
с Pre => не Tampering_With_Cursors_Prohibited (Container)
иначе поднять Program_Error,
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начало
(если Original_Length = 0 то Length (Container) = 0
иначе Length (Container) = Original_Length - 1));
функция First (Container : Map) возвращает Cursor
с Nonblocking, Global => null, Use_Formal => null,
Post => (если не Is_Empty (Container)
то Has_Element (Container, First'Result)
иначе First'Result = No_Element);
с Nonblocking, Global => null, Use_Formal => null,
Post => (если не Is_Empty (Container)
то Has_Element (Container, First'Result)
иначе First'Result = No_Element);
функция First_Element (Container : Map) возвращает Element_Type
с Pre => (не Is_Empty (Container)
иначе поднять Constraint_Error);
с Pre => (не Is_Empty (Container)
иначе поднять Constraint_Error);
функция First_Key (Container : Map) возвращает Key_Type
с Pre => (не Is_Empty (Container)
иначе поднять Constraint_Error);
с Pre => (не Is_Empty (Container)
иначе поднять Constraint_Error);
функция Last (Container : Map) возвращает Cursor
с Nonblocking, Global => null, Use_Formal => null,
Post => (если не Is_Empty (Container)
то Has_Element (Container, Last'Result)
иначе Last'Result = No_Element);
с Nonblocking, Global => null, Use_Formal => null,
Post => (если не Is_Empty (Container)
то Has_Element (Container, Last'Result)
иначе Last'Result = No_Element);
функция Last_Element (Container : Map) возвращает Element_Type
с Pre => (не Is_Empty (Container)
иначе поднять Constraint_Error);
с Pre => (не Is_Empty (Container)
иначе поднять Constraint_Error);
функция Last_Key (Container : Map) возвращает Key_Type
с Pre => (не Is_Empty (Container)
иначе поднять Constraint_Error);
с Pre => (не Is_Empty (Container)
иначе поднять Constraint_Error);
функция Next (Position : Cursor) возвращает Cursor
с Nonblocking, Global => во всех, Use_Formal => null,
Post => (если Position = No_Element то Next'Result = No_Element);
с Nonblocking, Global => во всех, Use_Formal => null,
Post => (если Position = No_Element то Next'Result = No_Element);
функция Next (Container : Map;
Position : Cursor) возвращает Cursor
с Nonblocking, Global => null, Use_Formal => null,
Pre => Position = No_Element или
Has_Element (Container, Position)
иначе поднять Program_Error,
Post => (если Position = No_Element то Next'Result = No_Element
иначе если Next'Result = No_Element то
Position = Last (Container)
иначе Has_Element (Container, Next'Result));
Position : Cursor) возвращает Cursor
с Nonblocking, Global => null, Use_Formal => null,
Pre => Position = No_Element или
Has_Element (Container, Position)
иначе поднять Program_Error,
Post => (если Position = No_Element то Next'Result = No_Element
иначе если Next'Result = No_Element то
Position = Last (Container)
иначе Has_Element (Container, Next'Result));
процедура Next (Position : in out Cursor)
с Nonblocking, Global => во всех, Use_Formal => null;
с Nonblocking, Global => во всех, Use_Formal => null;
процедура Next (Container : in Map;
Position : in out Cursor)
с Nonblocking, Global => null, Use_Formal => null,
Pre => Position = No_Element или
Has_Element (Container, Position)
иначе поднять Program_Error,
Post => (если Position /= No_Element
то Has_Element (Container, Position));
Position : in out Cursor)
с Nonblocking, Global => null, Use_Formal => null,
Pre => Position = No_Element или
Has_Element (Container, Position)
иначе поднять Program_Error,
Post => (если Position /= No_Element
то Has_Element (Container, Position));
функция Previous (Position : Cursor) возвращает Cursor
с Nonblocking, Global => во всех, Use_Formal => null,
Post => (если Position = No_Element то
Previous'Result = No_Element);
с Nonblocking, Global => во всех, Use_Formal => null,
Post => (если Position = No_Element то
Previous'Result = No_Element);
функция Previous (Container : Map;
Position : Cursor) возвращает Cursor
с Nonblocking, Global => null, Use_Formal => null,
Pre => Position = No_Element или
Has_Element (Container, Position)
иначе поднять Program_Error,
Post => (если Position = No_Element то
Previous'Result = No_Element
иначе если Previous'Result = No_Element то
Position = First (Container)
иначе Has_Element (Container, Previous'Result));
Position : Cursor) возвращает Cursor
с Nonblocking, Global => null, Use_Formal => null,
Pre => Position = No_Element или
Has_Element (Container, Position)
иначе поднять Program_Error,
Post => (если Position = No_Element то
Previous'Result = No_Element
иначе если Previous'Result = No_Element то
Position = First (Container)
иначе Has_Element (Container, Previous'Result));
процедура Previous (Position : in out Cursor)
с Nonblocking, Global => во всех, Use_Formal => null;
с Nonblocking, Global => во всех, Use_Formal => null;
процедура Previous (Container : in Map;
Position : in out Cursor)
с Nonblocking, Global => null, Use_Formal => null,
Pre => Position = No_Element или
Has_Element (Container, Position)
иначе поднять Program_Error,
Post => (если Position /= No_Element
то Has_Element (Container, Position));
Position : in out Cursor)
с Nonblocking, Global => null, Use_Formal => null,
Pre => Position = No_Element или
Has_Element (Container, Position)
иначе поднять Program_Error,
Post => (если Position /= No_Element
то Has_Element (Container, Position));
функция Find (Container : Map;
Key : Key_Type) возвращает Cursor
с Post => (если Find'Result /= No_Element
то Has_Element (Container, Find'Result));
Key : Key_Type) возвращает Cursor
с Post => (если Find'Result /= No_Element
то Has_Element (Container, Find'Result));
функция Element (Container : Map;
Key : Key_Type) возвращает Element_Type;
Key : Key_Type) возвращает Element_Type;
функция Floor (Container : Map;
Key : Key_Type) возвращает Cursor
с Post => (если Floor'Result /= No_Element
то Has_Element (Container, Floor'Result));
Key : Key_Type) возвращает Cursor
с Post => (если Floor'Result /= No_Element
то Has_Element (Container, Floor'Result));
функция Ceiling (Container : Map;
Key : Key_Type) возвращает Cursor
с Post => (если Ceiling'Result /= No_Element
то Has_Element (Container, Ceiling'Result));
Key : Key_Type) возвращает Cursor
с Post => (если Ceiling'Result /= No_Element
то Has_Element (Container, Ceiling'Result));
функция Contains (Container : Map;
Key : Key_Type) возвращает Boolean;
Key : Key_Type) возвращает Boolean;
Этот абзац был удален.
функция "<" (Left, Right : Cursor) возвращает Boolean
с Pre => (Left /= No_Element и затем Right /= No_Element)
иначе поднять Constraint_Error,
Global => во всех;
с Pre => (Left /= No_Element и затем Right /= No_Element)
иначе поднять Constraint_Error,
Global => во всех;
функция ">" (Left, Right : Cursor) возвращает Boolean
с Pre => (Left /= No_Element и затем Right /= No_Element)
иначе поднять Constraint_Error,
Global => во всех;
с Pre => (Left /= No_Element и затем Right /= No_Element)
иначе поднять Constraint_Error,
Global => во всех;
функция "<" (Left : Cursor; Right : Key_Type) возвращает Boolean
с Pre => Left /= No_Element иначе поднять Constraint_Error,
Global => во всех;
с Pre => Left /= No_Element иначе поднять Constraint_Error,
Global => во всех;
функция ">" (Left : Cursor; Right : Key_Type) возвращает Boolean
с Pre => Left /= No_Element иначе поднять Constraint_Error,
Global => во всех;
с Pre => Left /= No_Element иначе поднять Constraint_Error,
Global => во всех;
функция "<" (Left : Key_Type; Right : Cursor) возвращает Boolean
с Pre => Right /= No_Element иначе поднять Constraint_Error,
Global => во всех;
с Pre => Right /= No_Element иначе поднять Constraint_Error,
Global => во всех;
функция ">" (Left : Key_Type; Right : Cursor) возвращает Boolean
с Pre => Right /= No_Element иначе поднять Constraint_Error,
Global => во всех;
с Pre => Right /= No_Element иначе поднять Constraint_Error,
Global => во всех;
процедура Iterate
(Container : in Map;
Process : не пустое доступ к процедуре (Position : in Cursor))
с Allows_Exit;
(Container : in Map;
Process : не пустое доступ к процедуре (Position : in Cursor))
с Allows_Exit;
процедура Reverse_Iterate
(Container : in Map;
Process : не пустое доступ к процедуре (Position : in Cursor))
с Allows_Exit;
(Container : in Map;
Process : не пустое доступ к процедуре (Position : in Cursor))
с Allows_Exit;
функция Iterate (Container : in Map)
возвращает Map_Iterator_Interfaces.Parallel_Reversible_Iterator'Class
с Post => Tampering_With_Cursors_Prohibited (Container);
END_OF_DOCUMENT_MARKER возвращает Map_Iterator_Interfaces.Parallel_Reversible_Iterator'Class
с Post => Tampering_With_Cursors_Prohibited (Container);
функция Iterate (Container : вход Map; Start : вход Cursor)
возвращает Map_Iterator_Interfaces.Reversible_Iterator'Class
с Pre => (Start /= No_Element
или иначе выбросить Constraint_Error) и затем
(Has_Element (Container, Start)
или иначе выбросить Program_Error),
Post => Tampering_With_Cursors_Prohibited (Container);
возвращает Map_Iterator_Interfaces.Reversible_Iterator'Class
с Pre => (Start /= No_Element
или иначе выбросить Constraint_Error) и затем
(Has_Element (Container, Start)
или иначе выбросить Program_Error),
Post => Tampering_With_Cursors_Prohibited (Container);
пакет Stable есть
тип Map (Base : не null доступ Ordered_Maps.Map) есть
меченный ограниченный закрытый
с Constant_Indexing => Constant_Reference,
Variable_Indexing => Reference,
Default_Iterator => Iterate,
Iterator_Element => Element_Type,
Stable_Properties => (Length),
Global => null,
Default_Initial_Condition => Length (Map) = 0,
Preelaborable_Initialization;
меченный ограниченный закрытый
с Constant_Indexing => Constant_Reference,
Variable_Indexing => Reference,
Default_Iterator => Iterate,
Iterator_Element => Element_Type,
Stable_Properties => (Length),
Global => null,
Default_Initial_Condition => Length (Map) = 0,
Preelaborable_Initialization;
тип Cursor есть закрытый
с Preelaborable_Initialization;
с Preelaborable_Initialization;
Empty_Map : константа Map;
No_Element : константа Cursor;
функция Has_Element (Position : Cursor) возвращает Boolean
с Nonblocking, Global => во всех, Use_Formal => null;
с Nonblocking, Global => во всех, Use_Formal => null;
пакет Map_Iterator_Interfaces новый
Ada.Iterator_Interfaces (Cursor, Has_Element);
Ada.Iterator_Interfaces (Cursor, Has_Element);
процедура Assign (Target : вход-выход Ordered_Maps.Map;
Source : вход Map)
с Post => Length (Source) = Length (Target);
Source : вход Map)
с Post => Length (Source) = Length (Target);
функция Copy (Source : Ordered_Maps.Map) возвращает Map
с Post => Length (Copy'Result) = Length (Source);
с Post => Length (Copy'Result) = Length (Source);
тип Constant_Reference_Type
(Element : не null доступ к константе Element_Type) есть закрытый
с Implicit_Dereference => Element,
Nonblocking, Global => null, Use_Formal => null,
Default_Initial_Condition => (выбросить Program_Error);
(Element : не null доступ к константе Element_Type) есть закрытый
с Implicit_Dereference => Element,
Nonblocking, Global => null, Use_Formal => null,
Default_Initial_Condition => (выбросить Program_Error);
тип Reference_Type
(Element : не null доступ Element_Type) есть закрытый
с Implicit_Dereference => Element,
Nonblocking, Global => null, Use_Formal => null,
Default_Initial_Condition => (выбросить Program_Error);
(Element : не null доступ Element_Type) есть закрытый
с Implicit_Dereference => Element,
Nonblocking, Global => null, Use_Formal => null,
Default_Initial_Condition => (выбросить Program_Error);
-- Дополнительные подпрограммы, как описано в тексте
-- объявляются здесь.
-- объявляются здесь.
закрытый
... -- не указано языком
конец Stable;
закрытый
... -- не указано языком
конец Ada.Containers.Ordered_Maps;
Два ключа K1 и K2 являются эквивалентными, если оба K1 < K2 и K2 < K1 возвращают False, используя универсальный формальный оператор "<" для ключей. Функция Equivalent_Keys возвращает True, если Left и Right эквивалентны, и False в противном случае.
Ожидается, что фактическая функция для универсального формального оператора "<" по значениям Key_Type каждый раз возвращает то же значение, когда она вызывается с конкретной парой значений ключа. Она должна определять отношение строгой слабой упорядоченности (см. A.18). Если фактический оператор "<" ведет себя каким-либо иным образом, поведение этого пакета не определено. Какие подпрограммы этого пакета вызывают "<" и сколько раз они это делают, не определено.
Если значение ключа, хранящегося в карте, изменяется иначе, чем операцией в этом пакете, так что по крайней мере один из операторов "<" или "=" даёт разные результаты, поведение этого пакета не определено.
Первый узел непустой карты — это тот, ключ которого меньше ключа всех остальных узлов в карте. Последний узел непустой карты — это тот, ключ которого больше ключа всех остальных элементов в карте. Преемник узла — это узел с наименьшим ключом, который больше ключа данного узла. Предшественник узла — это узел с наибольшим ключом, который меньше ключа данного узла. Все сравнения выполняются с использованием универсального формального оператора "<" для ключей.
функция Copy (Source : Map)
возвращает Map
с Post =>
Length (Copy'Result) = Length (Source) и затем
не Tampering_With_Elements_Prohibited (Copy'Result) и затем
не Tampering_With_Cursors_Prohibited (Copy'Result);
возвращает Map
с Post =>
Length (Copy'Result) = Length (Source) и затем
не Tampering_With_Elements_Prohibited (Copy'Result) и затем
не Tampering_With_Cursors_Prohibited (Copy'Result);
Возвращает карту, ключи и элементы которой инициализированы из соответствующих ключей и элементов Source.
процедура Delete_First (Container : вход-выход Map)
с Pre => не Tampering_With_Cursors_Prohibited (Container)
или иначе выбросить Program_Error,
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начать
(если Original_Length = 0 то Length (Container) = 0
иначе Length (Container) = Original_Length - 1));
с Pre => не Tampering_With_Cursors_Prohibited (Container)
или иначе выбросить Program_Error,
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начать
(если Original_Length = 0 то Length (Container) = 0
иначе Length (Container) = Original_Length - 1));
Если Container пуста, Delete_First не оказывает никакого влияния. В противном случае, узел, обозначенный First (Container), удаляется из Container. Delete_First изменяет курсоры Container.
процедура Delete_Last (Container : вход-выход Map)
с Pre => не Tampering_With_Cursors_Prohibited (Container)
или иначе выбросить Program_Error,
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начать
(если Original_Length = 0 то Length (Container) = 0
иначе Length (Container) = Original_Length - 1));
с Pre => не Tampering_With_Cursors_Prohibited (Container)
или иначе выбросить Program_Error,
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начать
(если Original_Length = 0 то Length (Container) = 0
иначе Length (Container) = Original_Length - 1));
Если Container пуста, Delete_Last не оказывает никакого влияния. В противном случае, узел, обозначенный Last (Container), удаляется из Container. Delete_Last изменяет курсоры Container.
функция First_Element (Container : Map) возвращает Element_Type
с Pre => (не Is_Empty (Container)
или иначе выбросить Constraint_Error);
с Pre => (не Is_Empty (Container)
или иначе выбросить Constraint_Error);
Эквивалентно Element (First (Container)).
функция First_Key (Container : Map) возвращает Key_Type
с Pre => (не Is_Empty (Container)
или иначе выбросить Constraint_Error);
с Pre => (не Is_Empty (Container)
или иначе выбросить Constraint_Error);
Эквивалентно Key (First (Container)).
функция Last (Container : Map) возвращает Cursor
с Nonblocking, Global => null, Use_Formal => null,
Post => (если не Is_Empty (Container)
то Has_Element (Container, Last'Result)
иначе Last'Result = No_Element);
с Nonblocking, Global => null, Use_Formal => null,
Post => (если не Is_Empty (Container)
то Has_Element (Container, Last'Result)
иначе Last'Result = No_Element);
Возвращает курсор, который обозначает последний узел в Container. Если Container пуста, возвращает No_Element.
функция Last_Element (Container : Map) возвращает Element_Type
с Pre => (не Is_Empty (Container)
или иначе выбросить Constraint_Error);
с Pre => (не Is_Empty (Container)
или иначе выбросить Constraint_Error);
Эквивалентно Element (Last (Container)).
функция Last_Key (Container : Map) возвращает Key_Type
с Pre => (не Is_Empty (Container)
или иначе выбросить Constraint_Error);
с Pre => (не Is_Empty (Container)
или иначе выбросить Constraint_Error);
Эквивалентно Key (Last (Container)).
функция Previous (Position : Cursor) возвращает Cursor
с Nonblocking, Global => во всех, Use_Formal => null,
Post => (если Position = No_Element то
Previous'Result = No_Element);
с Nonblocking, Global => во всех, Use_Formal => null,
Post => (если Position = No_Element то
Previous'Result = No_Element);
Если Position равно No_Element, то Previous возвращает No_Element. В противном случае Previous возвращает курсор, обозначающий предшествующий узел обозначенному Position. Если Position обозначает первый элемент, то Previous возвращает No_Element.
функция Previous (Container : Map;
Position : Cursor) возвращает Cursor
с Nonblocking, Global => null, Use_Formal => null,
Pre => Position = No_Element или иначе
Has_Element (Container, Position)
или иначе выбросить Program_Error,
Post => (если Position = No_Element то
Previous'Result = No_Element
иначе Previous'Result = No_Element то
Position = First (Container)
иначе Has_Element (Container, Previous'Result));
Position : Cursor) возвращает Cursor
с Nonblocking, Global => null, Use_Formal => null,
Pre => Position = No_Element или иначе
Has_Element (Container, Position)
или иначе выбросить Program_Error,
Post => (если Position = No_Element то
Previous'Result = No_Element
иначе Previous'Result = No_Element то
Position = First (Container)
иначе Has_Element (Container, Previous'Result));
Возвращает курсор, обозначающий предшествующий узел, обозначенный Position в Container, если такой есть.
процедура Previous (Position : вход-выход Cursor)
с Nonblocking, Global => во всех, Use_Formal => null;
с Nonblocking, Global => во всех, Use_Formal => null;
Эквивалентно Position := Previous (Position).
процедура Previous (Container : вход Map;
Position : вход-выход Cursor)
с Nonblocking, Global => null, Use_Formal => null,
Pre => Position = No_Element или иначе
Has_Element (Container, Position)
или иначе выбросить Program_Error,
Post => (если Position /= No_Element
то Has_Element (Container, Position));
Position : вход-выход Cursor)
с Nonblocking, Global => null, Use_Formal => null,
Pre => Position = No_Element или иначе
Has_Element (Container, Position)
или иначе выбросить Program_Error,
Post => (если Position /= No_Element
то Has_Element (Container, Position));
Эквивалентно Position := Previous (Container, Position).
функция Floor (Container : Map;
Key : Key_Type) возвращает Cursor
с Post => (если Floor'Result /= No_Element
то Has_Element (Container, Floor'Result));
Key : Key_Type) возвращает Cursor
с Post => (если Floor'Result /= No_Element
то Has_Element (Container, Floor'Result));
Floor ищет последний узел, ключ которого не больше Key, используя универсальный формальный оператор "<" для ключей. Если такой узел найден, возвращается курсор, который его обозначает. В противном случае возвращается No_Element.
функция Ceiling (Container : Map;
Key : Key_Type) возвращает Cursor
с Post => (если Ceiling'Result /= No_Element
то Has_Element (Container, Ceiling'Result));
Key : Key_Type) возвращает Cursor
с Post => (если Ceiling'Result /= No_Element
то Has_Element (Container, Ceiling'Result));
Ceiling ищет первый узел, ключ которого не меньше Key, используя универсальный формальный оператор "<" для ключей. Если такой узел найден, возвращается курсор, который его обозначает. В противном случае возвращается No_Element.
функция "<" (Left, Right : Cursor) возвращает Boolean
с Pre => (Left /= No_Element и затем Right /= No_Element)
или иначе выбросить Constraint_Error,
Global => во всех;
с Pre => (Left /= No_Element и затем Right /= No_Element)
или иначе выбросить Constraint_Error,
Global => во всех;
Эквивалентно Key (Left) < Key (Right).
function ">" (Left, Right : Cursor) return Boolean
with Pre => (Left /= No_Element and then Right /= No_Element)
or else raise Constraint_Error,
Global => in all;
with Pre => (Left /= No_Element and then Right /= No_Element)
or else raise Constraint_Error,
Global => in all;
Эквивалентно Key (Right) < Key (Left).
function "<" (Left : Cursor; Right : Key_Type) return Boolean
with Pre => Left /= No_Element or else raise Constraint_Error,
Global => in all;
with Pre => Left /= No_Element or else raise Constraint_Error,
Global => in all;
Эквивалентно Key (Left) < Right.
function ">" (Left : Cursor; Right : Key_Type) return Boolean
with Pre => Left /= No_Element or else raise Constraint_Error,
Global => in all;
with Pre => Left /= No_Element or else raise Constraint_Error,
Global => in all;
Эквивалентно Right < Key (Left).
function "<" (Left : Key_Type; Right : Cursor) return Boolean
with Pre => Right /= No_Element or else raise Constraint_Error,
Global => in all;
with Pre => Right /= No_Element or else raise Constraint_Error,
Global => in all;
Эквивалентно Left < Key (Right).
function ">" (Left : Key_Type; Right : Cursor) return Boolean
with Pre => Right /= No_Element or else raise Constraint_Error,
Global => in all;
with Pre => Right /= No_Element or else raise Constraint_Error,
Global => in all;
Эквивалентно Key (Right) < Left.
procedure Reverse_Iterate
(Container : in Map;
Process : not null access procedure (Position : in Cursor))
with Allows_Exit;
(Container : in Map;
Process : not null access procedure (Position : in Cursor))
with Allows_Exit;
Итерирует по узлам в Container так же, как и процедура Iterate, с той разницей, что узлы проходятся в порядке предшественников, начиная с последнего узла.
function Iterate (Container : in Map)
return Map_Iterator_Interfaces.Parallel_Reversible_Iterator'Class
with Post => Tampering_With_Cursors_Prohibited (Container);
return Map_Iterator_Interfaces.Parallel_Reversible_Iterator'Class
with Post => Tampering_With_Cursors_Prohibited (Container);
Iterate возвращает объект-итератор (см. 5.5.1), который будет генерировать значение для параметра цикла (см. 5.5.2), обозначающего каждый узел в Container, начиная с первого узла и перемещая курсор в соответствии с отношением преемственности при использовании в качестве итератора вперёд, и начиная с последнего узла и перемещая курсор в соответствии с отношением предшественника при использовании в качестве обратного итератора, и обрабатывая все узлы одновременно при использовании в качестве параллельного итератора. Изменение курсоров Container запрещено, пока существует объект итератора (в частности, в последовательности_операторов оператора цикла цикла, который обозначает этот объект). Объект итератора требует финализации.
function Iterate (Container : in Map; Start : in Cursor)
return Map_Iterator_Interfaces.Reversible_Iterator'Class
with Pre => (Start /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Start)
or else raise Program_Error),
Post => Tampering_With_Cursors_Prohibited (Container);
return Map_Iterator_Interfaces.Reversible_Iterator'Class
with Pre => (Start /= No_Element
or else raise Constraint_Error) and then
(Has_Element (Container, Start)
or else raise Program_Error),
Post => Tampering_With_Cursors_Prohibited (Container);
Iterate возвращает объект обратимого итератора (см. 5.5.1), который будет генерировать значение для параметра цикла (см. 5.5.2), обозначающего каждый узел в Container, начиная с узла, обозначенного Start, и перемещая курсор в соответствии с отношением преемственности при использовании в качестве прямого итератора, или перемещая курсор в соответствии с отношением предшественника при использовании в качестве обратного итератора. Изменение курсоров Container запрещено, пока существует объект итератора (в частности, в последовательности_операторов оператора цикла цикла, который обозначает этот объект). Объект итератора требует финализации.
Рекомендации по реализации
Если N — длина карты, то наихудшая временная сложность операций Element, Insert, Include, Replace, Delete, Exclude и Find, которые принимают ключ в качестве параметра, должна составлять O((log N)**2) или лучше. Наихудшая временная сложность подпрограмм, которые принимают параметр курсора, должна составлять O(1).