[BACK]Return to brackets.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Schubert

Annotation of OpenXM_contrib/PHC/Ada/Schubert/brackets.adb, Revision 1.1.1.1

1.1       maekawa     1: with unchecked_deallocation;
                      2:
                      3: package body Brackets is
                      4:
                      5: -- AUXILIARY OPERATION :
                      6:
                      7:   procedure Swap ( v : in out Standard_Natural_Vectors.Vector;
                      8:                    i,j : in natural ) is
                      9:
                     10:   -- DESCRIPTION :
                     11:   --   Swaps the i-th and j-th entry in the vector v.
                     12:
                     13:     tmp : natural := v(i);
                     14:
                     15:   begin
                     16:      v(i) := v(j); v(j) := tmp;
                     17:   end Swap;
                     18:
                     19: -- CONSTRUCTORS :
                     20:
                     21:   procedure Create ( v : in Standard_Natural_Vectors.Vector;
                     22:                      b : out Bracket; sign : out integer ) is
                     23:
                     24:     sig : integer := +1;
                     25:     min,ind : natural;
                     26:     bb : Bracket(v'range) := Bracket(v);
                     27:
                     28:   begin
                     29:     for i in bb'first..bb'last-1 loop
                     30:       min := bb(i);
                     31:       ind := i;
                     32:       for j in i+1..bb'last loop
                     33:         if bb(j) < min
                     34:          then ind := j;
                     35:               min := bb(j);
                     36:         end if;
                     37:       end loop;
                     38:       if ind /= i
                     39:        then Swap(Standard_Natural_Vectors.Vector(bb),i,ind);
                     40:             sig := -sig;
                     41:       end if;
                     42:     end loop;
                     43:     b := bb;
                     44:     sign := sig;
                     45:   end Create;
                     46:
                     47:   procedure Create ( v : in Standard_Natural_Vectors.Vector;
                     48:                      perm : out Standard_Natural_Vectors.Vector;
                     49:                      b : out Bracket; sign : out integer ) is
                     50:
                     51:     sig : integer := +1;
                     52:     min,ind : natural;
                     53:     bb : Bracket(v'range) := Bracket(v);
                     54:     pp : Standard_Natural_Vectors.Vector(v'range);
                     55:
                     56:   begin
                     57:     for i in pp'range loop
                     58:       pp(i) := i;
                     59:     end loop;
                     60:     for i in bb'first..bb'last-1 loop
                     61:       min := bb(i);
                     62:       ind := i;
                     63:       for j in i+1..bb'last loop
                     64:         if bb(j) < min
                     65:          then ind := j;
                     66:               min := bb(j);
                     67:         end if;
                     68:       end loop;
                     69:       if ind /= i
                     70:        then Swap(Standard_Natural_Vectors.Vector(bb),i,ind);
                     71:             Swap(pp,i,ind);
                     72:             sig := -sig;
                     73:       end if;
                     74:     end loop;
                     75:     perm := pp;
                     76:     b := bb;
                     77:     sign := sig;
                     78:   end Create;
                     79:
                     80:   function Modulo ( b : Bracket; n : natural ) return Bracket is
                     81:
                     82:     res : Bracket(b'range);
                     83:     modvec : Standard_Natural_Vectors.Vector(b'range);
                     84:     sig : integer;
                     85:
                     86:   begin
                     87:     for i in b'range loop
                     88:       modvec(i) := b(i) mod n;
                     89:       if modvec(i) = 0
                     90:        then modvec(i) := n;
                     91:       end if;
                     92:     end loop;
                     93:     Create(modvec,res,sig);
                     94:     return res;
                     95:   end Modulo;
                     96:
                     97:   procedure Modulo ( b : in Bracket; n : in natural;
                     98:                      perm : out Standard_Natural_Vectors.Vector;
                     99:                      mb : out Bracket ) is
                    100:
                    101:     res : Bracket(b'range);
                    102:     modvec : Standard_Natural_Vectors.Vector(b'range);
                    103:     sig : integer;
                    104:
                    105:   begin
                    106:     for i in b'range loop
                    107:       modvec(i) := b(i) mod n;
                    108:       if modvec(i) = 0
                    109:        then modvec(i) := n;
                    110:       end if;
                    111:     end loop;
                    112:     Create(modvec,perm,res,sig);
                    113:     mb := res;
                    114:   end Modulo;
                    115:
                    116: -- SELECTORS :
                    117:
                    118:   function Is_Zero ( b : Bracket ) return boolean is
                    119:
                    120:   begin
                    121:     for i in b'first..b'last-1 loop
                    122:       if b(i) = b(i+1)
                    123:        then return true;
                    124:       end if;
                    125:     end loop;
                    126:     return false;
                    127:   end Is_Zero;
                    128:
                    129:   function Is_Equal ( b1,b2 : Bracket ) return boolean is
                    130:
                    131:     use Standard_Natural_Vectors;
                    132:
                    133:   begin
                    134:     if b1'length /= b2'length
                    135:      then return false;
                    136:      else return Equal(Vector(b1),Vector(b2));
                    137:     end if;
                    138:   end Is_Equal;
                    139:
                    140:   function "<" ( b1,b2 : Bracket ) return boolean is
                    141:   begin
                    142:     for i in b1'range loop
                    143:       if b1(i) < b2(i)
                    144:        then return true;
                    145:        elsif b1(i) > b2(i)
                    146:            then return false;
                    147:       end if;
                    148:     end loop;
                    149:     return false;
                    150:   end "<";
                    151:
                    152:   function ">" ( b1,b2 : Bracket ) return boolean is
                    153:   begin
                    154:     for i in b1'range loop
                    155:       if b1(i) > b2(i)
                    156:        then return true;
                    157:        elsif b1(i) < b2(i)
                    158:            then return false;
                    159:       end if;
                    160:     end loop;
                    161:     return false;
                    162:   end ">";
                    163:
                    164:   function Is_Standard ( b1,b2 : Bracket ) return natural is
                    165:   begin
                    166:     for i in b1'range loop
                    167:       if b1(i) > b2(i)
                    168:        then return i;
                    169:       end if;
                    170:     end loop;
                    171:     return 0;
                    172:   end Is_Standard;
                    173:
                    174: -- DESTRUCTOR :
                    175:
                    176:   procedure Clear ( lb : in out Link_to_Bracket ) is
                    177:
                    178:     procedure free is new unchecked_deallocation(Bracket,Link_to_Bracket);
                    179:
                    180:   begin
                    181:     free(lb);
                    182:   end Clear;
                    183:
                    184: end Brackets;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>