Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Polynomials/symbol_table.adb, Revision 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>