Spec-Zone.ru › Ada 2005
Справочное руководство Ada 2005

12.8 Пример обобщённого пакета

Следующий пример демонстрирует возможную реализацию стеков с помощью обобщённого пакета. Размер каждого стека и тип элементов стека задаются в качестве обобщённых формальных параметров.

Примеры

Этот абзац был удалён.
generic
Size : Positive;
type Item is private;
package Stack is
procedure Push(E : in Item);
procedure Pop (E : out Item);
Overflow, Underflow : exception;
end Stack;
package body Stack is
type Table is array (Positive range <>) of Item;
Space : Table(1 .. Size);
Index : Natural := 0;
procedure Push(E : in Item) is
begin
if Index >= Size then
raise Overflow;
end if;
Index := Index + 1;
Space(Index) := E;
end Push;
procedure Pop(E : out Item) is
begin
if Index = 0 then
raise Underflow;
end if;
E := Space(Index);
Index := Index - 1;
end Pop;
end Stack;
Экземпляры этого обобщённого пакета можно получить следующим образом:
package Stack_Int is new Stack(Size => 200, Item => Integer);
package Stack_Bool is new Stack(100, Boolean);
После этого процедуры созданных пакетов можно вызывать следующим образом:
Stack_Int.Push(N);
Stack_Bool.Push(True);
Альтернативно, обобщённое описание типа Stack можно представить следующим образом (код тела пакета опущен):
generic
type Item is private;
package On_Stacks is
type Stack(Size : Positive) is limited private;
procedure Push(S : in out Stack; E : in Item);
procedure Pop (S : in out Stack; E : out Item);
Overflow, Underflow : exception;
private
type Table is array (Positive range <>) of Item;
type Stack(Size : Positive) is
record
Space : Table(1 .. Size);
Index : Natural := 0;
end record;
end On_Stacks;
Для использования такого пакета необходимо создать экземпляр, после чего можно объявить стеки соответствующего типа:
declare
package Stack_Real is new On_Stacks(Real); use Stack_Real;
S : Stack(100);
begin
...
Push(S, 2.54);
...
end;


Spec-Zone.ru

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