Пример настраиваемого пакета
В следующем примере использован настраиваемый пакет для одной из возможных организаций стеков. Размер каждого стека и тип его элементов являются параметрами настройки.
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.
СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ И ОСОБЕННОСТИ, ЗАВИСЯЩИЕ ОТ РЕАЛИЗАЦИИ |