Руководство по Ada (Ada 2022)
A.18.19 Общий пакет Containers.Bounded_Vectors
Определяемый языком общий пакет Containers.Bounded_Vectors предоставляет приватный тип Vector и набор операций. Он предоставляет те же операции, что и пакет Containers.Vectors (см. A.18.2), с той разницей, что максимальный объем памяти ограничен.
Статическая семантика
Объявление общего библиотечного пакета Containers.Bounded_Vectors имеет то же содержимое и семантику, что и Containers.Vectors, за исключением:
- Аспект Preelaborate заменяется аспектом Pure. Аспект Global удаляется.
- Тип Vector объявляется с дискриминантом, определяющим емкость:
type Vector (Capacity : Count_Type) is tagged private...
- Определение aspect_definition для Preelaborable_Initialization для типа Vector изменено на:
Preelaborable_Initialization =>
Element_Type'Preelaborable_Initialization
Element_Type'Preelaborable_Initialization
- Тип Vector нуждается в завершении, если и только если тип Element_Type нуждается в завершении.
- Емкость (Capacity) опущена из Stable_Properties типа Vector.
- В функции Empty пост условие изменено на:
Post =>
Empty'Result.Capacity = 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;
Empty'Result.Capacity = 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;
- В функции Copy пост условие изменено на:
Post => Length (Copy'Result) = Length (Source) and then
(if Capacity > Length (Source) then
Copy'Result.Capacity = Capacity
else Copy'Result.Capacity >= Length (Source));
(if Capacity > Length (Source) then
Copy'Result.Capacity = Capacity
else Copy'Result.Capacity >= Length (Source));
- Описание Reserve_Capacity заменено на:
procedure Reserve_Capacity (Container : in out Vector;
Capacity : in Count_Type)
with Pre => Capacity <= Container.Capacity
or else raise Capacity_Error;
Capacity : in Count_Type)
with Pre => Capacity <= Container.Capacity
or else raise Capacity_Error;
Эта операция не оказывает никакого влияния, кроме проверки предословия.
- Часть пост условия, проверяющая емкость, опущена из подпрограмм Set_Length, Assign, Insert, Insert_Space, Prepend, Append и Delete.
- Для процедур Insert, Insert_Space, Prepend и Append часть предословия, гласящая:
(<некоторое значение> <= Maximum_Length - <некоторое другое значение>
or else raise Constraint_Error)
or else raise Constraint_Error)
заменяется на:
(<некоторое значение> <= Maximum_Length - <некоторое другое значение>
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)
Ограниченные (временные) ошибки
Ошибка ограниченного типа возникает при присваивании из объекта ограниченного вектора, в то время как запрещено вмешиваться в элементы или курсоры этого объекта. Или возникает ошибка Program_Error при присваивании, выполнение продолжается с целевым объектом, запрещающим вмешательство в элементы или курсоры, или выполнение продолжается нормально.
Ошибочное выполнение
При завершении объекта ограниченного вектора V, если вмешательство в курсоры запрещено для V, за исключением присваивания из другого вектора, то выполнение является ошибочным.
Требования к реализации
Для каждой экземпляра Containers.Vectors и каждой экземпляра Containers.Bounded_Vectors, если два экземпляра удовлетворяют следующим условиям, то выходные данные, генерируемые подпрограммами Vector'Output или Vector'Write любого экземпляра, должны быть читаемы подпрограммами Vector'Input или Vector'Read другого экземпляра соответственно:
- параметры Element_Type двух экземпляров являются статически соответствующими подтипами одного и того же типа; и
- выходные данные, генерируемые Element_Type'Output или Element_Type'Write, должны быть читаемы Element_Type'Input или Element_Type'Read соответственно (где Element_Type обозначает тип двух фактических параметров Element_Type); и
- вышеупомянутые два условия также должны выполняться для параметров Index_Type экземпляров.
Рекомендации по реализации
Объекты ограниченных векторов должны быть реализованы без неявных указателей или динамического выделения.
Рекомендации по реализации процедуры Move для минимизации копирования не применяются.