Руководство по Ada (Ada 2022)
A.18.25 Универсальный пакет Containers.Bounded_Multiway_Trees
Определяемый языком универсальный пакет Containers.Bounded_Multiway_Trees предоставляет частный тип Tree и набор операций. Он предоставляет те же операции, что и пакет Containers.Multiway_Trees (см. A.18.10), с той разницей, что максимальный объем хранилища ограничен.
Статическая семантика
Объявление универсального библиотечного пакета Containers.Bounded_Multiway_Trees имеет то же содержимое и семантику, что и Containers.Multiway_Trees, за исключением:
- Аспект Preelaborate заменяется аспектом Pure. Аспект Global удаляется.
- Тип Tree объявляется с дискриминантом, который задаёт ёмкость (максимальное количество элементов) следующим образом:
type Tree (Capacity : Count_Type) is tagged private...
- Определение aspect_definition для Preelaborable_Initialization для типа Tree изменено на:
Preelaborable_Initialization =>
Element_Type'Preelaborable_Initialization
Element_Type'Preelaborable_Initialization
- Тип Tree требует финализации тогда и только тогда, когда тип Element_Type требует финализации.
- Функция Empty заменена на:
function Empty (Capacity : Count_Type := определяется реализацией)
return Tree
with 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
Node_Count (Empty'Result) = 1;
return Tree
with 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
Node_Count (Empty'Result) = 1;
- Для процедур Insert_Child, Prepend_Child и Append_Child начальное подвыражение предусловия заменяется на:
with Pre => (not Tampering_With_Cursors_Prohibited (Container)
or else raise Program_Error) and then
(Node_Count (Container) - 1 <= Container.Capacity - Count
or else raise Capacity_Error)
or else raise Program_Error) and then
(Node_Count (Container) - 1 <= Container.Capacity - Count
or else raise Capacity_Error)
- В процедуре Assign предусловие изменено на:
Pre => (not Tampering_With_Cursors_Prohibited (Target)
or else raise Program_Error) and then
(Node_Count (Source) - 1 <= Target.Capacity
or else raise Capacity_Error),
or else raise Program_Error) and then
(Node_Count (Source) - 1 <= Target.Capacity
or else raise Capacity_Error),
- Функция Copy объявляется следующим образом:
function Copy (Source : Tree; Capacity : Count_Type := 0)
return Tree
with Pre => Capacity = 0 or else Capacity >= Node_Count (Source) - 1
or else raise Capacity_Error,
Post =>
Node_Count (Copy'Result) = Node_Count (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
Node_Count (Source) - 1 else Capacity);
return Tree
with Pre => Capacity = 0 or else Capacity >= Node_Count (Source) - 1
or else raise Capacity_Error,
Post =>
Node_Count (Copy'Result) = Node_Count (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
Node_Count (Source) - 1 else Capacity);
Возвращает список, элементы которого имеют те же значения, что и элементы Source.
- В четырёхпараметрической процедуре Copy_Subtree последнее or else предусловия заменяется на:
(not Is_Root (Source)
or else raise Constraint_Error) and then
(Node_Count (Target) - 1 + Subtree_Node_Count (Source) <=
Target.Capacity
or else raise Capacity_Error),
or else raise Constraint_Error) and then
(Node_Count (Target) - 1 + Subtree_Node_Count (Source) <=
Target.Capacity
or else raise Capacity_Error),
- В пятипараметрической процедуре Copy_Subtree последнее or else предусловия заменяется на:
(not Is_Root (Source, Subtree)
or else raise Constraint_Error) and then
(Node_Count (Target) - 1 +
Subtree_Node_Count (Source, Subtree) <= Target.Capacity
or else raise Capacity_Error),
or else raise Constraint_Error) and then
(Node_Count (Target) - 1 +
Subtree_Node_Count (Source, Subtree) <= Target.Capacity
or else raise Capacity_Error),
- В Copy_Local_Subtree последнее or else предусловия заменяется на:
(not Is_Root (Source, Subtree)
or else raise Constraint_Error) and then
(Node_Count (Target) - 1 +
Subtree_Node_Count (Target, Source) <= Target.Capacity
or else raise Capacity_Error),
or else raise Constraint_Error) and then
(Node_Count (Target) - 1 +
Subtree_Node_Count (Target, Source) <= Target.Capacity
or else raise Capacity_Error),
- В пятипараметрической процедуре Splice_Subtree предпоследнее or else предусловия заменяется на:
(Has_Element (Source, Position)
or else raise Program_Error) and then
(Target'Has_Same_Storage (Source) or else
Node_Count (Target) - 1 +
Subtree_Node_Count (Source, Position) <= Target.Capacity
or else raise Capacity_Error) and then
or else raise Program_Error) and then
(Target'Has_Same_Storage (Source) or else
Node_Count (Target) - 1 +
Subtree_Node_Count (Source, Position) <= Target.Capacity
or else raise Capacity_Error) and then
- В пятипараметрической процедуре Splice_Children предпоследнее elsif предусловия заменяется на:
(Before = No_Element or else
Parent (Target, Before) /= Target_Parent
or else raise Constraint_Error) and then
(Target'Has_Same_Storage (Source) or else
Node_Count (Target) - 1 +
Child_Count (Source, Source_Parent) <= Target.Capacity
or else raise Capacity_Error) and then
Parent (Target, Before) /= Target_Parent
or else raise Constraint_Error) and then
(Target'Has_Same_Storage (Source) or else
Node_Count (Target) - 1 +
Child_Count (Source, Source_Parent) <= Target.Capacity
or else raise Capacity_Error) and then
Ограниченные (время выполнения) ошибки
Ошибка присваивания из ограниченного объекта дерева, когда запрещено манипулирование элементами или курсорами этого объекта, является ограниченной. Либо Program_Error поднимается при присваивании, либо выполнение продолжается с целевым объектом, запрещающим манипулирование элементами или курсорами, либо выполнение продолжается нормально.
Ошибка выполнения
Когда объект ограниченного дерева T завершается, если манипулирование курсорами для T запрещено, кроме как в результате присваивания от другого дерева, тогда выполнение является ошибочным.
Требования к реализации
Для каждой инстанции Containers.Multiway_Trees и каждой инстанции Containers.Bounded_Multiway_Trees, если две инстанции соответствуют следующим условиям, то выходные данные, генерируемые подпрограммами Tree'Output или Tree'Write любой инстанции, должны быть читаемы подпрограммами Tree'Input или Tree'Read другой инстанции соответственно:
- параметры Element_Type двух инстанций являются статически соответствующими подтипами одного и того же типа; и
- выходные данные, генерируемые Element_Type'Output или Element_Type'Write, должны быть читаемы Element_Type'Input или Element_Type'Read соответственно (где Element_Type обозначает тип двух фактических параметров Element_Type).
Рекомендации по реализации
Объекты ограниченных деревьев должны быть реализованы без неявных указателей или динамического выделения.
Рекомендация по реализации процедуры Move для минимизации копирования не применяется.