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