Spec-Zone.ru › Ada 2022
Справочник по Ada (Ada 2022)

A.18.7 Множества

Определённые в языке обобщённые пакеты Containers.Hashed_Sets и Containers.Ordered_Sets предоставляют приватные типы Set и Cursor, а также набор операций для каждого типа. Контейнер множества позволяет хранить элементы произвольного типа без дублирования. Хэшированное множество использует функцию хэширования для организации элементов, в то время как упорядоченное множество упорядочивает свои элементы по заданному отношению.
В этом подпункте описаны объявления, общие для обоих видов множеств. См. A.18.8 для описания семантики, специфичной для Containers.Hashed_Sets, и A.18.9 для описания семантики, специфичной для Containers.Ordered_Sets.

Статическая семантика

Ожидается, что фактическая функция для обобщённого формального оператора «=» на значениях Element_Type определит рефлексивное и симметричное отношение и вернёт одно и то же значение результата каждый раз, когда она вызывается с определённой парой значений. Если она ведёт себя иным образом, то оператор «=» для значений множества возвращает неопределённое значение. Точные аргументы и количество вызовов этой обобщённой формальной функции оператором «=» для значений множества не определены.
Тип Set используется для представления множеств. Тип Set требует финализации (см. 7.6).
Множество содержит элементы. Курсоры множества обозначают элементы. Существует отношение эквивалентности на элементах, определение которого отличается для хэшированных и упорядоченных множеств. Множество никогда не содержит два или более эквивалентных элементов. Длина множества — это количество элементов, которые оно содержит.
Каждое непустое множество имеет два конкретных элемента, называемых первым элементом и последним элементом (которые могут совпадать). Каждый элемент, кроме последнего, имеет последующий элемент. Если нет других вмешательства операций, начиная с первого элемента и повторно переходя к последующему элементу, каждый элемент множества будет посещён ровно один раз до тех пор, пока не будет достигнут последний элемент. Точное определение этих терминов отличается для хэшированных и упорядоченных множеств.
Некоторые операции проверяют «вмешательство с курсорами» контейнера, потому что они зависят от того, чтобы множество элементов контейнера оставалось постоянным, и чтобы элементы контейнера не заменялись. Когда вмешательство с курсорами запрещено для конкретного объекта множества S, Program_Error распространяется при финализации S, а также при вызове, передающем S некоторым операциям этого пакета, как указано в предусловии такой операции.
Абзацы 8—14 удалены, так как теперь эти правила описаны в предусловиях.
Empty_Set представляет пустой объект Set. Его длина равна 0. Если объект типа Set не инициализирован иначе, он инициализируется таким же значением, как Empty_Set.
No_Element представляет курсор, который не обозначает ни одного элемента. Если объект типа Cursor не инициализирован иначе, он инициализируется таким же значением, как No_Element.
Примитивный оператор «=» для типа Cursor возвращает True, если оба курсора являются No_Element или обозначают один и тот же элемент в одном и том же контейнере.
Выполнение стандартной реализации атрибутов Input, Output, Read или Write типа Cursor вызывает Program_Error.
Set'Write для объекта множества S записывает Length(S) элементов множества в поток. Он также может записать дополнительную информацию о множестве.
Set'Read считывает представление множества из потока и присваивает Item множество с такой же длиной и элементами, как и записанное Set'Write.
function Has_Element (Position : Cursor) return Boolean
with Nonblocking, Global => in all, Use_Formal => null;
Возвращает True, если Position обозначает элемент, и False в противном случае.
function Has_Element (Container : Set; Position : Cursor)
return Boolean
with Nonblocking, Global => null, Use_Formal => null;
Возвращает True, если Position обозначает элемент в Container, и False в противном случае.
function "=" (Left, Right : Set) return Boolean;
Если Left и Right обозначают один и тот же объект множества, то функция возвращает True. Если Left и Right имеют разные длины, то функция возвращает False. В противном случае для каждого элемента E в Left функция возвращает False, если элемент, равный E (используя обобщённый формальный оператор равенства), отсутствует в Right. Если функция не возвратила результат после проверки всех элементов, то она возвращает True. Любое исключение, возникшее во время вычисления равенства элементов, распространяется.
function Equivalent_Sets (Left, Right : Set) return Boolean;
Если Left и Right обозначают один и тот же объект множества, то функция возвращает True. Если Left и Right имеют разные длины, то функция возвращает False. В противном случае для каждого элемента E в Left функция возвращает False, если элемент, эквивалентный E, отсутствует в Right. Если функция не возвратила результат после проверки всех элементов, то она возвращает True. Любое исключение, возникшее во время вычисления эквивалентности элементов, распространяется.
function Tampering_With_Cursors_Prohibited
(Container : Set) return Boolean
with Nonblocking, Global => null, Use_Formal => null;
Возвращает True, если вмешательство с курсорами в данный момент запрещено для Container, и False в противном случае.
function To_Set (New_Item : Element_Type) return Set
with Post => Length (To_Set'Result) = 1 and then
not Tampering_with_Cursors_Prohibited (To_Set'Result);
Возвращает множество, содержащее единственный элемент New_Item.
function Length (Container : Set) return Count_Type
with Nonblocking, Global => null, Use_Formal => null;
Возвращает количество элементов в Container.
function Is_Empty (Container : Set) return Boolean
with Nonblocking, Global => null, Use_Formal => null,
Post => Is_Empty'Result = (Length (Container) = 0);
Возвращает True, если Container пусто.
procedure Clear (Container : in out Set)
with Pre => not Tampering_With_Cursors_Prohibited (Container)
or else raise Program_Error,
Post => Length (Container) = 0;
Удаляет все элементы из Container.
function Element (Position : Cursor) return Element_Type
with Pre => Position /= No_Element or else raise Constraint_Error,
Nonblocking, Global => in all, Use_Formal => Element_Type;
Element возвращает элемент, обозначенный Position.
function Element (Container : Set;
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;
Element возвращает элемент, обозначенный Position.
procedure Replace_Element (Container : in out Set;
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);
Replace_Element присваивает New_Item элементу, обозначенному Position. Любое исключение, вызванное присвоением, распространяется. Для определения перекрываются ли параметры в вызове Replace_Element, параметр Container не считается перекрывающимся ни с каким объектом (в том числе и с самим собой).
procedure Query_Element
(Position : in Cursor;
Process : not null access procedure (Element : in Element_Type))
with Pre => Position /= No_Element
or else raise Constraint_Error,
Global => in all;
Query_Element вызывает Process.all с элементом, обозначенным Position, в качестве аргумента. Вмешательство с элементами множества, содержащего элемент, обозначенный Position, запрещено во время выполнения вызова Process.all. Любое исключение, вызванное Process.all, распространяется.
procedure Query_Element
(Container : in Set;
Position : in Cursor;
Process : not null access procedure (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);
Query_Element вызывает Process.all с ключом и элементом из узла, обозначенного Position, в качестве аргументов. Вмешательство с элементами Container запрещено во время выполнения вызова Process.all. Любое исключение, вызванное Process.all, распространяется.
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);
Тип Constant_Reference_Type требует финализации.
Этот абзац был удалён.
END_OF_DOCUMENT_MARKER
функция Constant_Reference (Container : алиас в Set;
Position : в Cursor)
возвращает Constant_Reference_Type
с Pre => (Position /= No_Element
или else поднять Constraint_Error) и затем
(Has_Element (Container, Position)
или else поднять Program_Error),
Post => Tampering_With_Cursors_Prohibited (Container),
Nonblocking, Global => null, Use_Formal => null;
Эта функция (в сочетании с аспектами Constant_Indexing и Implicit_Dereference) предоставляет удобный способ получить доступ для чтения к отдельному элементу набора, используя указатель.
Constant_Reference возвращает объект, дискриминанта которого является значением доступа, указывающим на элемент, на который указывает Position. Изменение курсоров Container запрещено, пока существует возвращаемый Constant_Reference объект и он не был завершен.
процедура Assign (Target : ввод-вывод Set; Source : ввод Set)
с Pre => не Tampering_With_Cursors_Prohibited (Target)
или else поднять Program_Error,
Post => Length (Source) = Length (Target);
Если Target обозначает тот же объект, что и Source, операция не оказывает никакого влияния. В противном случае элементы Source копируются в Target, как при операторе присваивания assignment_statement, присваивая Source значению Target.
процедура Move (Target : ввод-вывод Set;
Source : ввод-вывод Set)
с Pre => (не Tampering_With_Cursors_Prohibited (Target)
или else поднять Program_Error) и затем
(не Tampering_With_Cursors_Prohibited (Source)
или else поднять Program_Error),
Post => (если не Target'Has_Same_Storage (Source) то
Length (Target) = Length (Source'Old) и затем
Length (Source) = 0);
Если Target обозначает тот же объект, что и Source, операция не оказывает никакого влияния. В противном случае операция эквивалентна Assign (Target, Source) за которой следует Clear (Source).
процедура Insert (Container : ввод-вывод Set;
New_Item : ввод Element_Type;
Position : вывод Cursor;
Inserted : вывод Boolean)
с Pre => (не Tampering_With_Elements_Prohibited (Container)
или else поднять Program_Error) и затем
(Length (Container) <= Count_Type'Last - 1
или else поднять Constraint_Error),
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начать
Has_Element (Container, Position) и затем
(если Inserted то
Length (Container) = Original_Length + 1
иначе
Length (Container) = Original_Length));
Insert проверяет, присутствует ли элемент, эквивалентный New_Item, в Container. Если совпадение найдено, Inserted устанавливается в False, а Position указывает на соответствующий элемент. В противном случае Insert добавляет New_Item в Container; Inserted устанавливается в True, а Position указывает на только что вставленный элемент. Любое исключение, поднятое во время выделения, передаётся, и Container не изменяется.
процедура Insert (Container : ввод-вывод Set;
New_Item : ввод Element_Type)
с Pre => (не Tampering_With_Cursors_Prohibited (Container)
или else поднять Program_Error) и затем
(Length (Container) <= Count_Type'Last - 1
или else поднять Constraint_Error),
Post => Length (Container) = Length (Container)'Old + 1;
Insert вставляет New_Item в Container согласно четырёхпараметричному Insert, с той разницей, что если элемент, эквивалентный New_Item, уже находится в множестве, то Constraint_Error передаётся.
процедура Include (Container : ввод-вывод Set;
New_Item : ввод Element_Type)
с Pre => (не Tampering_With_Cursors_Prohibited (Container)
или else поднять Program_Error) и затем
(Length (Container) <= Count_Type'Last - 1
или else поднять Constraint_Error),
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начать
Length (Container)
в Original_Length | Original_Length + 1);
Include вставляет New_Item в Container, как в четырёхпараметрическом Insert, с той разницей, что если элемент, эквивалентный New_Item, уже присутствует в множестве, то он заменяется. Любое исключение, поднятое при присваивании, передаётся.
процедура Replace (Container : ввод-вывод Set;
New_Item : ввод Element_Type)
с Pre => не Tampering_With_Cursors_Prohibited (Container)
или else поднять Program_Error,
Post => Length (Container) = Length (Container)'Old;
Replace проверяет, присутствует ли элемент, эквивалентный New_Item, в множестве. Если совпадение найдено, этот элемент заменяется на New_Item; в противном случае, Constraint_Error передаётся.
процедура Exclude (Container : ввод-вывод Set;
Item : ввод Element_Type)
с Pre => не Tampering_With_Cursors_Prohibited (Container)
или else поднять Program_Error,
Post => (объявить
Original_Length : константа Count_Type :=
Length (Container)'Old;
начать
Length (Container) в
Original_Length - 1 | Original_Length);
Exclude проверяет, присутствует ли элемент, эквивалентный Item, в Container. Если совпадение найдено, Exclude удаляет элемент из множества.
процедура Delete (Container : ввод-вывод Set;
Item : ввод Element_Type)
с Pre => не Tampering_With_Cursors_Prohibited (Container)
или else поднять Program_Error,
Post => Length (Container) = Length (Container)'Old - 1;
Delete проверяет, присутствует ли элемент, эквивалентный Item, в Container. Если совпадение найдено, Delete удаляет элемент из множества; в противном случае, Constraint_Error передаётся.
процедура Delete (Container : ввод-вывод Set;
Position : ввод-вывод Cursor)
с Pre => (не Tampering_With_Cursors_Prohibited (Container)
или else поднять Program_Error) и затем
(Position /= No_Element
или else поднять Constraint_Error) и затем
(Has_Element (Container, Position)
или else поднять Program_Error),
Post => Length (Container) = Length (Container)'Old - 1 и затем
Position = No_Element;
Удаление удаляет элемент, обозначенный Позицией, из набора.
procedure Union (Target : in out Set;
Source : in Set)
with Pre => not Tampering_With_Cursors_Prohibited (Target)
or else raise Program_Error,
Post => Length (Target) <= Length (Target)'Old + Length (Source);
Объединение вставляет в Target элементы Source, которые не эквивалентны каким-либо элементам, уже имеющимся в Target.
function Union (Left, Right : Set) return Set
with Post => Length (Union'Result) <=
Length (Left) + Length (Right) and then
not Tampering_With_Cursors_Prohibited (Union'Result);
Возвращает множество, включающее все элементы из Left и элементы из Right, которые не эквивалентны каким-либо элементам из Left.
procedure Intersection (Target : in out Set;
Source : in Set)
with Pre => not Tampering_With_Cursors_Prohibited (Target)
or else raise Program_Error,
Post => Length (Target) <= Length (Target)'Old + Length (Source);
Пересечение удаляет из Target элементы Target, которые не эквивалентны каким-либо элементам из Source.
function Intersection (Left, Right : Set) return Set
with Post => Length (Intersection'Result) <=
Length (Left) + Length (Right) and then
not Tampering_With_Cursors_Prohibited (Intersection'Result);
Возвращает множество, включающее все элементы из Left, которые эквивалентны каким-либо элементам из Right.
procedure Difference (Target : in out Set;
Source : in Set)
with Pre => not Tampering_With_Cursors_Prohibited (Target)
or else raise Program_Error,
Post => Length (Target) <= Length (Target)'Old + Length (Source);
Если Target обозначает тот же объект, что и Source, то Difference очищает Target. В противном случае, оно удаляет из Target элементы, эквивалентные каким-либо элементам из Source.
function Difference (Left, Right : Set) return Set
with Post => Length (Difference'Result) <= Length (Left) +
Length (Right) and then
not Tampering_With_Cursors_Prohibited (Difference'Result);
Возвращает множество, включающее элементы из Left, которые не эквивалентны каким-либо элементам из Right.
procedure Symmetric_Difference (Target : in out Set;
Source : in Set)
with Pre => not Tampering_With_Cursors_Prohibited (Target)
or else raise Program_Error,
Post => Length (Target) <= Length (Target)'Old + Length (Source);
Если Target обозначает тот же объект, что и Source, то Symmetric_Difference очищает Target. В противном случае, она удаляет из Target элементы, эквивалентные каким-либо элементам из Source, и вставляет в Target элементы из Source, которые не эквивалентны каким-либо элементам из Target.
function Symmetric_Difference (Left, Right : Set) return Set
with Post => Length (Symmetric_Difference'Result) <=
Length (Left) + Length (Right) and then
not Tampering_With_Cursors_Prohibited (
Symmetric_Difference'Result);
Возвращает множество, включающее элементы из Left, которые не эквивалентны каким-либо элементам из Right, и элементы из Right, которые не эквивалентны каким-либо элементам из Left.
function Overlap (Left, Right : Set) return Boolean;
Если элемент из Left эквивалентен какому-либо элементу из Right, то Overlap возвращает True. В противном случае, возвращает False.
function Is_Subset (Subset : Set;
Of_Set : Set) return Boolean;
Если элемент подмножества не эквивалентен ни одному элементу основного множества, то Is_Subset возвращает False. В противном случае возвращает True.
function First (Container : Set) return Cursor
with Nonblocking, Global => null, Use_Formal => null,
Post => (if not Is_Empty (Container)
then Has_Element (Container, First'Result)
else First'Result = No_Element);
Если Length (Container) = 0, то First возвращает No_Element. В противном случае First возвращает курсор, указывающий на первый элемент в Container.
function Next (Position : Cursor) return Cursor
with Nonblocking, Global => in all, Use_Formal => null,
Post => (if Position = No_Element then Next'Result = No_Element);
Возвращает курсор, указывающий на преемника элемента, на который указывает Position. Если Position указывает на последний элемент, возвращается No_Element. Если Position равно No_Element, возвращается No_Element.
function Next (Container : Set;
Position : Cursor) return Cursor
with Nonblocking, Global => null, Use_Formal => null,
Pre => Position = No_Element or else
Has_Element (Container, Position)
or else raise Program_Error,
Post => (if Position = No_Element then Next'Result = No_Element
elsif Next'Result = No_Element then
Position = Last (Container)
else Has_Element (Container, Next'Result));
Возвращает курсор, указывающий на преемника узла, на который указывает Position в Container.
procedure Next (Position : in out Cursor)
with Nonblocking, Global => in all, Use_Formal => null;
Эквивалентно Position := Next (Position).
procedure Next (Container : in Set;
Position : in out Cursor)
with Nonblocking, Global => null, Use_Formal => null,
Pre => Position = No_Element or else
Has_Element (Container, Position)
or else raise Program_Error,
Post => (if Position /= No_Element
then Has_Element (Container, Position));
Эквивалентно Position := Next (Container, Position).
Этот абзац был удалён.
function Find (Container : Set;
Item : Element_Type) return Cursor
with Post => (if Find'Result /= No_Element
then Has_Element (Container, Find'Result));
Если Length (Container) равно 0, то Find возвращает No_Element. В противном случае Find проверяет, присутствует ли в Container элемент, эквивалентный Item. Если совпадение найдено, возвращается курсор, указывающий на соответствующий элемент; в противном случае возвращается No_Element.
function Contains (Container : Set;
Item : Element_Type) return Boolean;
Эквивалентно Find (Container, Item) /= No_Element.
Абзацы 83 и 84 были перемещены выше.
procedure Iterate
(Container : in Set;
Process : not null access procedure (Position : in Cursor))
with Allows_Exit;
Iterate вызывает Process.all с курсором, указывающим на каждый элемент в Container, начиная с первого элемента и перемещая курсор в соответствии с отношением преемства. В процессе выполнения вызова Process.all запрещается вмешиваться в курсоры Container. Любое исключение, возбуждённое Process.all, распространяется.
И Containers.Hashed_Set, и Containers.Ordered_Set объявляют вложенный обобщённый пакет Generic_Keys, который предоставляет операции для манипулирования множествами с использованием ключа (как правило, части элемента), а не целого элемента. Функция Key пакета Generic_Keys извлекает значение ключа из элемента. Ожидается, что она возвращает одно и то же значение каждый раз при вызове с конкретным элементом. Поведение Generic_Keys неопределено, если Key ведёт себя каким-либо иным образом.
Ожидается, что ключ однозначно определяет единственный класс эквивалентности для элементов. Поведение Generic_Keys неопределено, если формальные параметры этого пакета ведут себя каким-либо иным образом.
function Key (Position : Cursor) return Key_Type
with Pre => Position /= No_Element or else raise Constraint_Error,
Global => in all;
Эквивалентно Key (Element (Position)).
function Key (Container : Set;
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);
Эквивалентно Key (Element (Container, Position)).
Подпрограммы в пакете Generic_Keys, названные Contains, Find, Element, Delete и Exclude, эквивалентны соответствующим подпрограммам в родительском пакете, с той разницей, что для поиска элемента в множестве используется параметр Key.
procedure Replace (Container : in out Set;
Key : in Key_Type;
New_Item : in Element_Type)
with Pre => not Tampering_With_Cursors_Prohibited (Container)
or else raise Program_Error,
Post => Length (Container) = Length (Container)'Old;
Эквивалентно Replace_Element (Container, Find (Container, Key), New_Item).
procedure Update_Element_Preserving_Key
(Container : in out Set;
Position : in Cursor;
Process : not null access procedure
(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);
Update_Element_Preserving_Key использует Key для сохранения значения ключа K элемента, на который указывает Position. Затем Update_Element_Preserving_Key вызывает Process.all с этим элементом в качестве аргумента. В процессе выполнения вызова Process.all запрещается вмешиваться в курсоры Container. Любое исключение, возбуждённое Process.all, распространяется. После возвращения Process.all, Update_Element_Preserving_Key проверяет, определяет ли K тот же класс эквивалентности, что и новый элемент; если нет, элемент удаляется из множества, и возбуждается Program_Error.
Если Element_Type не ограничен и определён, то фактический параметр Element для Process.all должен быть неограниченным.
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);
Тип Reference_Type нуждается в завершении.
Этот абзац был удалён.
function Reference_Preserving_Key (Container : aliased in out Set;
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);
Эта функция (в сочетании с аспектом Implicit_Dereference) предоставляет удобный способ получить чтение и запись для отдельного элемента множества, зная курсор.
Reference_Preserving_Key использует Key для сохранения значения ключа K; затем возвращает объект, дискриминант которого является значением доступа, указывающим на элемент, на который указывает Position. Вмешательство в курсоры Container запрещено, пока возвращаемый Reference_Preserving_Key объект существует и не был завершён. При завершении объекта, возвращённого Reference_Preserving_Key, выполняется проверка, определяет ли K тот же класс эквивалентности, что и новый элемент; если нет, элемент удаляется из множества, и возбуждается Program_Error.
function Constant_Reference (Container : aliased in Set;
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);
Эта функция (в сочетании с аспектом Implicit_Dereference) предоставляет удобный способ получить только чтение отдельного элемента множества, зная значение ключа.
Эквивалентно Constant_Reference (Container, Find (Container, Key)).
function Reference_Preserving_Key (Container : aliased in out Set;
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);
Эта функция (в сочетании с аспектом Implicit_Dereference) предоставляет удобный способ получить чтение и запись отдельного элемента множества, зная значение ключа.
Эквивалентно Reference_Preserving_Key (Container, Find (Container, Key)).
Вложенный пакет Stable предоставляет тип Stable.Set, представляющий собой стабильное множество, которое не может расти и уменьшаться. Такое множество можно создать, вызвав функцию Copy или создав стабилизированный вид обычного множества.
Подпрограммы пакета множеств, имеющие параметр или результат типа Set, включены во вложенный пакет Stable с той же спецификацией, за исключением следующих:
Tampering_With_Cursors_Prohibited, Assign, Move, Insert, Include, Clear, Delete, Exclude, Replace, Replace_Element, процедуры Union, Intersection, Difference и Symmetric_Difference, (для Ordered_sets) Delete_First и Delete_Last, и (для Hashed_sets) Reserve_Capacity
Операции этого пакета эквивалентны операциям для обычных множеств, за исключением того, что вызовы Tampering_With_Cursors_Prohibited, которые встречаются в предусловиях, заменяются на False, а любые, которые встречаются в постусловиях, заменяются на True.
Если стабильное множество объявляется с дискриминантом Base, обозначающим уже существующее обычное множество, то стабильное множество представляет стабилизированный вид базового обычного множества, и любая операция над стабильным множеством отражается на базовом обычном множестве. Пока существует стабилизированный вид, любая операция, которая изменяет курсоры, выполняемая над базовым множеством, запрещена. Закрытие стабильного множества, которое предоставляет такой вид, снимает это ограничение для базового обычного множества (хотя могут существовать и другие ограничения из-за других одновременных итераций или стабилизированных видов).
Если стабильное множество объявляется без указания Base, объект обязательно инициализируется. Инициализирующее выражение стабильного множества, как правило, вызов Copy, определяет длину множества. Длина стабильного множества никогда не изменяется после инициализации.

Ограниченные (времени выполнения) ошибки

Ограниченная ошибка, если фактическая функция, связанная с формальным подпрограммой типа «generic», при вызове как части операции пакета множеств, изменяет элементы любого параметра множества операции. Либо генерируется Program_Error, либо операция работает, как определено на значении множества до или после некоторых или всех изменений в множестве.
Ограниченная ошибка вызова любой подпрограммы, объявленной в видимой части пакета множеств, когда связанный контейнер был закрыт. Если операция принимает Container в качестве параметра in out, то она генерирует Constraint_Error или Program_Error. В противном случае операция выполняется так же, как и для пустого контейнера, или она генерирует Constraint_Error или Program_Error.

Ошибочное выполнение

Значение Cursor является недействительным, если после его создания произошло любое из следующего:
  • Множество, содержащее элемент, обозначенный им, было закрыто;
  • Множество, содержащее элемент, обозначенный им, было использовано в качестве цели вызова Assign или как цель оператора assignment_statement;
  • Множество, содержащее элемент, обозначенный им, было использовано в качестве источника или цели вызова Move; или
  • Элемент, обозначенный им, был удален из множества, которое ранее содержало этот элемент.
Результат «=» или Has_Element не определен, если эти функции вызываются с недействительным параметром курсора. Выполнение является ошибочным, если любая другая подпрограмма, объявленная в Containers.Hashed_Sets или Containers.Ordered_Sets, вызывается с недействительным параметром курсора.
Выполнение является ошибочным, если множество, связанное с результатом вызова Reference или Constant_Reference, закрывается до закрытия объекта результата, возвращаемого вызовом Reference или Constant_Reference.

Требования к реализации

Нет хранилища, связанного с объектом множества, теряется при присваивании или выходе из области видимости.
Выполнение оператора assignment_statement для множества должно иметь эффект копирования элементов из источника в целевой объект множества и изменения длины целевого объекта на длину исходного объекта.

Рекомендации по реализации

Move не должен копировать элементы и должен минимизировать копирование внутренних структур данных.
Если исключение распространяется из операции над множеством, не должно теряться хранилище, и элементы не должны удаляться из множества, если это не указано в операции.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API