with Standard_Integer_Vectors; use Standard_Integer_Vectors;
package body Flatten_Mixed_Subdivisions is
procedure Flatten ( l : in out List ) is
tmp : List := l;
pt : Link_to_Vector;
begin
while not Is_Null(tmp) loop
pt := Head_Of(tmp);
if pt(pt'last) /= 0
then pt(pt'last) := 0;
Set_Head(tmp,pt);
end if;
tmp := Tail_Of(tmp);
end loop;
end Flatten;
procedure Flatten ( l : in out Array_of_Lists ) is
begin
for i in l'range loop
Flatten(l(i));
end loop;
end Flatten;
procedure Flatten ( mic : in out Mixed_Cell ) is
begin
Flatten(mic.pts.all);
mic.nor.all := (mic.nor'range => 0);
mic.nor(mic.nor'last) := 1;
end Flatten;
procedure Old_Flatten ( mixsub : in out Mixed_Subdivision ) is
tmp : Mixed_Subdivision := mixsub;
mic : Mixed_Cell;
begin
while not Is_Null(tmp) loop
mic := Head_Of(tmp);
Flatten(mic);
Set_Head(tmp,mic);
tmp := Tail_Of(tmp);
end loop;
end Old_Flatten;
-- NEW FLATTENING, USING THE RECURSIVE DATA STRUCTURE :
function Collect_Supports ( n : natural; mixsub : Mixed_Subdivision )
return Array_of_Lists is
-- DESCRIPTION :
-- Returns the array of list of points that occur in the cells
-- of the mixed subdivision.
-- REQUIRED : not Is_Null(mixsub).
tmp : Mixed_Subdivision := mixsub;
mic : Mixed_Cell := Head_Of(mixsub);
tmppts : List;
pt : Link_to_Vector;
res,res_last : Array_of_Lists(mic.pts'range);
begin
while not Is_Null(tmp) loop
mic := Head_Of(tmp);
for k in mic.pts'range loop
tmppts := mic.pts(k);
while not Is_Null(tmppts) loop
pt := Head_Of(tmppts);
if not Is_In(res(k),pt)
then Append(res(k),res_last(k),pt.all);
end if;
tmppts := Tail_Of(tmppts);
end loop;
end loop;
tmp := Tail_Of(tmp);
end loop;
return res;
end Collect_Supports;
procedure Flatten ( mixsub : in out Mixed_Subdivision ) is
-- DESCRIPTION :
-- Flattens the mixed subdivision, i.e., the modified mixed subdivision
-- contains one flattened cells with all the points that occured in the
-- subdivision. The original mixed subdivision is stored as the
-- subdivision of that flattened cell.
begin
if not Is_Null(mixsub)
then declare
n : constant natural := Head_Of(mixsub).nor'length-1;
mic : Mixed_Cell;
res : Mixed_Subdivision;
begin
mic.nor := new Standard_Integer_Vectors.Vector(1..n+1);
mic.pts := new Array_of_Lists'(Collect_Supports(n,mixsub));
Flatten(mic);
mic.sub := new Mixed_Subdivision'(mixsub);
Construct(mic,res);
mixsub := res;
end;
end if;
end Flatten;
end Flatten_Mixed_Subdivisions;