Справочное руководство по языку Ада-83

Пример настраиваемого пакета


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

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;

Пред.  Уровень выше  След.

12.3. КОНКРЕТИЗАЦИЯ НАСТРОЙКИ

 

Содержание  Глава 13.

СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ И ОСОБЕННОСТИ, ЗАВИСЯЩИЕ ОТ РЕАЛИЗАЦИИ



Содержание раздела