Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Stalift/floating_mixed_subdivisions.adb, Revision 1.1
1.1 ! maekawa 1: with unchecked_deallocation;
! 2: with Standard_Floating_Matrices; use Standard_Floating_Matrices;
! 3: with Floating_Support_Functions; use Floating_Support_Functions;
! 4:
! 5: package body Floating_Mixed_Subdivisions is
! 6:
! 7: -- CREATORS :
! 8:
! 9: function Create ( pts : Array_of_Lists; nor : Vector; tol : double_float )
! 10: return Mixed_Cell is
! 11:
! 12: res : Mixed_Cell;
! 13: sup : double_float;
! 14:
! 15: begin
! 16: res.nor := new Vector'(nor);
! 17: res.pts := new Array_of_Lists(pts'range);
! 18: for k in pts'range loop
! 19: sup := Minimal_Support(pts(k),nor);
! 20: res.pts(k) := Face(pts(k),nor,sup,tol);
! 21: end loop;
! 22: return res;
! 23: end Create;
! 24:
! 25: function Create ( pts : Array_of_Lists; nors : List; tol : double_float )
! 26: return Mixed_Subdivision is
! 27:
! 28: res,res_last : Mixed_Subdivision;
! 29: tmp : List := nors;
! 30:
! 31: begin
! 32: while not Is_Null(tmp) loop
! 33: Append(res,res_last,Create(pts,Head_Of(tmp).all,tol));
! 34: tmp := Tail_Of(tmp);
! 35: end loop;
! 36: return res;
! 37: end Create;
! 38:
! 39: function Create ( pts : Array_of_Lists; mixsub : Mixed_Subdivision;
! 40: tol : double_float ) return Mixed_Subdivision is
! 41:
! 42: tmp,res,res_last : Mixed_Subdivision;
! 43:
! 44: begin
! 45: tmp := mixsub;
! 46: while not Is_Null(tmp) loop
! 47: Append(res,res_last,Create(pts,Head_Of(tmp).nor.all,tol));
! 48: tmp := Tail_Of(tmp);
! 49: end loop;
! 50: return res;
! 51: end Create;
! 52:
! 53: procedure Update ( pts : in Array_of_Lists; nor : in Vector;
! 54: mixsub,mixsub_last : in out Mixed_Subdivision ) is
! 55:
! 56: -- DESCRIPTION :
! 57: -- Given a tuple of point sets and a normal,
! 58: -- the mixed subdivision will be updated.
! 59:
! 60: tmp : Mixed_Subdivision := mixsub;
! 61: done : boolean := false;
! 62:
! 63: begin
! 64: while not Is_Null(tmp) and not done loop
! 65: declare
! 66: mic : Mixed_Cell := Head_Of(tmp);
! 67: last : List;
! 68: begin
! 69: if Equal(mic.nor.all,nor)
! 70: then for k in mic.pts'range loop
! 71: last := mic.pts(k);
! 72: while not Is_Null(Tail_Of(last)) loop
! 73: last := Tail_Of(last);
! 74: end loop;
! 75: Deep_Concat_Diff(mic.pts(k),last,pts(k));
! 76: end loop;
! 77: Set_Head(tmp,mic);
! 78: done := true;
! 79: else tmp := Tail_Of(tmp);
! 80: end if;
! 81: end;
! 82: end loop;
! 83: if not done
! 84: then declare
! 85: mic : Mixed_Cell;
! 86: begin
! 87: mic.pts := new Array_of_Lists(pts'range);
! 88: Copy(pts,mic.pts.all);
! 89: mic.nor := new Standard_Floating_Vectors.Vector'(nor);
! 90: mic.sub := null;
! 91: Append(mixsub,mixsub_last,mic);
! 92: end;
! 93: end if;
! 94: end Update;
! 95:
! 96: -- CONSTRUCTORS :
! 97:
! 98: procedure Copy ( mic1 : in Mixed_Cell; mic2 : in out Mixed_Cell ) is
! 99: begin
! 100: Deep_Clear(mic2);
! 101: if mic1.nor /= null
! 102: then mic2.nor := new Standard_Floating_Vectors.Vector'(mic1.nor.all);
! 103: end if;
! 104: if mic1.pts /= null
! 105: then mic2.pts := new Array_of_Lists(mic1.pts'range);
! 106: Copy(mic1.pts.all,mic2.pts.all);
! 107: end if;
! 108: if mic1.sub /= null
! 109: then mic2.sub := new Mixed_Subdivision;
! 110: Copy(mic1.sub.all,mic2.sub.all);
! 111: end if;
! 112: end Copy;
! 113:
! 114: procedure Copy ( mixsub1 : in Mixed_Subdivision;
! 115: mixsub2 : in out Mixed_Subdivision ) is
! 116:
! 117: tmp : Mixed_Subdivision := mixsub1;
! 118: mixsub2_last : Mixed_Subdivision;
! 119:
! 120: begin
! 121: Deep_Clear(mixsub2);
! 122: while not Is_Null(tmp) loop
! 123: declare
! 124: mic1,mic2 : Mixed_Cell;
! 125: begin
! 126: mic1 := Head_Of(tmp);
! 127: Copy(mic1,mic2);
! 128: Append(mixsub2,mixsub2_last,mic2);
! 129: end;
! 130: tmp := Tail_Of(tmp);
! 131: end loop;
! 132: end Copy;
! 133:
! 134: procedure Append_Diff ( first,last : in out Mixed_Subdivision;
! 135: mic : in Mixed_Cell ) is
! 136: begin
! 137: if not Is_In(first,mic)
! 138: then Append(first,last,mic);
! 139: end if;
! 140: end Append_Diff;
! 141:
! 142: procedure Concat_Diff ( first,last : in out Mixed_Subdivision;
! 143: mixsub : in Mixed_Subdivision ) is
! 144:
! 145: tmp : Mixed_Subdivision := mixsub;
! 146:
! 147: begin
! 148: while not Is_Null(tmp) loop
! 149: declare
! 150: mic : Mixed_Cell := Head_Of(tmp);
! 151: begin
! 152: if not Is_In(first,mic)
! 153: then Append_Diff(first,last,mic);
! 154: end if;
! 155: end;
! 156: tmp := Tail_Of(tmp);
! 157: end loop;
! 158: end Concat_Diff;
! 159:
! 160: procedure Construct ( mixsub : in Mixed_Subdivision;
! 161: first : in out Mixed_Subdivision ) is
! 162:
! 163: tmp : Mixed_Subdivision := mixsub;
! 164:
! 165: begin
! 166: while not Is_Null(tmp) loop
! 167: declare
! 168: mic : Mixed_Cell := Head_Of(tmp);
! 169: begin
! 170: Construct(mic,first);
! 171: end;
! 172: tmp := Tail_Of(tmp);
! 173: end loop;
! 174: end Construct;
! 175:
! 176: procedure Construct_Diff ( mixsub : in Mixed_Subdivision;
! 177: first : in out Mixed_Subdivision ) is
! 178:
! 179: tmp : Mixed_Subdivision := mixsub;
! 180:
! 181: begin
! 182: while not Is_Null(tmp) loop
! 183: declare
! 184: mic : Mixed_Cell := Head_Of(tmp);
! 185: begin
! 186: if not Is_In(first,mic)
! 187: then Construct(mic,first);
! 188: end if;
! 189: end;
! 190: tmp := Tail_Of(tmp);
! 191: end loop;
! 192: end Construct_Diff;
! 193:
! 194: -- SELECTORS :
! 195:
! 196: function Equal ( mic1,mic2 : Mixed_Cell ) return boolean is
! 197: begin
! 198: if not Equal(mic1.nor,mic2.nor)
! 199: then return false;
! 200: elsif Equal(mic1.pts,mic2.pts)
! 201: then return Equal(mic1.sub,mic2.sub);
! 202: else return false;
! 203: end if;
! 204: end Equal;
! 205:
! 206: function Is_Sub ( mixsub1,mixsub2 : Mixed_Subdivision ) return boolean is
! 207:
! 208: -- DESCRIPTION :
! 209: -- Returns true when every cell in mixsub1 also belongs to mixsub2.
! 210:
! 211: tmp : Mixed_Subdivision := mixsub1;
! 212:
! 213: begin
! 214: while not Is_Null(tmp) loop
! 215: if not Is_In(mixsub2,Head_Of(tmp))
! 216: then return false;
! 217: else tmp := Tail_Of(tmp);
! 218: end if;
! 219: end loop;
! 220: return true;
! 221: end Is_Sub;
! 222:
! 223: function Equal ( mixsub1,mixsub2 : Mixed_Subdivision ) return boolean is
! 224: begin
! 225: if Is_Sub(mixsub1,mixsub2)
! 226: then return Is_Sub(mixsub2,mixsub1);
! 227: else return false;
! 228: end if;
! 229: end Equal;
! 230:
! 231: function Equal ( mixsub1,mixsub2 : Link_to_Mixed_Subdivision )
! 232: return boolean is
! 233: begin
! 234: if mixsub1 = null and then mixsub2 /= null
! 235: then return false;
! 236: elsif mixsub2 = null
! 237: then return true;
! 238: else return Equal(mixsub1.all,mixsub2.all);
! 239: end if;
! 240: end Equal;
! 241:
! 242: function Is_In ( mixsub : Mixed_Subdivision; normal : Vector )
! 243: return boolean is
! 244:
! 245: tmp : Mixed_Subdivision := mixsub;
! 246: c : Mixed_Cell;
! 247:
! 248: begin
! 249: while not Is_Null(tmp) loop
! 250: c := Head_Of(tmp);
! 251: if Equal(c.nor.all,normal)
! 252: then return true;
! 253: end if;
! 254: tmp := Tail_Of(tmp);
! 255: end loop;
! 256: return false;
! 257: end Is_In;
! 258:
! 259: function Is_In ( mixsub : Mixed_Subdivision; mic : Mixed_Cell )
! 260: return boolean is
! 261:
! 262: tmp : Mixed_Subdivision := mixsub;
! 263: mic1 : Mixed_Cell;
! 264:
! 265: begin
! 266: while not Is_Null(tmp) loop
! 267: mic1 := Head_Of(tmp);
! 268: if Equal(mic1,mic)
! 269: then return true;
! 270: else tmp := Tail_Of(tmp);
! 271: end if;
! 272: end loop;
! 273: return false;
! 274: end Is_In;
! 275:
! 276: -- DESTRUCTORS :
! 277:
! 278: procedure free is new unchecked_deallocation
! 279: (Mixed_Subdivision,Link_to_Mixed_Subdivision);
! 280:
! 281: procedure Deep_Clear ( mic : in out Mixed_Cell ) is
! 282: begin
! 283: Clear(mic.nor); Deep_Clear(mic.pts); Deep_Clear(mic.sub);
! 284: end Deep_Clear;
! 285:
! 286: procedure Shallow_Clear ( mic : in out Mixed_Cell ) is
! 287: begin
! 288: Clear(mic.nor); Shallow_Clear(mic.pts); Shallow_Clear(mic.sub);
! 289: end Shallow_Clear;
! 290:
! 291: procedure Deep_Clear ( mixsub : in out Mixed_Subdivision ) is
! 292:
! 293: tmp : Mixed_Subdivision;
! 294:
! 295: begin
! 296: tmp := mixsub;
! 297: while not Is_Null(tmp) loop
! 298: declare
! 299: mic : Mixed_Cell := Head_Of(tmp);
! 300: begin
! 301: Deep_Clear(mic);
! 302: end;
! 303: tmp := Tail_Of(tmp);
! 304: end loop;
! 305: Shallow_Clear(mixsub);
! 306: end Deep_Clear;
! 307:
! 308: procedure Deep_Clear ( mixsub : in out Link_to_Mixed_Subdivision ) is
! 309: begin
! 310: if mixsub /= null
! 311: then Deep_Clear(mixsub.all);
! 312: free(mixsub);
! 313: end if;
! 314: end Deep_Clear;
! 315:
! 316: procedure Shallow_Clear ( mixsub : in out Mixed_Subdivision ) is
! 317: begin
! 318: Lists_of_Mixed_Cells.Clear(Lists_of_Mixed_Cells.List(mixsub));
! 319: end Shallow_Clear;
! 320:
! 321: procedure Shallow_Clear ( mixsub : in out Link_to_Mixed_Subdivision ) is
! 322: begin
! 323: if mixsub /= null
! 324: then Shallow_Clear(mixsub.all);
! 325: free(mixsub);
! 326: end if;
! 327: end Shallow_Clear;
! 328:
! 329: end Floating_Mixed_Subdivisions;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>