with Ada.Finalization; use Ada.Finalization; generic type Item is private; -- Данные, помещаемые в стек. package Generic_Stack is -- Пример реализации стека элементов Item. -- (C) 1996 David A. Wheeler. type Stack is new Controlled with private; -- Стековый тип. Присваивание копирует содержимое одного стека в другой, -- а также копирование каждого элемента. -- От типа Stack можно наследовать и перегружать операции, наследуемые от Controlled. type Stack_Access is access all Stack'Class; -- стандартный ссылочный тип. function "="(Left : in Stack; Right : in Stack) return Boolean; -- Стеки равны, если их длины равны и равны все их элементы соответственно. procedure Swap(Left : in out Stack; Right : in out Stack); -- Перемена местами содержимого двух стеков. procedure Push(S : in out Stack; I : in Item); procedure Pop (S : in out Stack; I : out Item); -- Pop возбуждает Constraint_Error если Is_Empty(Stack). procedure Top (S : in out Stack; I : out Item); -- Top копирует, но не извлекает самый верхний элемент. -- Top возбуждает Constraint_Error если Is_Empty(Stack). procedure Empty(S : in out Stack); -- Очистка данного стека function Is_Empty(S : in Stack) return Boolean; -- True если стек пуст. function Length(S : in Stack) return Natural; -- возвращает 0 если стек пуст -- Разрешается использование данного пакета любым способом -- при условии сохранении ссылки на автора (David A. Wheeler). -- NO WARRANTIES, EITHER EXPRESS OR IMPLIED, APPLY. private type Stack_Node; type Stack_Node_Access is access Stack_Node; type Stack is new Controlled with record Start : Stack_Node_Access; end record; procedure Adjust(Object : in out Stack); procedure Finalize(Object : in out Stack); end Generic_Stack;