namespace CGAL {
/*!

\mainpage User Manual
\anchor Chapter_Linear_Cell_Complex
\anchor ChapterLinearCellComplex

\author Guillaume Damiand
\cgalAutoToc

\section Linear_cell_complexIntroduction Introduction

A <I>d</I>D linear cell complex allows to represent an orientable
subdivided <I>d</I>D object having linear geometry: each vertex of the
subdivision is associated with a point. The geometry of each edge is a
segment whose end points are associated with the two vertices of the
edge, the geometry of each 2-cell is obtained from all the segments
associated to the edges describing the boundary of the 2-cell and so
on.

The combinatorial part of a linear cell complex is described by a
<I>d</I>D combinatorial map (it is strongly recommended to first
read the \ref ChapterCombinatorialMap "Combinatorial maps user manual"
for definitions). To add
the linear geometrical embedding, a point (a model of
\ref Kernel::Point_2 "Point_2" or \ref Kernel::Point_3 "Point_3" or \ref Kernel_d::Point_d "Point_d") is
associated to each vertex of the combinatorial map.

\cgalFigureBegin{figexempleintroductif,objects2d-3d.png}
Examples of objects with linear geometry. <B>Left</B>: A 2D object
composed of three 2-cells, nine 1-cells and seven points associated to
the seven 0-cells . <B>Right</B>: A 3D object composed of three
3-cells, twelve 2-cells, sixteen 1-cells and eight points associated
to the eight 0-cells.
\cgalFigureEnd

If we reconsider the example introduced in the combinatorial map
package, recalled in \cgalFigureRef{figexempleintroductif} (Right), the
combinatorial part of the 3D object is described by a 3D combinatorial
map. As illustrated in \cgalFigureRef{figexempleintroductiflcc}, the
geometrical part of the object is described by associating a point to
each vertex of the map.

\cgalFigureBegin{figexempleintroductiflcc,first-example-lcc.png}
Example of 3D linear cell complex describing the object given in \cgalFigureRef{figexempleintroductif} (Right). <B>Left</B>: The 3D linear cell complex which contains 54 darts (18 for each 3-cell) where each vertex is associated with a point, here a `Point_3`. Blue segments represent \f$ \beta_3\f$ relations. <B>Middle</B>: Zoom around the central edge which details the six darts belonging to the edge and the associations between darts and points. <B>Right</B>: Zoom around the facet between light gray and white 3-cells, which details the eight darts belonging to the facet and the associations between darts and points (given by red segments).
\cgalFigureEnd

Note that the dimension of the combinatorial map <I>d</I> is not
necessarily equal to the dimension of the ambient space
<I>d2</I>. Indeed, we can use for example a 2D combinatorial map in a
2D ambient space to describe a planar graph
(<I>d</I>=<I>d2</I>=<I>2</I>), or a 2D combinatorial map in a 3D
ambient space to describe a surface in 3D space (<I>d</I>=2,
<I>d2</I>=3) (case of the `Polyhedron_3` package), or a 3D
combinatorial map in a 3D ambient space (<I>d</I>=<I>d2</I>=3) and so
on.

\section Linear_cell_complexSoftware Software Design

The diagram in \cgalFigureRef{figdiagram_class_lcc} shows the main
classes of the package. `Linear_cell_complex` is the main
class (see Section \ref sseclinearcellcomplex), which inherits from
the `Combinatorial_map` class. Attributes can be associated
to some cells of the linear cell complex thanks to an items class (see
Section \ref sseclccitem "Linear Cell Complex Items"), which defines the dart type and the
attributes types. These types may be different for different
dimensions of cells, and they may also be void. In the class
`Linear_cell_complex`, it is required that
specific attributes are associated to all vertices of the
combinatorial map. These attributes must contain a point (a model of
 (a model of
\ref Kernel::Point_2 "Point_2" or \ref Kernel::Point_3 "Point_3" or \ref Kernel_d::Point_d "Point_d"),
and can be represented by instances of class
`Cell_attribute_with_point` (see
Section \ref ssecattributewp "Cell Attributes").

\cgalFigureBegin{figdiagram_class_lcc,Diagramme_class.png}
UML diagram of the main classes of the package. Gray elements come from the \ref ChapterCombinatorialMap "Combinatorial maps package".
\cgalFigureEnd


\section sseclinearcellcomplex Linear Cell Complex

The \ref CGAL::Linear_cell_complex "Linear_cell_complex<d,d2,LCCTraits,Items,Alloc>" class
is a model of the `CombinatorialMap` concept. It guarantees that
each vertex of the combinatorial map is associated with an attribute
containing a point. This class can be used in geometric algorithms (it
plays the same role as `Polyhedron_3` for \ref chapterHalfedgeDS "Halfedge Data Structures").

This class has five template parameters standing for the dimension of
the combinatorial map, the dimension of the ambient space, a traits
class (a model of the `LinearCellComplexTraits` concept, see
Section \ref sseclcctraits "Linear Cell Complex Traits"), an items class (a model of the
`LinearCellComplexItems` concept, see
Section \ref sseclccitem "Linear Cell Complex Items"), and an allocator which must be a model
of the allocator concept of \stl. %Default classes are provided for
the traits, items, and for the allocator classes, and by default
`d2=d`.

A linear cell complex is valid, if it is a valid combinatorial map
where each dart is associated with an attribute containing a point
(i.e.\ an instance of a model of the `CellAttributeWithPoint`
concept). Note that there are no validity constraints on the geometry
(test on self intersection, planarity of 2-cells...).
We can see two examples of `Linear_cell_complex` in
\cgalFigureRef{figcombi_map_with_point}.

\cgalFigureBegin{figcombi_map_with_point,lcc-examples-2d-3d.png}
Examples of `Linear_cell_complex`. Gray disks show the attributes associated to vertices. Associations between darts and attributes are drawn by small lines between darts and disks. <B>Left:</B> Example of `Linear_cell_complex<2,2>`. <B>Right:</B> Example of `Linear_cell_complex<3,3>`.
\cgalFigureEnd


\subsection Linear_cell_complexCellAttributes Cell Attributes
\anchor ssecattributewp

The `Cell_attribute_with_point<LCC,Info_,Tag,OnMerge,OnSplit>`
class is a model of the `CellAttributeWithPoint` concept, which is
a refinement of the `CellAttribute` concept. It represents an
attribute associated with a cell, which can contain an information
(depending on whether `Info_==void` or not), but which always
contains a point, an instance of \ref Linear_cell_complex::Point "LCC::Point".

\subsection Linear_cell_complexLinearCellComplexTraits Linear Cell Complex Traits
\anchor sseclcctraits

The `LinearCellComplexTraits` geometric traits concept defines the
required types and functors used in the `Linear_cell_complex`
class. For example it defines \ref LinearCellComplexTraits::Point "Point", the type of points used,
and \ref LinearCellComplexTraits::Vector "Vector", the corresponding vector type. It also defines all
the required functors used for constructions and operations, as for
example \ref LinearCellComplexTraits::Construct_translated_point "Construct_translated_point" or
\ref LinearCellComplexTraits::Construct_sum_of_vectors "Construct_sum_of_vectors".

The class `Linear_cell_complex_traits<d,K>` is a model of
`LinearCellComplexTraits`. It defines the different types which
are obtained from `K` that, depending on `d`, is a model of
the concept `Kernel` if `d==2` or `d==3`, and a model of
the concept `Kernel_d` otherwise.

\subsection Linear_cell_complexLinearCellComplexItems Linear Cell Complex Items
\anchor sseclccitem

The `LinearCellComplexItems` concept refines the
`CombinatorialMapItems` concept by adding the requirement that
0-attributes are enabled, and associated with a type of attribute
being a model of the `CellAttributeWithPoint` concept.

The class `Linear_cell_complex_min_items<d>` is a
model of `LinearCellComplexItems`. It uses `Dart<d>`,
and instances of `Cell_attribute_with_point`
(which contain no information) associated to each vertex. All other
attributes are `void`.

\section Linear_cell_complexOperations Operations

Several operations defined in the combinatorial maps package can be
used on a linear cell complex. This is the case for all the iteration
operations that do not modify the model (see example in
Section \ref ssec3Dlcc "A 3D Linear Cell Complex"). This is also the case for
all the operations that do not create new 0-cells: \ref CombinatorialMap::sew "sew",
\ref CombinatorialMap::unsew "unsew", `::remove_cell`, `::insert_cell_1_in_cell_2`,
`::insert_cell_2_in_cell_3`. Indeed, all these operations update
non `void` attributes, and thus update vertex attributes of a linear
cell complex. Note that some existing 0-attributes can be duplicated
by the \ref CombinatorialMap::unsew "unsew" method, but these 0-attributes are not new but
copies of existing old 0-attributes.

However, operations that create a new 0-cell can not be directly used
since the new 0-cell would not be associated with a vertex
attribute. Indeed, it is not possible for these operations to
automatically decide which point to create. These operations are:
`::insert_cell_0_in_cell_1`, `::insert_cell_0_in_cell_2`,
`::insert_dangling_cell_1_in_cell_2`, plus all the creation
operations. For these operations, new versions are proposed taking
some points as additional parameters. Lastly, some new operations are
defined, which use the geometry (see sections \ref ssecconstructionsop
"Construction Operations" and \ref ssecmodifop "Modification Operations").

All the operations given in this section guarantee that given a valid
linear cell complex and a possible operation, the result is a valid
linear cell complex. As for a combinatorial map, it is also possible
to use low level operations but additional operations may be needed to
restore the validity conditions.

\subsection sseclcclinkdarts Sewing and Unsewing

As explained in the combinatorial map user manual,
Section \ref sseclinkdarts "Sewing Orbits and Linking Darts", it is possible to glue two <I>i</I>-cells
along an (<I>i</I>-1)-cell by using the \ref CombinatorialMap::sew "sew<i>" method. Since
this method updates non void attributes, and since points are specific
attributes, they are automatically updated during the \ref CombinatorialMap::sew "sew<i>"
method. Thus the sewing of two <I>i</I>-cells could deform the
geometry of the concerned objects.

For example, in \cgalFigureRef{figlccexemplesew}, we want to 3-sew the
two initial 3-cells. \ref CombinatorialMap::sew "sew<3>(1,5)" links by \f$ \beta_3\f$ the pairs
of darts (1,5), (2,8), (3,7) and (4,6). The eight vertex attributes
around the facet between the two 3-cells before the sew are merged by
pair during the sew operation (and the \ref CellAttribute::On_merge "On_merge" functor is
called four times). Thus, after the sew, there are only four
0-attributes around the facet. By default, the attributes associated
with the first dart of the sew operation are kept (but this can be
modified by defining your own functor in the attribute class as
explained in the package combinatorial map, Section \ref sseclinkdarts "Sewing Orbits and Linking Darts").
Intuitively, the
geometry of the second 2-cell is deformed to fit to the first 2-cell.

\cgalFigureBegin{figlccexemplesew,exemple-lcc3d-sew.png}
Example of \ref CombinatorialMap::sew "3-sew" operation for linear cell complex. <B>Left</B>: A 3D linear cell complex containing two 3-cells that are not connected. Vertex attributes are drawn with circles containing point coordinates. Associations between darts and attributes are drawn with small lines between darts and disks. <B>Right</B>: The 3D linear cell complex obtained as result of `sew<3>(1,5)` (or `sew<3>(2,8)`, or `sew<3>(3,7)`, or `sew<3>(4,6)`). The eight 0-attributes around the facet between the two 3-cells before the sew operation, are merged into four 0-attributes after. The geometry of the pyramid is deformed since its base is fitted on the 2-cell of the cube.
\cgalFigureEnd

This is similar for the \ref CombinatorialMap::unsew "unsew" operation, which removes \f$ \beta_i\f$ links
of all the darts in
\f$ \langle{}\f$\f$ \beta_1\f$,\f$ \ldots\f$,\f$ \beta_{i-2}\f$,\f$ \beta_{i+2}\f$,\f$ \ldots\f$,\f$ \beta_d\f$\f$ \rangle{}\f$(<I>d0</I>),
and updates
non void attributes which are no more associated to a same cell due to
the unlinks. If we take the linear cell complex given in
\cgalFigureRef{figlccexemplesew} (Right), and we call
\ref CombinatorialMap::unsew "unsew<3>(2)", we obtain the linear cell complex in
\cgalFigureRef{figlccexemplesew} (Left) except for the coordinates of
the new four vertices, which by default are copies of original
vertices (this behavior can be modified thanks to the functor
\ref CellAttribute::On_split "On_split" in the attribute class).
The \ref CombinatorialMap::unsew "unsew<3>" operation
has removed the four \f$ \beta_3\f$ links, and has duplicated the 0-attributes
since vertices are split in two after the unsew operation.

\cgalAdvancedBegin
If \link CombinatorialMap::set_automatic_attributes_management `set_automatic_attributes_management(false)`\endlink is called, all the future sew and unsew operations will not update non void attributes. These attributes will be updated latter by the call to \link CombinatorialMap::set_automatic_attributes_management `set_automatic_attributes_management(true)`\endlink.
\cgalAdvancedEnd


\subsection Linear_cell_complexConstructionOperations Construction Operations
\anchor ssecconstructionsop

There are several member functions allowing to insert specific
configurations of darts into a linear cell complex. These functions
return a `Dart_handle` to the new object. Note
that the dimension of the linear cell complex must be large enough:
darts must contain all the \f$ \beta\f$ used by the operation. All these
methods add new darts in the current linear cell complex, existing
darts are not modified. These functions
are \ref Linear_cell_complex::make_segment "make_segment",
\ref Linear_cell_complex::make_triangle "make_triangle",
\ref Linear_cell_complex::make_tetrahedron "make_tetrahedron" and
\ref Linear_cell_complex::make_hexahedron "make_hexahedron".

There are two functions allowing to build a linear cell complex
from two other \cgal data types:
<UL>
<LI>\ref ::import_from_triangulation_3 "import_from_triangulation_3(lcc,atr)": adds in `lcc` all
the tetrahedra present in `atr`, a \ref CGAL::Triangulation_3 "Triangulation_3";
<LI>\ref ::import_from_polyhedron_3 "import_from_polyhedron_3(lcc,ap)": adds in `lcc` all
the cells present in `ap`, a `Polyhedron_3`.
</UL>

Lastly, the function \ref ::import_from_plane_graph "import_from_plane_graph(lcc,ais)" adds in
`lcc` all the cells reconstructed from the planar graph read in
`ais`, a `std::istream` (see the  \ref ::import_from_plane_graph "reference manual" for the file
format).

\subsection Linear_cell_complexModificationOperations Modification Operations
\anchor ssecmodifop

Some methods are defined in `Linear_cell_complex` class
to modify a linear cell complex and update the vertex attributes. In
the following, we denote by `dh0`, `dh1`, `dh2` the dart
handles for the darts `d0`, `d1`, `d2`, respectively. That
is `d0 == *dh0`.

\cgalFigureBegin{figlccinsertvertex,insert-vertex.png}
Example of \ref Linear_cell_complex::insert_barycenter_in_cell "insert_barycenter_in_cell<1>" and `::remove_cell<0>` operations. <B>Left</B>: Initial linear cell complex. <B>Right</B>: After the insertion of a point in the barycenter of the 1-cell containing dart <I>d1</I>. Now if we remove the 0-cell containing dart <I>d2</I>, we obtain a linear cell complex isomorphic to the initial one.
\cgalFigureEnd


\ref Linear_cell_complex::insert_barycenter_in_cell "lcc.insert_barycenter_in_cell<unsigned int i>(dh0)" adds the
barycenter of the <I>i</I>-cell containing dart `d0`. This
operation is possible if `d0`\f$ \in\f$\ref CombinatorialMap::darts "lcc.darts()" (see examples
on \cgalFigureRef{figlccinsertvertex} and
\cgalFigureRef{figlcctriangulate}).

\ref Linear_cell_complex::insert_point_in_cell "lcc.insert_point_in_cell<unsigned int i>(dh0,p)" is an operation
similar to the previous operation, the only difference being that the
coordinates of the new point are here given by `p` instead of being
computed as the barycenter of the <I>i</I>-cell. Currently, these two
operations are only defined for `i=1` to insert a point in an
edge, or `i=2` to insert a point in a facet.

\cgalFigureBegin{figlcctriangulate,triangulation.png}
Examples of \ref Linear_cell_complex::insert_barycenter_in_cell "insert_barycenter_in_cell<2>" operation.
\cgalFigureEnd


\ref Linear_cell_complex::insert_dangling_cell_1_in_cell_2 "lcc.insert_dangling_cell_1_in_cell_2(dh0,p)" adds a 1-cell in
the 2-cell containing dart `d0`, the 1-cell being attached by only
one of its vertex to the 0-cell containing dart `d0`. The second
vertex of the new edge is associated with a new 0-attribute containing
a copy of `p` as point. This operation is possible if
`d0`\f$ \in\f$\ref CombinatorialMap::darts "lcc.darts()" (see example on
\cgalFigureRef{figlccinsertdanglingedge}).

\cgalFigureBegin{figlccinsertdanglingedge,insert-edge.png}
Example of \ref Linear_cell_complex::insert_dangling_cell_1_in_cell_2 "insert_dangling_cell_1_in_cell_2", `::insert_cell_1_in_cell_2` and `::remove_cell<1>` operations. <B>Left</B>: Initial linear cell complex. <B>Right</B>: After the insertion of a dangling 1-cell in the 2-cell containing dart <I>d1</I>, and of a 1-cell in the 2-cell containing dart <I>d2</I>. Now if we remove the 1-cells containing dart <I>d4</I> and <I>d5</I>, we obtain a linear cell complex isomorphic to the initial one.
\cgalFigureEnd

Some examples of use of these operations are given in
Section \ref ssec5dexample "A 4D Linear Cell Complex".

\cgalAdvancedBegin
If \link CombinatorialMap::set_automatic_attributes_management `set_automatic_attributes_management(false)`\endlink is called, all the future insertion or removal operations will not update non void attributes. These attributes will be updated latter by the call to \link CombinatorialMap::set_automatic_attributes_management `set_automatic_attributes_management(true)`\endlink. This can be useful to speed up an algorithm which uses several successive insertion and removal operations. See example \ref ssecAttributesManagement "Automatic attributes management".
\cgalAdvancedEnd

\section Linear_cell_complexExamples Examples

\subsection Linear_cell_complexA3DLinearCellComplex A 3D Linear Cell Complex
\anchor ssec3Dlcc

This example uses a 3-dimensional linear cell complex. It creates two
tetrahedra and displays all the points of the linear cell complex
thanks to a \ref Linear_cell_complex::Vertex_attribute_const_range "Vertex_attribute_const_range". Then, the two
tetrahedra are \ref CombinatorialMap::sew "3-sewn" and we translate all the points of the second
tetrahedron along vector `v(3,1,1)`. Since the two tetrahedra
are 3-sewn, this translation moves also the 2-cell of the first
tetrahedron shared with the second one. This is illustrated by
displaying all the points of each 3-cell. For that we use a
`std::for_each` and the `Display_vol_vertices` functor.

\cgalExample{Linear_cell_complex/linear_cell_complex_3.cpp}

The output is:
\verbatim
Vertices: 1 1 2; 1 0 0; 0 2 0; -1 0 0; 1 1 -3; 1 0 -1; -1 0 -1; 0 2 -1;
Volume 1 : -1 0 0; 0 2 0; 1 0 0; 1 1 2;
Volume 2 : 0 2 -1; -1 0 -1; 1 0 -1; 1 1 -3;
Volume 1 : -1 0 0; 0 2 0; 1 0 0; 1 1 2;
Volume 2 : 0 2 0; -1 0 0; 1 0 0; 1 1 -3;
Volume 1 : 2 1 1; 3 3 1; 4 1 1; 1 1 2;
Volume 2 : 3 3 1; 2 1 1; 4 1 1; 4 2 -2;
LCC characteristics: #Darts=24, #0-cells=5, #1-cells=9, #2-cells=7, #3-cells=2, #ccs=1, valid=1
\endverbatim

The first line gives the points of the linear cell complex before the
\ref CombinatorialMap::sew "sew<3>". There are eight points, four for each tetrahedron.
After the sew, six vertices are merged two by two, thus there are five
vertices. We can see the points of each 3-cell (lines Volume 1 and
Volume 2) before the sew, after the sew and after the translation of
the second volume. We can see that this translation has also modified
the three common points between the two 3-cells. The last line shows
the number of cells of the linear cell complex, the number of
connected components, and finally a Boolean to show the validity of
the linear cell complex.

\subsection Linear_cell_complexA4DLinearCellComplex A 4D Linear Cell Complex
\anchor ssec5dexample

This example uses a 4-dimensional linear cell complex embedded in a
5-dimensional ambient space. It creates two tetrahedra having 5D
points and sews the two tetrahedra by \f$ \beta_4\f$. Then we use some high
level operations, display the number of cells of the linear cell
complex, and check its validity. Last we use the reverse operations
to get back to the initial configuration.

\cgalExample{Linear_cell_complex/linear_cell_complex_4.cpp}

The output is:
\verbatim
#Darts=24, #0-cells=8, #1-cells=12, #2-cells=8, #3-cells=2, #4-cells=2, #ccs=2, valid=1
#Darts=24, #0-cells=4, #1-cells=6, #2-cells=4, #3-cells=1, #4-cells=2, #ccs=1, valid=1
#Darts=28, #0-cells=5, #1-cells=7, #2-cells=4, #3-cells=1, #4-cells=2, #ccs=1, valid=1
#Darts=32, #0-cells=5, #1-cells=8, #2-cells=5, #3-cells=1, #4-cells=2, #ccs=1, valid=1
#Darts=24, #0-cells=8, #1-cells=12, #2-cells=8, #3-cells=2, #4-cells=2, #ccs=2, valid=1
\endverbatim

\subsection Linear_cell_complexA3DLinearCellComplexwith A 3D Linear Cell Complex with Colored Vertices

\anchor ssecexemplecolorvertices

This example illustrates the way to use a 3D linear cell complex by
adding another information to vertices. For that, we need to define
our own items class. The difference with the
`Linear_cell_complex_min_items` class is about the definition of
the vertex attribute where we use a `Cell_attribute_with_point`
with a non `void` info. In this example, the "vertex color" is just
given by an `int` (the second template parameter of the
`Cell_attribute_with_point`). Lastly, we define the
`Average_functor` class in order to set the color of a vertex
resulting of the merging of two vertices to the average of the two
initial values. This functor is associated with the vertex attribute
by passing it as template parameter. Using this items class instead of
the default one is done during the instantiation of template
parameters of the `Linear_cell_complex` class.

Now we can use `LCC_3` in which each vertex is associated with an
attribute containing both a point and an information. In the following
example, we create two cubes, and set the color of the vertices of the
first cube to 1 and of the second cube to 19 (by iterating through two
\ref CombinatorialMap::One_dart_per_incident_cell_range "One_dart_per_incident_cell_range<0, 3>" ranges). Then we
\ref CombinatorialMap::sew "3-sew" the two cubes along one facet. This operation merges some
vertices (as in the example of \cgalFigureRef{figlccexemplesew}). We
insert a vertex in the common 2-cell between the two cubes, and set
the information of the new 0-attribute to 5. In the last loop, we
display the point and the information of each vertex of the linear
cell complex.

\cgalExample{Linear_cell_complex/linear_cell_complex_3_with_colored_vertices.cpp}

The output is:
\verbatim
point: -1 1 1, color: 10
point: -1 0 1, color: 10
point: -2 0 1, color: 1
point: -2 1 1, color: 1
point: -2 1 0, color: 1
point: -1 1 0, color: 10
point: -1 0 0, color: 10
point: -2 0 0, color: 1
point: 1 1 1, color: 19
point: 1 0 1, color: 19
point: -1 0.5 0.5, color: 5
point: 1 1 0, color: 19
point: 1 0 0, color: 19
\endverbatim

Before applying the sew operation, the eight vertices of the first
cube are colored by `1`, and the eight vertices of the second cube by
`19`. After the sew operation, there are eight vertices which are merged
two by two, and due to the average functor, the color of the four
resulting vertices is now 10. Then we insert a vertex in the center
of the common 2-cell between the two cubes. The coordinates of this
vertex are initialized with the barycenter of the 2-cell
(-1,0.5,0.5), and its color is not initialized by the method, thus we
set its color manually by using the result of
\ref Linear_cell_complex::insert_barycenter_in_cell "insert_barycenter_in_cell<2>" which is a dart incident to the
new vertex.

\subsection Linear_cell_complexAutomaticAttributesManagement Automatic attributes management
\anchor ssecAttributesManagement

The following example illustrates the use of the automatic attributes management for a linear cell complex. An off file is loaded into a 2D linear cell complex embedded in 3D. Then, a certain percentage of edges is removed from the linear cell complex. The same method is applied twice: the first time by using the automatic attributes management (which is the default behaviour) and the second time by calling first  \link CombinatorialMap::set_automatic_attributes_management `set_automatic_attributes_management(false)`\endlink to disable the automatic updating of attributes.

We can observe that the second run is faster than the first one. Indeed, updating attribute for each edge removal give a bigger complexity. Moreover, the gain increases when the percentage of removed edges increases.

\cgalExample{Linear_cell_complex/linear_cell_complex_3_attributes_management.cpp}

\section Linear_cell_complexDesign Design and Implementation History

This package was developed by Guillaume Damiand, with the help of
Andreas Fabri, S&eacute;bastien Loriot and Laurent Rineau. Monique
Teillaud and Bernd G&auml;rtner contributed to the manual.

*/
} /* namespace CGAL */

