File: dbf\deque_types.ads

    1 --::::::::::
    2 --dequtype.ads
    3 --::::::::::
    4 -- Developed by (C) Wasiliy W. Molostoff 1994, 1995.
    5 --                  Moscow, Russia,
    6 --                  Voice:   7 (095) 398-23-38
    7 --                  e-mail:  edv@edv.msk.ru
    8 -- This is free software; you can  freely  redistribute  it  and/or
    9 -- modify  it  without any restrictions.  Please report any errors.
   10 -- All corrections will be made as soon as possible.
   11 package deque_types is
   12 
   13   type edge_type is (left_edge, right_edge);
   14 
   15   type edges_rule is
   16   record
   17     source, target : edge_type;
   18   end record;
   19 
   20   lifo_right: constant edges_rule := (source |
   21                                       target => right_edge);
   22   fifo_right: constant edges_rule := (source => left_edge,
   23                                       target => right_edge);
   24   lifo_left : constant edges_rule := (source |
   25                                       target => left_edge);
   26   fifo_left : constant edges_rule := (source => right_edge,
   27                                       target => left_edge);
   28 
   29   opposite  : constant array(edge_type)
   30                         of edge_type := (right_edge => left_edge,
   31                                          left_edge  => right_edge);
   32 
   33   deque_overflow, deque_underflow : exception;
   34 
   35   generic
   36 
   37     type element is private;
   38     default_length : in positive;
   39     default_state  : edges_rule := fifo_right;
   40 
   41   package deques is
   42 
   43     type object (width  : positive := default_length) is private;
   44                      -- source : edge_type := default_state.source;
   45                      -- target : edge_type := default_state.target;
   46 
   47     function length (deque : in object) return natural;
   48     function value  (deque : in object;
   49                      source: in edge_type) return element;
   50     function value  (deque : in object) return element;
   51 
   52 
   53     procedure update (deque  : in out object;
   54                       item   : in element;
   55                       target : in edge_type);
   56 
   57     procedure update (deque : in out object;
   58                       item  : in element);
   59 
   60     pragma inline (length, value, update);
   61 
   62     procedure discard (deque: in out object; item: out element);
   63     procedure append  (deque: in out object; item: in element);
   64 
   65     pragma inline (discard, append);
   66 
   67     procedure discard (deque : in out object; item: out element;
   68                        source: in edge_type);
   69     procedure append (deque : in out object; item: in element;
   70                       target: in edge_type);
   71 
   72     function current (deque : in object) return edges_rule;
   73     function source  (deque : in object) return edge_type;
   74     function target  (deque : in object) return edge_type;
   75 
   76     procedure reset_rule (deque: in out object);
   77     procedure flip_edges (deque: in out object);
   78     procedure set_target (deque: in out object; target: in edge_type);
   79     procedure set_source (deque: in out object; source: in edge_type);
   80     procedure set_rule   (deque: in out object; rule: in edges_rule);
   81 
   82     procedure clear (deque: in out object);
   83 
   84     pragma inline (set_target, set_source, reset_rule, set_rule,
   85                   flip_edges, source, target, current, clear);
   86     generic
   87        type index is (<>);
   88        type sequence is array (index range <>) of element;
   89     package array_support is
   90 
   91 --  function value  (deque : in object) return sequence;
   92 --  function "&" (left: object; right: object) return sequence;
   93 --  function "&" (left: sequence  ; right: object) return sequence;
   94 --  function "&" (left: object; right: sequence  ) return sequence;
   95 --  procedure set (deque : in out object; seq: in  sequence);
   96 --  procedure get (deque : in out object; seq: out sequence);
   97 
   98     end array_support;
   99 
  100   private
  101 
  102     type elem_arry  is array (positive range <>) of element;
  103     type edge_index is array (edge_type) of integer;
  104 
  105     type object (width  : positive := default_length) is
  106                  --  source : edge_type := default_state.source;
  107                  --  target : edge_type := default_state.target
  108       record
  109         current: edges_rule := (source => default_state.source,
  110                                 target => default_state.target);
  111         count  : natural := 0;
  112         index  : edge_index := (1, width);
  113         data   : elem_arry (1 .. width);
  114       end record;
  115 
  116   end deques;
  117 
  118 end deque_types;
  119