Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

A.18.21 Обобщённый пакет Containers.Bounded_Hashed_Maps

Определяемый языком обобщённый пакет Containers.Bounded_Hashed_Maps предоставляет закрытый тип Map и набор операций. Он предоставляет те же операции, что и пакет Containers.Hashed_Maps (см. A.18.5), с той разницей, что максимальный объём хранилища ограничен.

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

Объявление обобщённого библиотечного пакета Containers.Bounded_Hashed_Maps имеет то же содержимое и семантику, что и Containers.Hashed_Maps, за исключением:
  • Аспект Preelaborate заменяется аспектом Pure. Аспект Global удаляется.
  • Тип Map объявляется с дискриминантами, которые определяют как ёмкость (количество элементов), так и модуль (количество различных хеш-значений) хеш-таблицы следующим образом:
type Map (Capacity : Count_Type;
Modulus : Hash_Type) is tagged private...
  • Определение aspect_definition для Preelaborable_Initialization для типа Map изменено на:
Preelaborable_Initialization =>
Element_Type'Preelaborable_Initialization
and
Key_Type'Preelaborable_Initialization
  • Тип Map требует финализации тогда и только тогда, когда тип Key_Type или тип Element_Type требуют финализации.
  • В функции Empty пост условие изменено на:
Post =>
Empty'Result.Capacity = Capacity and then
Empty'Result.Modulus = Default_Modulus (Capacity) and then
not Tampering_With_Elements_Prohibited (Empty'Result) and then
not Tampering_With_Cursors_Prohibited (Empty'Result) and then
Length (Empty'Result) = 0;
  • Описание Reserve_Capacity заменено на:
procedure Reserve_Capacity (Container : in out Map;
Capacity : in Count_Type)
with Pre => Capacity <= Container.Capacity
or else raise Capacity_Error;
Эта операция не имеет эффекта, кроме проверки предусловия.
  • Добавлена дополнительная операция сразу после Reserve_Capacity:
function Default_Modulus (Capacity : Count_Type) return Hash_Type;
Default_Modulus возвращает определяемое реализацией значение для количества различных хеш-значений, которые будут использоваться для заданной ёмкости (максимальное количество элементов).
  • Для процедур Insert и Include часть предусловия, которая гласит:
(<некоторое значение> <= Count_Type'Last - <некоторое другое значение>
or else raise Constraint_Error)
заменяется на:
(<некоторое значение> <= Count_Type'Last - <некоторое другое значение>
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),
  • Функция Copy заменена на:
function Copy (Source : Map;
Capacity : Count_Type := 0;
Modulus : Hash_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_Elements_Prohibited (Copy'Result) and then
not Tampering_With_Cursors_Prohibited (Copy'Result) and then
Copy'Result.Capacity = (if Capacity = 0 then
Length (Source) else Capacity) and then
Copy'Result.Modulus = (if Modulus = 0 then
Default_Modulus (Capacity) else Modulus);
Возвращает карту с парами ключ/элемент, инициализированными из значений в Source.

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

Ошибка присваивания от объекта ограниченной карты во время изменения элементов или курсоров данного объекта. Либо Program_Error поднят при присваивании, выполнение продолжается с объектом-получателем, запрещающим изменение элементов или курсоров, или выполнение продолжается нормально.

Ошибка выполнения

При финализации объекта ограниченной карты M, если изменение курсоров запрещено для M, кроме как из-за присваивания от другой карты, то выполнение является ошибочным.

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

Для каждого экземпляра Containers.Hashed_Maps и каждого экземпляра Containers.Bounded_Hashed_Maps, если два экземпляра удовлетворяют следующим условиям, то вывод, генерируемый подпрограммами Map'Output или Map'Write любого экземпляра, должен быть читаемым подпрограммами Map'Input или Map'Read другого экземпляра соответственно:
  • параметры Element_Type двух экземпляров являются статически соответствующими подтипами одного и того же типа; и
  • вывод, генерируемый Element_Type'Output или Element_Type'Write, должен быть читаемым Element_Type'Input или Element_Type'Read соответственно (где Element_Type обозначает тип двух фактических параметров Element_Type); и
  • вышеуказанные два условия также выполняются для параметров Key_Type экземпляров.

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

Объекты ограниченных хеш-таблиц должны быть реализованы без неявных указателей или динамического выделения.
Рекомендации по реализации процедуры Move для минимизации копирования не применяются.


Spec-Zone.ru

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