[BACK]Return to flatten_mixed_subdivisions.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Root_Counts / Dynlift

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Dynlift/flatten_mixed_subdivisions.adb, Revision 1.1.1.1

1.1       maekawa     1: with Standard_Integer_Vectors;           use Standard_Integer_Vectors;
                      2:
                      3: package body Flatten_Mixed_Subdivisions is
                      4:
                      5:   procedure Flatten ( l : in out List ) is
                      6:
                      7:     tmp : List := l;
                      8:     pt : Link_to_Vector;
                      9:
                     10:   begin
                     11:     while not Is_Null(tmp) loop
                     12:       pt := Head_Of(tmp);
                     13:       if pt(pt'last) /= 0
                     14:        then pt(pt'last) := 0;
                     15:             Set_Head(tmp,pt);
                     16:       end if;
                     17:       tmp := Tail_Of(tmp);
                     18:     end loop;
                     19:   end Flatten;
                     20:
                     21:   procedure Flatten ( l : in out Array_of_Lists ) is
                     22:   begin
                     23:     for i in l'range loop
                     24:       Flatten(l(i));
                     25:     end loop;
                     26:   end Flatten;
                     27:
                     28:   procedure Flatten ( mic : in out Mixed_Cell ) is
                     29:   begin
                     30:     Flatten(mic.pts.all);
                     31:     mic.nor.all := (mic.nor'range => 0);
                     32:     mic.nor(mic.nor'last) := 1;
                     33:   end Flatten;
                     34:
                     35:   procedure Old_Flatten ( mixsub : in out Mixed_Subdivision ) is
                     36:
                     37:     tmp : Mixed_Subdivision := mixsub;
                     38:     mic : Mixed_Cell;
                     39:
                     40:   begin
                     41:     while not Is_Null(tmp) loop
                     42:       mic := Head_Of(tmp);
                     43:       Flatten(mic);
                     44:       Set_Head(tmp,mic);
                     45:       tmp := Tail_Of(tmp);
                     46:     end loop;
                     47:   end Old_Flatten;
                     48:
                     49: -- NEW FLATTENING, USING THE RECURSIVE DATA STRUCTURE :
                     50:
                     51:   function Collect_Supports ( n : natural; mixsub : Mixed_Subdivision )
                     52:                             return Array_of_Lists is
                     53:
                     54:   -- DESCRIPTION :
                     55:   --   Returns the array of list of points that occur in the cells
                     56:   --   of the mixed subdivision.
                     57:
                     58:   -- REQUIRED : not Is_Null(mixsub).
                     59:
                     60:     tmp : Mixed_Subdivision := mixsub;
                     61:     mic : Mixed_Cell := Head_Of(mixsub);
                     62:     tmppts : List;
                     63:     pt : Link_to_Vector;
                     64:     res,res_last : Array_of_Lists(mic.pts'range);
                     65:
                     66:   begin
                     67:     while not Is_Null(tmp) loop
                     68:       mic := Head_Of(tmp);
                     69:       for k in mic.pts'range loop
                     70:         tmppts := mic.pts(k);
                     71:         while not Is_Null(tmppts) loop
                     72:           pt := Head_Of(tmppts);
                     73:           if not Is_In(res(k),pt)
                     74:            then Append(res(k),res_last(k),pt.all);
                     75:           end if;
                     76:           tmppts := Tail_Of(tmppts);
                     77:         end loop;
                     78:       end loop;
                     79:       tmp := Tail_Of(tmp);
                     80:     end loop;
                     81:     return res;
                     82:   end Collect_Supports;
                     83:
                     84:   procedure Flatten ( mixsub : in out Mixed_Subdivision ) is
                     85:
                     86:   -- DESCRIPTION :
                     87:   --   Flattens the mixed subdivision, i.e., the modified mixed subdivision
                     88:   --   contains one flattened cells with all the points that occured in the
                     89:   --   subdivision.  The original mixed subdivision is stored as the
                     90:   --   subdivision of that flattened cell.
                     91:
                     92:   begin
                     93:     if not Is_Null(mixsub)
                     94:      then declare
                     95:             n : constant natural := Head_Of(mixsub).nor'length-1;
                     96:             mic : Mixed_Cell;
                     97:             res : Mixed_Subdivision;
                     98:           begin
                     99:             mic.nor := new Standard_Integer_Vectors.Vector(1..n+1);
                    100:             mic.pts := new Array_of_Lists'(Collect_Supports(n,mixsub));
                    101:             Flatten(mic);
                    102:             mic.sub := new Mixed_Subdivision'(mixsub);
                    103:             Construct(mic,res);
                    104:             mixsub := res;
                    105:           end;
                    106:     end if;
                    107:   end Flatten;
                    108:
                    109: end Flatten_Mixed_Subdivisions;

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