Руководство по Ada 2012
A.18.20 Общий пакет Containers.Bounded_Doubly_Linked_Lists
Определяемый языком общий пакет Containers.Bounded_Doubly_Linked_Lists предоставляет закрытый тип List и набор операций. Он предоставляет те же операции, что и пакет Containers.Doubly_Linked_Lists (см. A.18.3), с той разницей, что максимальный объем памяти ограничен.
Статическая семантика
Декларация общего библиотечного пакета Containers.Bounded_Doubly_Linked_Lists имеет то же содержимое и семантику, что и Containers.Doubly_Linked_Lists, за исключением:
- Тип List объявляется со дискриминантом, который определяет емкость (максимальное количество элементов) следующим образом:
type List (Capacity : Count_Type) is tagged private;
- Тип List требует финализации тогда и только тогда, когда тип Element_Type требует финализации.
- Выделение внутренней памяти включает проверку, что емкость не превышена, и при этом, если проверка завершается неудачно, возбуждается Capacity_Error.
- В процедуре Assign, если длина Source больше емкости Target, то Capacity_Error распространяется.
- Функция Copy заменяется на:
function Copy (Source : List; Capacity : Count_Type := 0)
return List;
return List;
Если Capacity равно 0, то емкость списка равна длине Source; если Capacity равно или больше длины Source, то емкость списка равна значению параметра Capacity; в противном случае операция распространяет Capacity_Error.
- В процедуре Splice с тремя параметрами, у которой Source имеет тип List, если сумма длины Target и длины Source больше емкости Target, то Splice распространяет Capacity_Error.
- В процедуре Splice с четырьмя параметрами, если длина Target равна емкости Target, то Splice распространяет Capacity_Error.
Ограниченные (времени выполнения) ошибки
Ограниченная ошибка заключается в присваивании объекта ограниченного списка, в то время как запрещено вмешиваться в элементы или курсоры этого объекта. Либо Program_Error возбуждается при присваивании, либо выполнение продолжается с объектом-получателем, запрещающим вмешательство в элементы или курсоры, либо выполнение продолжается нормально.
Ошибка выполнения
Когда объект ограниченного списка L завершается, если вмешательство в курсоры запрещено для L, кроме как из-за присваивания из другого списка, то выполнение является ошибочным.
Требования к реализации
Для каждого экземпляра Containers.Doubly_Linked_Lists и каждого экземпляра Containers.Bounded_Doubly_Linked_Lists, если два экземпляра удовлетворяют следующим условиям, то выходной результат подпрограмм List'Output или List'Write любого экземпляра должен быть читаемым подпрограммами List'Input или List'Read другого экземпляра соответственно:
- параметры Element_Type двух экземпляров являются статически согласованными подтипами одного и того же типа; и
- выходной результат подпрограмм Element_Type'Output или Element_Type'Write должен быть читаемым подпрограммами Element_Type'Input или Element_Type'Read соответственно (где Element_Type обозначает тип двух фактических параметров Element_Type).
Рекомендации по реализации
Объекты ограниченного списка должны быть реализованы без неявных указателей или динамического выделения.
Рекомендации по реализации процедуры Move по минимизации копирования не применяются.