12.4. ПРИМЕР НАСТРАИВАЕМОГО ПАКЕТА

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

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;      and 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);

Возможна другая организация стека (тело пакета опущено):

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:

При использовании такого пакета сначала должна быть осуществлена конкретизация, после чего можно описать стеки с элементами соответствующего типа:

declare   package STACK_REAL is new ON_STACKS(REAL);    use STACK_REAL;    S : STACK(100);begin   ...   PUSH(S, 2.54);   ...end;