/*!

\page IOStreamSupportedFileFormats Supported File Formats

\cgal provides a large number of data structures and algorithms dedicated to
various applications. This page lists the various supported file formats
and the data structures offered by \cgal that may be used to read and write files of
each specific format.

- \ref IOStreamOFF
- \ref IOStreamOBJ
- \ref IOStreamOM
- \ref IOStreamSTL
- \ref IOStreamPLY
- \ref IOStreamXYZ
- \ref IOStreamVTK
- \ref IOStreamGocad
- \ref IOStream3MF
- \ref IOStreamWRL
- \ref IOStreamLAS
- \ref IOStreamAvizo
- \ref IOStreamMedit
- \ref IOStreamTetgen
- \ref IOStreamWKT

\section IOStreamOFF Object File Format (OFF)

The `OFF` file format, using the file extension `.off`,
can be used to represent collections of planar polygons with possibly shared vertices.
Although it can be as light as providing points and faces described by IDs, the format also allows
users to provide more properties such as associating normals or colors to vertices.

A precise specification of the format is available at <a href="http://www.geomview.org/docs/html/OFF.html">geomview.org</a>.

Note that the format defines both \ascii and binary OFF formats, but only the \ascii OFF format is supported in \cgal.

The following table lists some \cgal data structures that have I/O functions compatible with this file format.

<table class="iotable">
  <tr>
    <th colspan="4">Object File Format (OFF)</th>
  </tr>
  <tr>
    <td rowspan="6" width="75">Input</td>
    <td rowspan="3" width="175">Polygon Mesh</td>
    <td width="250">`CGAL::Surface_mesh`</td>
    <td width="550">\link PkgSurfaceMeshIOFuncOFF CGAL::IO::read_OFF(const std::string&, CGAL::Surface_mesh&)\endlink</td>
  </tr>
  <tr>
    <td>`CGAL::Polyhedron_3`</td>
    <td>\ref CGAL::IO::read_OFF(std::istream& in, CGAL::Polyhedron_3<Traits>& P)</td>
  </tr>
  <tr>
    <td>Any model of `MutableFaceGraph`</td>
    <td>\link PkgBGLIoFuncsOFF CGAL::IO::read_OFF(const std::string&, Graph&)\endlink</td>
  </tr>
  <tr>
    <td rowspan="2">Point Set</td>
    <td>`CGAL::Point_set_3`</td>
    <td>\link PkgPointSet3IOOFF CGAL::IO::read_OFF(const std::string&, CGAL::Point_set_3&)\endlink</td>
  </tr>
  <tr>
    <td>Any point range</td>
    <td>\link PkgPointSetProcessing3IOOff CGAL::IO::read_OFF(const std::string&, PointOutputIterator)\endlink</td>
  </tr>
  <tr>
    <td>Polygon Soup</td>
    <td>Any point + polygon range</td>
    <td>\link PkgStreamSupportIoFuncsOFF CGAL::IO::read_OFF(const std::string&, PointRange&, PolygonRange&)\endlink</td>
  </tr>
  <tr>
    <td rowspan="6">Output</td>
    <td rowspan="3">Polygon Mesh</td>
    <td>`CGAL::Surface_mesh`</td>
    <td>\link PkgSurfaceMeshIOFuncOFF CGAL::IO::write_OFF(const std::string, CGAL::Surface_mesh&)\endlink</td>
  </tr>
  <tr>
    <td>`CGAL::Polyhedron_3`</td>
    <td>\ref CGAL::IO::write_OFF(std::ostream&, const CGAL::Polyhedron_3<Traits>&)</td>
  </tr>
  <tr>
    <td>Any model of `FaceGraph`</td>
    <td>\link PkgBGLIoFuncsOFF CGAL::IO::write_OFF(const std::string&, const Graph&)\endlink</td>
  </tr>
  <tr>
    <td rowspan="2">Point Set</td>
    <td>`CGAL::Point_set_3`</td>
    <td>\link PkgPointSet3IOOFF CGAL::IO::write_OFF(const std::string&, const CGAL::Point_set_3&)\endlink</td>
  </tr>
  <tr>
    <td>Any point range</td>
    <td>\link PkgPointSetProcessing3IOOff CGAL::IO::write_OFF(const std::string&, const PointRange&)\endlink</td>
  </tr>
  <tr>
    <td>Polygon Soup</td>
    <td>Any point + polygon range</td>
    <td>\link PkgStreamSupportIoFuncsOFF CGAL::IO::write_OFF(const std::string&, const PointRange&, const PolygonRange&)\endlink</td>
  </tr>
</table>

If the data of a polygon mesh cannot be read in a `FaceGraph` due to bad orientation or
manifoldness issues, consider using \link PMP_IO_grp `CGAL::Polygon_mesh_processing::IO::read_polygon_mesh()` \endlink,
which offers combinatorial repairing while reading bad inputs.


\section IOStreamOBJ Wavefront Advanced Visualizer Object Format (OBJ)

The `OBJ` file format, using the file extension `.obj`, is a simple \ascii data format that represents 3D geometry.
Vertices are stored in a counterclockwise order by default, making explicit declaration of face normals unnecessary.

A precise specification of the format is available <a href="https://www.martinreddy.net/gfx/3d/OBJ.spec">here</a>.

<table class="iotable">
  <tr>
    <th colspan="4">Wavefront Advanced Visualizer Object Format (OBJ)</th>
  </tr>
  <tr>
    <td rowspan="2" width="75">Input</td>
    <td rowspan="1" width="175">Polygon Mesh</td>
    <td width="250">Any model of `MutableFaceGraph`</td>
    <td width="550">\link PkgBGLIoFuncsOBJ CGAL::IO::read_OBJ(const std::string&, Graph&)\endlink</td>
  </tr>
  <tr>
    <td>Polygon Soup</td>
    <td>Any point + polygon range</td>
    <td>\link PkgStreamSupportIoFuncsOBJ CGAL::IO::read_OBJ(const std::string&, PointRange&, PolygonRange&)\endlink</td>
  </tr>
  <tr>
    <td rowspan="2">Output</td>
    <td rowspan="1">Polygon Mesh</td>
    <td>Any model of `FaceGraph`</td>
    <td>\link PkgBGLIoFuncsOBJ CGAL::IO::write_OBJ(const std::string&, const Graph&)\endlink</td>
  </tr>
  <tr>
    <td>Polygon Soup</td>
    <td>Any point + polygon range</td>
    <td>\link PkgStreamSupportIoFuncsOBJ CGAL::IO::write_OBJ(const std::string&, const PointRange&, const PolygonRange&)\endlink</td>
  </tr>
</table>

If the data of a polygon mesh cannot be read in a `FaceGraph` due to bad orientation or
manifoldness issues, consider using \link PMP_IO_grp `CGAL::Polygon_mesh_processing::IO::read_polygon_mesh()` \endlink,
which offers combinatorial repairing while reading bad inputs.

\section IOStreamOM OpenMesh (OM) File format
The OpenMesh proprietary format, using the file extension `.om`, can be used to represent collections of planar polygons with possibly shared vertices.
Additionally, it allows to store and restore custom properties along with the standard properties.

More information are provided <a href="https://www.graphics.rwth-aachen.de/media/openmesh_static/Documentations/OpenMesh-Doc-Latest/a06338.html">here</a>.

<table class="iotable">
  <tr>
    <th colspan="4">OpenMesh Format (OM)</th>
  </tr>
  <tr>
    <td width="75">Input</td>
    <td width="175">Polygon Mesh</td>
    <td width="250">Any model of `MutableFaceGraph`</td>
    <td width="550">\link PkgBGLIoFuncsOM CGAL::IO::read_OM(const std::string&, Graph&)\endlink</td>
  </tr>
  <tr>
    <td>Output</td>
    <td>Polygon Mesh</td>
    <td>Any model of `FaceGraph`</td>
    <td>\link PkgBGLIoFuncsOM CGAL::IO::write_OM(const std::string&, const Graph&)\endlink</td>
  </tr>
</table>

\section IOStreamSTL STereoLithography (STL) File Format

The `STL` file format, using the file extension `.stl`, is an \ascii or binary format native
to the stereolithography CAD software created by 3D Systems.
STL files describe the surface geometry of a three-dimensional object.

A precise specification of those formats is available <a href="https://www.fabbers.com/tech/STL_Format">here</a>.

<table class="iotable">
  <tr>
    <th colspan="4">STereoLithography (STL)</th>
  </tr>
  <tr>
    <td rowspan="2" width="75">Input</td>
    <td rowspan="1" width="175">Polygon Mesh</td>
    <td width="250">Any model of `MutableFaceGraph`</td>
    <td width="550">\link PkgBGLIoFuncsSTL CGAL::IO::read_STL(const std::string&, Graph&)\endlink</td>
  </tr>
  <tr>
    <td>Polygon Soup</td>
    <td>Any point + polygon range</td>
    <td>\link PkgStreamSupportIoFuncsSTL CGAL::IO::read_STL(const std::string&, PointRange&, TriangleRange&)\endlink</td>
  </tr>
  <tr>
    <td rowspan="2">Output</td>
    <td rowspan="1">Polygon Mesh</td>
    <td>Any model of `FaceGraph`</td>
    <td>\link PkgBGLIoFuncsSTL CGAL::IO::write_STL(const std::string&, const Graph&)\endlink</td>
  </tr>
  <tr>
    <td>Polygon Soup</td>
    <td>Any point + polygon range</td>
    <td>\link PkgStreamSupportIoFuncsSTL CGAL::IO::write_STL(const std::string&, const PointRange&, const TriangleRange&)\endlink</td>
  </tr>
</table>

Note that the STL file format exports triangular faces as geometric triangles and thus
combinatorial information is lost.

If the data of a polygon mesh cannot be read in a `FaceGraph` due to bad orientation or
manifoldness issues, consider using \link PMP_IO_grp `CGAL::Polygon_mesh_processing::IO::read_polygon_mesh()` \endlink,
which offers combinatorial repairing while reading bad inputs.


\section IOStreamPLY Polygon File Format (PLY)

The `PLY` file format, using the file extension `.ply`, is an \ascii or binary format
conceived to store the data obtained during 3D scans. Objects are stored
as a simple list of polygons and external properties can be stored.

A precise specification of those formats is available <a href="https://paulbourke.net/dataformats/ply/">here</a>.

<table class="iotable">
  <tr>
    <th colspan="4">Polygon File Format (PLY)</th>
  </tr>
  <tr>
    <td rowspan="5" width="75">Input</td>
    <td rowspan="2" width="175">Polygon Mesh</td>
    <td width="250">`CGAL::Surface_mesh`</td>
    <td width="550">\link PkgSurfaceMeshIOFuncPLY CGAL::IO::read_PLY(const std::string&, CGAL::Surface_mesh&)\endlink</td>
  </tr>
  <tr>
    <td>Any model of `MutableFaceGraph`</td>
    <td>\link PkgBGLIoFuncsPLY CGAL::IO::read_PLY(const std::string&, Graph&)\endlink</td>
  </tr>
  <tr>
    <td rowspan="2">Point Set</td>
    <td>`CGAL::Point_set_3`</td>
    <td>\link PkgPointSet3IOPLY CGAL::IO::read_PLY(const std::string&, CGAL::Point_set_3&)\endlink</td>
  </tr>
  <tr>
    <td>Any point range</td>
    <td>\link PkgPointSetProcessing3IOPly CGAL::IO::read_PLY(const std::string&, PointRange&)\endlink</td>
  </tr>
  <tr>
    <td>Polygon Soup</td>
    <td>Any point + polygon range</td>
    <td>\link PkgStreamSupportIoFuncsPLY CGAL::IO::read_PLY(const std::string&, PointRange&, PolygonRange&)\endlink</td>
  </tr>
  <tr>
    <td rowspan="5">Output</td>
    <td rowspan="2">Polygon Mesh</td>
    <td>`CGAL::Surface_mesh`</td>
    <td>\link PkgSurfaceMeshIOFuncPLY CGAL::IO::write_PLY(const std::string&, const CGAL::Surface_mesh&)\endlink</td>
  </tr>
  <tr>
    <td>Any model of `FaceGraph`</td>
    <td>\link PkgBGLIoFuncsPLY CGAL::IO::write_PLY(const std::string&, const Graph&)\endlink</td>
  </tr>
  <tr>
    <td rowspan="2">Point Set</td>
    <td>`CGAL::Point_set_3`</td>
    <td>\link PkgPointSet3IOPLY CGAL::IO::write_PLY(const std::string&, const CGAL::Point_set_3&)\endlink</td>
  </tr>
  <tr>
    <td>Any point range</td>
    <td>\link PkgPointSetProcessing3IOPly CGAL::IO::write_PLY(const std::string&, const PointRange&)\endlink</td>
  </tr>
  <tr>
    <td>Polygon Soup</td>
    <td>Any point + polygon range</td>
    <td>\link PkgStreamSupportIoFuncsPLY CGAL::IO::write_PLY(const std::string&, const PointRange&, PolygonRange&)\endlink</td>
  </tr>
</table>

If the data of a polygon mesh cannot be read in a `FaceGraph` due to bad orientation or
manifoldness issues, consider using \link PMP_IO_grp `CGAL::Polygon_mesh_processing::IO::read_polygon_mesh()` \endlink,
which offers combinatorial repairing while reading bad inputs.


\section IOStreamLAS LAS (Lidar) File Format

The `LAS` file format, using the file extension `.las`, is similar to the \ref IOStreamPLY,
except for some characteristics: this format is binary-only and does not handle normals.
The \ref thirdpartyLASlib library is required to read or write using this format.

A precise specification of those formats is available
<a href="https://www.loc.gov/preservation/digital/formats/fdd/fdd000418.shtml">here</a>.

<table class="iotable">
  <tr>
    <th colspan="4">LAS (Lidar) File Format</th>
  </tr>
  <tr>
    <td rowspan="2" width="75">Input</td>
    <td rowspan="2" width="175">Point Set</td>
    <td width="250">`CGAL::Point_set_3`</td>
    <td width="550">\link PkgPointSet3IOLAS CGAL::IO::read_LAS(const std::string&, CGAL::Point_set_3&)\endlink</td>
  </tr>
  <tr>
    <td>Any point range</td>
    <td>\link PkgPointSetProcessing3IOLas CGAL::IO::read_LAS(const std::string&, PointRange&)\endlink</td>
  </tr>
  <tr>
    <td rowspan="2">Output</td>
    <td rowspan="2">Point Set</td>
    <td>`CGAL::Point_set_3`</td>
    <td>\link PkgPointSet3IOLAS CGAL::IO::write_LAS(const std::string&, const CGAL::Point_set_3&)\endlink</td>
  </tr>
  <tr>
    <td>Any point range</td>
    <td>\link PkgPointSetProcessing3IOLas CGAL::IO::write_LAS(const std::string&, const PointRange&)\endlink</td>
  </tr>
</table>


\section IOStreamXYZ XYZ File Format

The `XYZ` format, using the file extension `.xyz`, is a non-standard \ascii data format
regularly used to describe point sets. Each line represent a point, and is composed
of its coordinates and other properties. Only coordinates and normals are currently supported in \cgal.

<table class="iotable">
  <tr>
    <th colspan="4">XYZ File Format</th>
  </tr>
  <tr>
    <td rowspan="2" width="75">Input</td>
    <td rowspan="2" width="175">Point Set</td>
    <td width="250">`CGAL::Point_set_3`</td>
    <td width="550">\link PkgPointSet3IOXYZ CGAL::IO::read_XYZ(const std::string&, CGAL::Point_set_3&)\endlink</td>
  </tr>
  <tr>
    <td>Any point range</td>
    <td>\link PkgPointSetProcessing3IOXyz CGAL::IO::read_XYZ(const std::string&, PointRange&)\endlink</td>
  </tr>
  <tr>
    <td rowspan="2">Output</td>
    <td rowspan="2">Point Set</td>
    <td>`CGAL::Point_set_3`</td>
    <td>\link PkgPointSet3IOXYZ CGAL::IO::write_XYZ(const std::string&, const CGAL::Point_set_3&)\endlink</td>
  </tr>
  <tr>
    <td>Any point range</td>
    <td>\link PkgPointSetProcessing3IOXyz CGAL::IO::write_XYZ(const std::string&, const PointRange&)\endlink</td>
  </tr>
</table>


\section IOStreamGocad GOCAD (TS) File Format

The `GOCAD` format, using the file extension `.ts`, is an \ascii file format
that enables a range of primitive types to be imported into the GOCAD package.

A precise specification of the format is available <a href="https://paulbourke.net/dataformats/gocad/gocad.pdf"> here</a>.

<table class="iotable">
  <tr>
    <th colspan="4">GOCAD (TS) File Format</th>
  </tr>
  <tr>
    <td rowspan="2" width="75">Input</td>
    <td rowspan="1" width="175">Polygon Mesh</td>
    <td width="250">Any model of `MutableFaceGraph`</td>
    <td width="550">\link PkgBGLIoFuncsGOCAD CGAL::IO::read_GOCAD(const std::string&, Graph&)\endlink</td>
  </tr>
  <tr>
    <td>Polygon Soup</td>
    <td>Any point + polygon range</td>
    <td>\link PkgStreamSupportIoFuncsGOCAD CGAL::IO::read_GOCAD(const std::string&, PointRange&, PolygonRange&)\endlink</td>
  </tr>
  <tr>
    <td rowspan="2">Output</td>
    <td rowspan="1">Polygon Mesh</td>
    <td>Any model of `FaceGraph`</td>
    <td>\link PkgBGLIoFuncsGOCAD CGAL::IO::write_GOCAD(const std::string&, const Graph&)\endlink</td>
  </tr>
  <tr>
    <td>Polygon Soup</td>
    <td>Any point + polygon range</td>
    <td>\link PkgStreamSupportIoFuncsGOCAD CGAL::IO::write_GOCAD(const std::string&, const PointRange&, const PolygonRange&)\endlink</td>
  </tr>
</table>

If the data of a polygon mesh cannot be read in a `FaceGraph` due to bad orientation or
manifoldness issues, consider using \link PMP_IO_grp `CGAL::Polygon_mesh_processing::IO::read_polygon_mesh()` \endlink,
which offers combinatorial repairing while reading bad inputs.


\section IOStream3MF 3D Manufacturing Format (3MF)

\attention \cgal needs to be configured with the 3MF Libraries for this function to be available.

The `3MF`, using the file extension `.3mf`, is an open source file format created by the 3MF Consortium.
It is an XML-based format that aims to enhance the \ref IOStreamSTL by adding means to include
extra information such as colors.

A precise specification of the format is available at <a href="https://3mf.io/3mf-specification/">3mf.io</a>;
note that only versions `1.x` are currently supported in \cgal.

<table class="iotable">
  <tr>
    <th colspan="4">3D Manufacturing Format (3MF)</th>
  </tr>
  <tr>
    <td rowspan="2" width="75">Input</td>
    <td rowspan="1" width="175">Polygon Mesh</td>
    <td width="250">`CGAL::Surface_mesh`</td>
    <td width="550">\link PkgSurfaceMeshIOFunc3MF CGAL::IO::read_3MF(const std::string&, Surface_meshRange&)\endlink</td>
  </tr>
  <tr>
    <td>Polygon Soup</td>
    <td>Any point + polygon range</td>
    <td>\link PkgStreamSupportIoFuncs3MF CGAL::IO::read_3MF(const std::string&, PointRanges&, PolygonRanges&)\endlink</td>
  </tr>
  <tr>
    <td rowspan="2">Output</td>
    <td rowspan="1">Polygon Mesh</td>
    <td>Any model of `FaceGraph`</td>
    <td>\link PkgBGLIoFuncs3MF CGAL::IO::write_3MF(const std::string&, const GraphRange&)\endlink</td>
  </tr>
  <tr>
    <td>Polygon Soup</td>
    <td>Any point + polygon range</td>
    <td>\link PkgStreamSupportIoFuncs3MF CGAL::IO::write_3MF(const std::string&, const PointRanges&, const PolygonRanges&)\endlink</td>
  </tr>
</table>

If the data of a polygon mesh cannot be read in a `FaceGraph` due to bad orientation or
manifoldness issues, consider using \link PMP_IO_grp `CGAL::Polygon_mesh_processing::IO::read_polygon_mesh()` \endlink,
which offers combinatorial repairing while reading bad inputs.


\section IOStreamWRL Virtual Reality Modeling Language (VRML) File Format

The `VRML` format, using the file extension `.wrl`, is an \ascii format often used by browser plug-ins
to display virtual reality environments. VRML files are known as “worlds,” which is what "WRL" stands for.
A WRL file includes data specifying 3-D details such as vertices, edges for a 3-D polygon, surface color, ...

A precise specification of the format is available <a href="http://gun.teipir.gr/VRML-amgem/spec/">here</a>.

<table class="iotable">
  <tr>
    <th colspan="4">3D VRML Format (WRL)</th>
  </tr>
  <tr>
    <td rowspan="1" width="75">Output</td>
    <td rowspan="1" width="175">Polygon Mesh</td>
    <td width="250">Any model of `FaceGraph`</td>
    <td width="550">\link PkgBGLIoFuncsWRL CGAL::IO::write_WRL(const std::string&, const Graph&)\endlink</td>
  </tr>
</table>

\section IOStreamVTK VTK (VTU / VTP / legacy) File Formats

\attention \cgal needs to be configured with the VTK Libraries for this function to be available.

The VTK libraries use different file formats to handle data structures, but we only support two:
- The `VTU` format can be used to store a collection of 3D cells, like tetrahedra,
  but also points, triangles, lines, etc. In the <a href="https://vtk.org/"> VTK Libraries</a>.
  It is the format reserved to store
  <a href="https://kitware.github.io/vtk-examples/site/VTKFileFormats/#unstructuredgrid">`Unstructured Grids`</a>,
  and in \cgal,
  we use it to store triangulations (2D and 3D).

- The `VTP` format can be used to store collections of points, lines, and triangles.
  In the <a href="https://vtk.org/"> VTK Libraries</a>, it is the format
  reserved to store `PolyData`, and in \cgal, we use it to store polygon meshes.

We additionally provide a read function for the legacy non-XML `VTK` file format for polygon meshes.

A precise specification of those formats is available at
<a href="https://vtk.org/wp-content/uploads/2015/04/file-formats.pdf">vtk.org</a>.

<table class="iotable">
  <tr>
    <th colspan="4">VTK (VTU / VTP / legacy) File Formats</th>
  </tr>
  <tr>
    <td rowspan="2" width="75">Input</td>
    <td rowspan="1" width="175">Polygon Mesh</td>
    <td width="250">Any model of `MutableFaceGraph`</td>
    <td width="550">\link PkgBGLIoFuncsVTP CGAL::IO::read_VTP(const std::string&, Graph&)\endlink</td>
  </tr>
  <tr>
    <td>Polygon Soup</td>
    <td>Any point + polygon range</td>
    <td>\link PkgStreamSupportIoFuncsVTK CGAL::IO::read_VTP(const std::string&, PointRange&, PolygonRange&)\endlink, <BR> \link PkgStreamSupportIoFuncsVTK CGAL::IO::read_VTK(const std::string&, PointRange&, PolygonRange&)\endlink</td>
  </tr>
  <tr>
    <td rowspan="2">Output</td>
    <td rowspan="1">Polygon Mesh</td>
    <td>Any model of `FaceGraph`</td>
    <td>\link PkgBGLIoFuncsVTP CGAL::IO::write_VTP(const std::string&, const Graph&)\endlink</td>
  </tr>
  <tr>
    <td>Polygon Soup</td>
    <td>Any point + polygon range</td>
    <td>\link PkgStreamSupportIoFuncsVTK CGAL::IO::write_VTP(const std::string&, const PointRange&, const PolygonRange&)\endlink</td>
  </tr>
</table>

The following \cgal data structures can be exported into the `.VTU` file format:

- `CGAL::Mesh_complex_3_in_triangulation_3`, using \link CGAL::IO::output_to_vtu() `CGAL::IO::output_to_vtu()` \endlink
- `CGAL::Constrained_Delaunay_triangulation_2`, using the function \link CGAL::IO::write_VTU `CGAL::IO::write_VTU()` \endlink


\section IOStreamAvizo Avizo File Format

The AmiraMesh format, using file extension `.am`, is used
by the <a href="https://www.fei.com/software/avizo3d">Avizo</a> software to read 3D geometry.

A single \cgal data structure, `CGAL::Mesh_complex_3_in_triangulation_3`, can be exported into `.am` files.
This can be done using the function \link CGAL::IO::output_to_avizo() `CGAL::IO::output_to_avizo()`\endlink.

A precise specification of the format is available
<a href="https://assets.thermofisher.com/TFS-Assets/MSD/Product-Guides/users-guide-avizo-software-2019.pdf">in this guide</a>.

\section IOStreamMedit Medit File Format

The Medit format, using file extension `.mesh`, is a format used by the Medit software.
In \cgal, it is used to represent 3D meshes.

A precise specification of the format is available <a href="https://inria.hal.science/inria-00069921/document">in this report</a>,
in the appendices (section 7.2.1, page 36).

The following \cgal data structures can be exported into the `.mesh` file format:

- `CGAL::Mesh_complex_3_in_triangulation_3`, using the function
  \link CGAL::IO::write_MEDIT(std::ostream &, const CGAL::Mesh_complex_3_in_triangulation_3< T3, CornerIndex, CurveIndex >&, const NamedParameters &) `CGAL::IO::write_MEDIT(` \endlink, and
- `CGAL::Conforming_constrained_Delaunay_triangulation_3`, using the function
  \link CGAL::IO::write_MEDIT(std::ostream &os, const CGAL::Conforming_constrained_Delaunay_triangulation_3< Traits, Tr > &ccdt, const NamedParameters& np) `CGAL::IO::write_MEDIT(` \endlink.


\section IOStreamTetgen Tetgen File Format

The `Tetgen` file formats can be used to represent lists of nodes, edges, faces, ...
A precise specification of the format is available at <a href="https://wias-berlin.de/software/tetgen/fformats.html"> wias-berlin.de</a>.

Only the `CGAL::Mesh_complex_3_in_triangulation_3` \cgal data structure can be exported into
some of the Tetgen file formats, namely `.node`, `.ele` and `.face`.
This can be done using the function \link CGAL::IO::output_to_tetgen `CGAL::IO::output_to_tetgen()`\endlink.


\section IOStreamWKT Well-Known Text (WKT) File Format

The `WKT` format, using the file extension `.wkt`, is a text markup language for representing
vector geometry objects on a geographical map.

A precise specification of the format is available on <A HREF="https://en.wikipedia.org/wiki/Well-known_text">wikipedia</A>.

See Section \ref IOstream2DGeo for a list of available functions.
*/
