Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Polynomials/symbol_table.adb, Revision 1.1.1.1
1.1 maekawa 1: with unchecked_deallocation;
2:
3: package body Symbol_Table is
4:
5: -- INTERNAL DATA :
6:
7: type Symbol_Array is array(positive range <>) of Symbol;
8: type Symbol_Table ( max : natural ) is record
9: number : natural; -- number of symbols that are not blank
10: syms : Symbol_Array(1..max);
11: end record;
12: type Link_to_Symbol_Table is access Symbol_Table;
13:
14: st : Link_to_Symbol_Table;
15:
16: -- CREATORS :
17:
18: procedure Init ( max : in natural ) is
19: begin
20: st := new Symbol_Table(max);
21: st.all.number := 0;
22: end Init;
23:
24: procedure Enlarge ( max : in natural ) is
25: begin
26: if Empty
27: then Init(max);
28: else declare
29: oldst : Symbol_Array(1..st.number);
30: maxst : constant natural := max + st.max;
31: begin
32: for i in oldst'range loop
33: oldst(i) := st.syms(i);
34: end loop;
35: Clear;
36: Init(maxst);
37: for i in oldst'range loop
38: Add(oldst(i));
39: end loop;
40: end;
41: end if;
42: end Enlarge;
43:
44: procedure Replace ( i : in natural; sb : in Symbol ) is
45:
46: tab : Symbol_Table renames st.all;
47:
48: begin
49: if i <= tab.number
50: then for j in sb'range loop
51: tab.syms(i)(j) := sb(j);
52: end loop;
53: end if;
54: end Replace;
55:
56: -- CONSTRUCTORS :
57:
58: procedure Add ( sb : in Symbol; pos : out natural ) is
59:
60: tab : Symbol_Table renames st.all;
61:
62: begin
63: tab.number := tab.number + 1;
64: for i in sb'range loop
65: tab.syms(tab.number)(i) := sb(i);
66: end loop;
67: pos := tab.number;
68: exception
69: when others => raise OVERFLOW_IN_THE_SYMBOL_TABLE;
70: end Add;
71:
72: procedure Add ( sb : in Symbol ) is
73:
74: pos : natural;
75:
76: begin
77: Add(sb,pos);
78: end Add;
79:
80: procedure Remove ( sb : in Symbol ) is
81:
82: pos : natural := Get(sb);
83:
84: begin
85: Remove(pos);
86: end Remove;
87:
88: procedure Remove ( i : in natural ) is
89:
90: tab : Symbol_Table renames st.all;
91:
92: begin
93: if ((i /= 0) and then (tab.number >= i))
94: then tab.number := tab.number - 1; -- reduce #symbols
95: for j in i..tab.number loop -- shift symbol table
96: for k in tab.syms(j)'range loop
97: tab.syms(j)(k) := tab.syms(j+1)(k);
98: end loop;
99: end loop;
100: end if;
101: end Remove;
102:
103: -- SELECTORS :
104:
105: function "<" ( s1,s2 : Symbol ) return boolean is
106: begin
107: for i in s1'range loop
108: if s1(i) < s2(i)
109: then return true;
110: elsif s1(i) > s2(i)
111: then return false;
112: end if;
113: end loop;
114: return false;
115: end "<";
116:
117: function ">" ( s1,s2 : Symbol ) return boolean is
118: begin
119: for i in s1'range loop
120: if s1(i) > s2(i)
121: then return true;
122: elsif s1(i) < s2(i)
123: then return false;
124: end if;
125: end loop;
126: return false;
127: end ">";
128:
129: function Maximal_Size return natural is
130: begin
131: if st = null
132: then return 0;
133: else return st.max;
134: end if;
135: end Maximal_Size;
136:
137: function Number return natural is
138: begin
139: if st = null
140: then return 0;
141: else return st.all.number;
142: end if;
143: end Number;
144:
145: function Empty return boolean is
146: begin
147: return (st = null);
148: end Empty;
149:
150: function Get ( sb : Symbol ) return natural is
151:
152: tab : Symbol_Table renames st.all;
153:
154: begin
155: for i in 1..tab.number loop
156: if tab.syms(i) = sb
157: then return i;
158: end if;
159: end loop;
160: return 0;
161: end Get;
162:
163: function Get ( i : natural ) return Symbol is
164:
165: tab : Symbol_Table renames st.all;
166:
167: begin
168: if i > tab.number
169: then raise INDEX_OUT_OF_RANGE;
170: else return tab.syms(i);
171: end if;
172: end Get;
173:
174: -- DESTRUCTOR :
175:
176: procedure Clear is
177:
178: procedure free is
179: new unchecked_deallocation (Symbol_Table,Link_to_Symbol_Table);
180:
181: begin
182: free(st);
183: end Clear;
184:
185: end Symbol_Table;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>