namespace CGAL {

/*!
\ingroup PkgHalfedgeDS_HDS

The class `HalfedgeDS_list` is a model for the `HalfedgeDS` concept.
`HalfedgeDS_list` is a list-based representation with bidirectional
iterators that supports removal.

\cgalModelsBareBegin
\cgalModelsBare{`HalfedgeDS<Traits,Items,Alloc>`}
\cgalModelsBareEnd

\sa `CGAL::HalfedgeDS_default`
\sa `CGAL::HalfedgeDS_vector`
\sa `HalfedgeDSItems`
\sa `CGAL::Polyhedron_3<Traits>`
\sa `CGAL::HalfedgeDS_items_decorator<HDS>`
\sa `CGAL::HalfedgeDS_decorator<HDS>`
\sa `CGAL::HalfedgeDS_const_decorator<HDS>`

\cgalHeading{Implementation}

`HalfedgeDS_list` uses internally the `CGAL::In_place_list` container class.
The copy constructor and the assignment operator need \cgalBigO{n} time with
\f$ n\f$ the total number of vertices, halfedges, and faces.

`CGAL_ALLOCATOR(int)` is used as default argument for the
`Alloc` template parameter.

*/
template< typename Traits, typename HalfedgeDSItems, typename Alloc >
class HalfedgeDS_list {
public:

/// \name Types
/// @{

/*!

*/
typedef bidirectional_iterator_tag iterator_category;

/*!

*/
typedef CGAL::Tag_true Supports_removal;

/// @}

/*! \name Operations
  Besides operations required from the concept
  `HalfedgeDS<Traits,Items,Alloc>`, this class supports
  additionally:
*/
/// @{

/*!
inserts elements in the range [`first, last`) before position
`target` and removes the elements from `source`. It takes
constant time if `&source == &``hds`; otherwise, it takes linear
time in the size of the range. \pre [`first, last`) is a valid range in `source`. `target` is not in the range [`first, last`).
*/
void vertices_splice( Vertex_iterator target, Self &source,
Vertex_iterator first, Vertex_iterator last);

/*!
inserts elements in the range [`first, last`) before position
`target` and removes the elements from `source`. It takes
constant time if `&source == &``hds`; otherwise, it takes linear
time in the size of the range. \pre [`first, last`) is a valid range in `source`. `target` is not in the range [`first, last`).
*/
void halfedges_splice( Halfedge_iterator target, Self &source,
Halfedge_iterator first, Halfedge_iterator last);

/*!
inserts elements in the range [`first, last`) before position
`target` and removes the elements from `source`. It takes
constant time if `&source == &``hds`; otherwise, it takes linear
time in the size of the range. \pre [`first, last`) is a valid range in `source`. `target` is not in the range [`first, last`).
*/
void faces_splice( Face_iterator target, Self &source,
Face_iterator first, Face_iterator last);

/// @}

}; /* end HalfedgeDS_list */
} /* end namespace CGAL */
