Руководство по Ada (Ada 2022)
A.18.24 Универсальный пакет Containers.Bounded_Ordered_Sets
Определяемый языком универсальный пакет Containers.Bounded_Ordered_Sets предоставляет частный тип Set и набор операций. Он предоставляет те же операции, что и пакет Containers.Ordered_Sets (см. A.18.9), за исключением того, что максимальный объем памяти ограничен.
Статическая семантика
Декларация универсального библиотечного пакета Containers.Bounded_Ordered_Sets имеет то же содержимое и семантику, что и Containers.Ordered_Sets, за исключением:
- Аспект Preelaborate заменён на аспект Pure. Аспект Global удалён.
- Тип Set объявлен с дискриминантом, который указывает ёмкость (максимальное количество элементов) следующим образом:
type Set (Capacity : Count_Type) is tagged private...
- Определение aspect_definition для Preelaborable_Initialization для типа Set изменено на:
Preelaborable_Initialization =>
Element_Type'Preelaborable_Initialization
Element_Type'Preelaborable_Initialization
- Тип Set требует финализации тогда и только тогда, когда тип Element_Type требует финализации.
- Функция Empty заменена на:
function Empty (Capacity : Count_Type := определяемое реализацией)
return Set
with Post =>
Empty'Result.Capacity = Capacity and then
not Tampering_With_Cursors_Prohibited (Empty'Result) and then
Length (Empty'Result) = 0;
return Set
with Post =>
Empty'Result.Capacity = Capacity and then
not Tampering_With_Cursors_Prohibited (Empty'Result) and then
Length (Empty'Result) = 0;
- Для процедур Insert и Include часть условия предварительной проверки, гласящая:
(<некоторое значение> <= Count_Type'Last - <некоторое другое значение>
or else raise Constraint_Error)
or else raise Constraint_Error)
заменяется на:
(<некоторое значение> <= Count_Type'Last - <некоторое другое значение>
or else raise Constraint_Error) and then
(<некоторое значение> <= Container.Capacity - <некоторое другое значение>
or else raise Capacity_Error)
or else raise Constraint_Error) and then
(<некоторое значение> <= Container.Capacity - <некоторое другое значение>
or else raise Capacity_Error)
- В процедуре Assign условие предварительной проверки изменено на:
Pre => (not Tampering_With_Cursors_Prohibited (Target)
or else raise Program_Error) and then
(Length (Source) <= Target.Capacity
or else raise Capacity_Error),
or else raise Program_Error) and then
(Length (Source) <= Target.Capacity
or else raise Capacity_Error),
- Функция Copy заменена на:
function Copy (Source : Set;
Capacity : Count_Type := 0) return Map
with Pre => Capacity = 0 or else Capacity >= Length (Source)
or else raise Capacity_Error,
Post =>
Length (Copy'Result) = Length (Source) and then
not Tampering_With_Cursors_Prohibited (Copy'Result) and then
Copy'Result.Capacity = (if Capacity = 0 then
Length (Source) else Capacity);
Capacity : Count_Type := 0) return Map
with Pre => Capacity = 0 or else Capacity >= Length (Source)
or else raise Capacity_Error,
Post =>
Length (Copy'Result) = Length (Source) and then
not Tampering_With_Cursors_Prohibited (Copy'Result) and then
Copy'Result.Capacity = (if Capacity = 0 then
Length (Source) else Capacity);
Возвращает множество с парами ключ/элемент, инициализированными значениями в Source.
Ограниченные (временные) ошибки
Ошибка является ограниченной, если присваивание выполняется из объекта ограниченного множества, в то время как запрещено вмешательство в элементы или курсоры этого объекта. Или Program_Error будет поднят присваиванием, выполнение продолжится с объектом-получателем, запрещающим вмешательство в элементы или курсоры, или выполнение продолжится нормально.
Ошибочное выполнение
Когда объект ограниченного множества S завершается, если вмешательство в курсоры запрещено для S, кроме как из-за присваивания от другого множества, то выполнение является ошибочным.
Требования к реализации
Для каждого экземпляра Containers.Ordered_Sets и каждого экземпляра Containers.Bounded_Ordered_Sets, если два экземпляра удовлетворяют следующим условиям, то выходные данные подпрограмм Set'Output или Set'Write любого экземпляра должны быть читаемы подпрограммами Set'Input или Set'Read другого экземпляра соответственно:
- параметры Element_Type двух экземпляров являются статическими совместимыми подтипами одного и того же типа; и
- выходные данные Element_Type'Output или Element_Type'Write должны быть читаемы Element_Type'Input или Element_Type'Read соответственно (где Element_Type обозначает тип двух фактических параметров Element_Type).
Рекомендации по реализации
Объекты ограниченных упорядоченных множеств должны реализовываться без неявных указателей или динамического выделения.
Рекомендации по реализации процедуры Move для минимизации копирования не применяются.