Do the same for the other hole filling functions
This commit is contained in:
@@ -243,7 +243,7 @@ namespace Polygon_mesh_processing {
|
||||
overload with the named parameter `face_output_iterator` should be
|
||||
used instead.
|
||||
|
||||
Triangulates a hole in a polygon mesh.
|
||||
\briefTriangulates a hole in a polygon mesh.
|
||||
|
||||
|
||||
@tparam PolygonMesh a model of `MutableFaceGraph`
|
||||
@@ -261,67 +261,7 @@ namespace Polygon_mesh_processing {
|
||||
OutputIterator out,
|
||||
const CGAL_NP_CLASS& np = parameters::default_values())
|
||||
{
|
||||
// As soon as the other one returns something
|
||||
// return triangulate_hole(pmesh, border_halfedge,np.face_output_iterator(out));
|
||||
|
||||
using parameters::choose_parameter;
|
||||
using parameters::get_parameter;
|
||||
using parameters::get_parameter_reference;
|
||||
|
||||
typedef typename GetGeomTraits<PolygonMesh,CGAL_NP_CLASS>::type GeomTraits;
|
||||
|
||||
bool use_dt3 =
|
||||
#ifdef CGAL_HOLE_FILLING_DO_NOT_USE_DT3
|
||||
false;
|
||||
#else
|
||||
choose_parameter(get_parameter(np, internal_np::use_delaunay_triangulation), true);
|
||||
#endif
|
||||
|
||||
CGAL_precondition(face(border_halfedge, pmesh) == boost::graph_traits<PolygonMesh>::null_face());
|
||||
bool use_cdt =
|
||||
#ifdef CGAL_HOLE_FILLING_DO_NOT_USE_CDT2
|
||||
false;
|
||||
#else
|
||||
choose_parameter(get_parameter(np, internal_np::use_2d_constrained_delaunay_triangulation), false);
|
||||
#endif
|
||||
|
||||
typename GeomTraits::FT max_squared_distance = typename GeomTraits::FT(-1);
|
||||
if (use_cdt) {
|
||||
|
||||
std::vector<typename GeomTraits::Point_3> points;
|
||||
typedef Halfedge_around_face_circulator<PolygonMesh> Hedge_around_face_circulator;
|
||||
const auto vpmap = choose_parameter(get_parameter(np, internal_np::vertex_point), get_property_map(vertex_point, pmesh));
|
||||
Hedge_around_face_circulator circ(border_halfedge, pmesh), done(circ);
|
||||
do {
|
||||
points.push_back(get(vpmap, target(*circ, pmesh)));
|
||||
} while (++circ != done);
|
||||
|
||||
const typename GeomTraits::Iso_cuboid_3 bbox = CGAL::bounding_box(points.begin(), points.end());
|
||||
typename GeomTraits::FT default_squared_distance = CGAL::abs(CGAL::squared_distance(bbox.vertex(0), bbox.vertex(5)));
|
||||
default_squared_distance /= typename GeomTraits::FT(16); // one quarter of the bbox height
|
||||
|
||||
const typename GeomTraits::FT threshold_distance = choose_parameter(
|
||||
get_parameter(np, internal_np::threshold_distance), typename GeomTraits::FT(-1));
|
||||
max_squared_distance = default_squared_distance;
|
||||
if (threshold_distance >= typename GeomTraits::FT(0))
|
||||
max_squared_distance = threshold_distance * threshold_distance;
|
||||
CGAL_assertion(max_squared_distance >= typename GeomTraits::FT(0));
|
||||
}
|
||||
|
||||
Hole_filling::Default_visitor default_visitor;
|
||||
|
||||
return internal::triangulate_hole_polygon_mesh(
|
||||
pmesh,
|
||||
border_halfedge,
|
||||
out,
|
||||
choose_parameter(get_parameter(np, internal_np::vertex_point), get_property_map(vertex_point, pmesh)),
|
||||
use_dt3,
|
||||
choose_parameter<GeomTraits>(get_parameter(np, internal_np::geom_traits)),
|
||||
use_cdt,
|
||||
choose_parameter(get_parameter(np, internal_np::do_not_use_cubic_algorithm), false),
|
||||
choose_parameter(get_parameter_reference(np, internal_np::visitor), default_visitor),
|
||||
max_squared_distance).first;
|
||||
|
||||
return triangulate_hole(pmesh, border_halfedge,np.face_output_iterator(out));
|
||||
}
|
||||
#endif // CGAL_NO_DEPRECATED_CODE
|
||||
|
||||
@@ -330,19 +270,28 @@ namespace Polygon_mesh_processing {
|
||||
@brief triangulates and refines a hole in a polygon mesh.
|
||||
|
||||
@tparam PolygonMesh must be model of `MutableFaceGraph`
|
||||
@tparam FacetOutputIterator model of `OutputIterator`
|
||||
holding `boost::graph_traits<PolygonMesh>::%face_descriptor` for patch faces.
|
||||
@tparam VertexOutputIterator model of `OutputIterator`
|
||||
holding `boost::graph_traits<PolygonMesh>::%vertex_descriptor` for patch vertices.
|
||||
@tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters"
|
||||
|
||||
@param pmesh polygon mesh which has the hole
|
||||
@param border_halfedge a border halfedge incident to the hole
|
||||
@param face_out output iterator over patch faces
|
||||
@param vertex_out output iterator over patch vertices without including the boundary
|
||||
@param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
|
||||
|
||||
\cgalNamedParamsBegin
|
||||
|
||||
\cgalParamNBegin{face_output_iterator}
|
||||
\cgalParamDescription{iterator over patch faces}
|
||||
\cgalParamType{a model of `OutputIterator`
|
||||
holding `boost::graph_traits<PolygonMesh>::%face_descriptor` for patch faces}
|
||||
\cgalParamDefault{`Emptyset_iterator`}
|
||||
\cgalParamNEnd
|
||||
|
||||
\cgalParamNBegin{vertex_output_iterator}
|
||||
\cgalParamDescription{iterator over patch vertices}
|
||||
\cgalParamType{a model of `OutputIterator`
|
||||
holding `boost::graph_traits<PolygonMesh>::%vertex_descriptor` for patch vertices}
|
||||
\cgalParamDefault{`Emptyset_iterator`}
|
||||
\cgalParamNEnd
|
||||
|
||||
\cgalParamNBegin{vertex_point_map}
|
||||
\cgalParamDescription{a property map associating points to the vertices of `pmesh`}
|
||||
\cgalParamType{a class model of `ReadWritePropertyMap` with `boost::graph_traits<PolygonMesh>::%vertex_descriptor`
|
||||
@@ -411,7 +360,7 @@ namespace Polygon_mesh_processing {
|
||||
\cgalParamNEnd
|
||||
\cgalNamedParamsEnd
|
||||
|
||||
@return pair of `face_out` and `vertex_out`
|
||||
@return pair of face and vertex output iterator
|
||||
|
||||
\sa CGAL::Polygon_mesh_processing::triangulate_hole()
|
||||
\sa CGAL::Polygon_mesh_processing::refine()
|
||||
@@ -419,53 +368,108 @@ namespace Polygon_mesh_processing {
|
||||
\todo handle islands
|
||||
*/
|
||||
template<typename PolygonMesh,
|
||||
typename FaceOutputIterator,
|
||||
typename VertexOutputIterator,
|
||||
typename NamedParameters = parameters::Default_named_parameters>
|
||||
std::pair<FaceOutputIterator, VertexOutputIterator>
|
||||
triangulate_and_refine_hole(PolygonMesh& pmesh,
|
||||
typename CGAL_NP_TEMPLATE_PARAMETERS>
|
||||
auto
|
||||
triangulate_and_refine_hole(PolygonMesh& pmesh,
|
||||
typename boost::graph_traits<PolygonMesh>::halfedge_descriptor border_halfedge,
|
||||
FaceOutputIterator face_out,
|
||||
VertexOutputIterator vertex_out,
|
||||
const NamedParameters& np = parameters::default_values())
|
||||
const CGAL_NP_CLASS& np = parameters::default_values())
|
||||
{
|
||||
using parameters::choose_parameter;
|
||||
using parameters::get_parameter;
|
||||
using parameters::get_parameter_reference;
|
||||
|
||||
typedef typename internal_np::Lookup_named_param_def<internal_np::face_output_iterator_t,
|
||||
CGAL_NP_CLASS,
|
||||
Emptyset_iterator>::type Face_output_iterator;
|
||||
|
||||
Face_output_iterator face_out = choose_parameter<Emptyset_iterator>(get_parameter(np, internal_np::face_output_iterator));
|
||||
|
||||
typedef typename internal_np::Lookup_named_param_def<internal_np::vertex_output_iterator_t,
|
||||
CGAL_NP_CLASS,
|
||||
Emptyset_iterator>::type Vertex_output_iterator;
|
||||
|
||||
Vertex_output_iterator vertex_out = choose_parameter<Emptyset_iterator>(get_parameter(np, internal_np::vertex_output_iterator));
|
||||
|
||||
std::vector<typename boost::graph_traits<PolygonMesh>::face_descriptor> patch;
|
||||
triangulate_hole(pmesh, border_halfedge, std::back_inserter(patch), np);
|
||||
face_out = std::copy(patch.begin(), patch.end(), face_out);
|
||||
|
||||
Hole_filling::Default_visitor default_visitor;
|
||||
typedef typename internal_np::Lookup_named_param_def<internal_np::visitor_t,
|
||||
NamedParameters,
|
||||
CGAL_NP_CLASS,
|
||||
Hole_filling::Default_visitor>::reference Visitor;
|
||||
|
||||
Visitor visitor = choose_parameter(get_parameter_reference(np, internal_np::visitor), default_visitor);
|
||||
visitor.start_refine_phase();
|
||||
std::pair<FaceOutputIterator, VertexOutputIterator> res = refine(pmesh, patch, face_out, vertex_out, np);
|
||||
std::pair<Face_output_iterator, Vertex_output_iterator> res = refine(pmesh, patch, face_out, vertex_out, np);
|
||||
visitor.end_refine_phase();
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
#ifndef CGAL_NO_DEPRECATED_CODE
|
||||
/*!
|
||||
\ingroup PMP_hole_filling_grp
|
||||
|
||||
\deprecated This function is deprecated since \cgal 5.6 and the
|
||||
overload with the named parameters `face_output_iterator` and
|
||||
`vertex_output_iterator` should be used instead.
|
||||
|
||||
@brief triangulates and refines a hole in a polygon mesh.
|
||||
|
||||
@tparam PolygonMesh must be model of `MutableFaceGraph`
|
||||
@tparam FaceOutputIterator model of `OutputIterator`
|
||||
holding `boost::graph_traits<PolygonMesh>::%face_descriptor` for patch faces.
|
||||
@tparam VertexOutputIterator model of `OutputIterator`
|
||||
holding `boost::graph_traits<PolygonMesh>::%vertex_descriptor` for patch vertices.
|
||||
@tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters"
|
||||
*/
|
||||
|
||||
template<typename PolygonMesh,
|
||||
typename FaceOutputIterator,
|
||||
typename VertexOutputIterator,
|
||||
typename CGAL_NP_TEMPLATE_PARAMETERS>
|
||||
CGAL_DEPRECATED
|
||||
std::pair<FaceOutputIterator, VertexOutputIterator>
|
||||
triangulate_and_refine_hole(PolygonMesh& pmesh,
|
||||
typename boost::graph_traits<PolygonMesh>::halfedge_descriptor border_halfedge,
|
||||
FaceOutputIterator face_out,
|
||||
VertexOutputIterator vertex_out,
|
||||
const CGAL_NP_CLASS& np = parameters::default_values())
|
||||
{
|
||||
return triangulate_and_refine_hole(pmesh, border_halfedge,
|
||||
np.face_output_iterator(face_out).vertex_output_iterator(vertex_out));
|
||||
}
|
||||
#endif // CGAL_NO_DEPRECATED_CODE
|
||||
|
||||
/*!
|
||||
\ingroup PMP_hole_filling_grp
|
||||
@brief triangulates, refines and fairs a hole in a polygon mesh.
|
||||
|
||||
@tparam PolygonMesh a model of `MutableFaceGraph`
|
||||
@tparam FaceOutputIterator model of `OutputIterator`
|
||||
holding `boost::graph_traits<PolygonMesh>::%face_descriptor` for patch faces
|
||||
@tparam VertexOutputIterator model of `OutputIterator`
|
||||
holding `boost::graph_traits<PolygonMesh>::%vertex_descriptor` for patch vertices
|
||||
@tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters"
|
||||
|
||||
@param pmesh polygon mesh which has the hole
|
||||
@param border_halfedge a border halfedge incident to the hole
|
||||
@param face_out output iterator over patch faces
|
||||
@param vertex_out output iterator over patch vertices without including the boundary
|
||||
|
||||
@param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below
|
||||
|
||||
\cgalNamedParamsBegin
|
||||
|
||||
\cgalParamNBegin{face_output_iterator}
|
||||
\cgalParamDescription{iterator over patch faces}
|
||||
\cgalParamType{a model of `OutputIterator`
|
||||
holding `boost::graph_traits<PolygonMesh>::%face_descriptor` for patch faces}
|
||||
\cgalParamDefault{`Emptyset_iterator`}
|
||||
\cgalParamNEnd
|
||||
|
||||
\cgalParamNBegin{vertex_output_iterator}
|
||||
\cgalParamDescription{iterator over patch vertices}
|
||||
\cgalParamType{a model of `OutputIterator`
|
||||
holding `boost::graph_traits<PolygonMesh>::%vertex_descriptor` for patch vertices}
|
||||
\cgalParamDefault{`Emptyset_iterator`}
|
||||
\cgalParamNEnd
|
||||
|
||||
\cgalParamNBegin{vertex_point_map}
|
||||
\cgalParamDescription{a property map associating points to the vertices of `pmesh`}
|
||||
\cgalParamType{a class model of `ReadWritePropertyMap` with `boost::graph_traits<PolygonMesh>::%vertex_descriptor`
|
||||
@@ -543,10 +547,8 @@ namespace Polygon_mesh_processing {
|
||||
\cgalParamNEnd
|
||||
\cgalNamedParamsEnd
|
||||
|
||||
@return tuple of
|
||||
- `bool`: `true` if fairing is successful
|
||||
- `face_out`
|
||||
- `vertex_out`
|
||||
@return tuple of `bool` with `true` if fairing is successful, and
|
||||
the face and vertex output iterator
|
||||
|
||||
\sa CGAL::Polygon_mesh_processing::triangulate_hole()
|
||||
\sa CGAL::Polygon_mesh_processing::refine()
|
||||
@@ -555,23 +557,32 @@ namespace Polygon_mesh_processing {
|
||||
\todo handle islands
|
||||
*/
|
||||
template<typename PolygonMesh,
|
||||
typename FaceOutputIterator,
|
||||
typename VertexOutputIterator,
|
||||
typename NamedParameters = parameters::Default_named_parameters>
|
||||
std::tuple<bool, FaceOutputIterator, VertexOutputIterator>
|
||||
typename CGAL_NP_TEMPLATE_PARAMETERS>
|
||||
auto
|
||||
triangulate_refine_and_fair_hole(PolygonMesh& pmesh,
|
||||
typename boost::graph_traits<PolygonMesh>::halfedge_descriptor border_halfedge,
|
||||
FaceOutputIterator face_out,
|
||||
VertexOutputIterator vertex_out,
|
||||
const NamedParameters& np = parameters::default_values())
|
||||
const CGAL_NP_CLASS& np = parameters::default_values())
|
||||
{
|
||||
CGAL_precondition(CGAL::is_triangle_mesh(pmesh));
|
||||
|
||||
using parameters::choose_parameter;
|
||||
using parameters::get_parameter;
|
||||
using parameters::get_parameter_reference;
|
||||
|
||||
CGAL_precondition(is_valid_halfedge_descriptor(border_halfedge, pmesh));
|
||||
|
||||
typedef typename internal_np::Lookup_named_param_def<internal_np::face_output_iterator_t,
|
||||
CGAL_NP_CLASS,
|
||||
Emptyset_iterator>::type Face_output_iterator;
|
||||
|
||||
Face_output_iterator face_out = choose_parameter<Emptyset_iterator>(get_parameter(np, internal_np::face_output_iterator));
|
||||
|
||||
typedef typename internal_np::Lookup_named_param_def<internal_np::vertex_output_iterator_t,
|
||||
CGAL_NP_CLASS,
|
||||
Emptyset_iterator>::type Vertex_output_iterator;
|
||||
|
||||
Vertex_output_iterator vertex_out = choose_parameter<Emptyset_iterator>(get_parameter(np, internal_np::vertex_output_iterator));
|
||||
|
||||
std::vector<typename boost::graph_traits<PolygonMesh>::vertex_descriptor> patch;
|
||||
face_out = triangulate_and_refine_hole
|
||||
(pmesh, border_halfedge, face_out, std::back_inserter(patch), np).first;
|
||||
@@ -580,7 +591,7 @@ namespace Polygon_mesh_processing {
|
||||
|
||||
Hole_filling::Default_visitor default_visitor;
|
||||
typedef typename internal_np::Lookup_named_param_def<internal_np::visitor_t,
|
||||
NamedParameters,
|
||||
CGAL_NP_CLASS,
|
||||
Hole_filling::Default_visitor>::reference Visitor;
|
||||
|
||||
Visitor visitor = choose_parameter(get_parameter_reference(np, internal_np::visitor), default_visitor);
|
||||
@@ -592,6 +603,39 @@ namespace Polygon_mesh_processing {
|
||||
return std::make_tuple(fair_success, face_out, vertex_out);
|
||||
}
|
||||
|
||||
#ifndef CGAL_NO_DEPRECATED_CODE
|
||||
/*!
|
||||
\ingroup PMP_hole_filling_grp
|
||||
|
||||
\deprecated This function is deprecated since \cgal 5.6 and the
|
||||
overload with the named parameters `face_output_iterator` and
|
||||
`vertex_output_iterator` should be used instead.
|
||||
|
||||
\brief Triangulates, refines, and fairs a hole in a polygon mesh.
|
||||
|
||||
@tparam PolygonMesh a model of `MutableFaceGraph`
|
||||
@tparam FaceOutputIterator model of `OutputIterator`
|
||||
holding `boost::graph_traits<PolygonMesh>::%face_descriptor` for patch faces.
|
||||
@tparam VertexOutputIterator model of `OutputIterator`
|
||||
holding `boost::graph_traits<PolygonMesh>::%vertex_descriptor` for patch vertices.
|
||||
@tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters"
|
||||
*/
|
||||
template<typename PolygonMesh,
|
||||
typename FaceOutputIterator,
|
||||
typename VertexOutputIterator,
|
||||
typename CGAL_NP_TEMPLATE_PARAMETERS>
|
||||
CGAL_DEPRECATED
|
||||
std::tuple<bool, FaceOutputIterator, VertexOutputIterator>
|
||||
triangulate_refine_and_fair_hole(PolygonMesh& pmesh,
|
||||
typename boost::graph_traits<PolygonMesh>::halfedge_descriptor border_halfedge,
|
||||
FaceOutputIterator face_out,
|
||||
VertexOutputIterator vertex_out,
|
||||
const CGAL_NP_CLASS& np = parameters::default_values())
|
||||
{
|
||||
return triangulate_refine_and_fair_hole(pmesh, border_halfedge, np.face_output_iterator(face_out).vertex_output_iterator(vertex_out));
|
||||
}
|
||||
#endif // CGAL_NO_DEPRECATED_CODE
|
||||
|
||||
/*!
|
||||
\ingroup PMP_hole_filling_grp
|
||||
creates triangles to fill the hole defined by points in the range `points`.
|
||||
|
||||
+9
-13
@@ -112,8 +112,7 @@ void test_triangulate_hole_weight(const std::string file_name, std::size_t nb_re
|
||||
for(typename std::vector<Halfedge_handle>::iterator it = border_reps.begin(); it != border_reps.end(); ++it) {
|
||||
std::vector<Facet_handle> patch;
|
||||
CGAL::Polygon_mesh_processing::triangulate_hole(
|
||||
poly, *it, CGAL::parameters::use_delaunay_triangulation(true).
|
||||
face_output_iterator(back_inserter(patch)));
|
||||
poly, *it, back_inserter(patch),CGAL::parameters::use_delaunay_triangulation(true));
|
||||
if(patch.empty()) { continue; }
|
||||
}
|
||||
|
||||
@@ -162,17 +161,15 @@ void test_triangulate_hole_should_be_no_output(const std::string file_name) {
|
||||
|
||||
for(typename std::vector<Halfedge_handle>::iterator it = border_reps.begin(); it != border_reps.end(); ++it) {
|
||||
std::vector<Facet_handle> patch;
|
||||
CGAL::Polygon_mesh_processing::triangulate_hole(poly, *it,
|
||||
CGAL::parameters::use_delaunay_triangulation(false).
|
||||
face_output_iterator(back_inserter(patch)));
|
||||
CGAL::Polygon_mesh_processing::triangulate_hole(poly, *it, back_inserter(patch),
|
||||
CGAL::parameters::use_delaunay_triangulation(false));
|
||||
if(!patch.empty()) {
|
||||
std::cerr << " Error: patch should be empty" << std::endl;
|
||||
assert(false);
|
||||
}
|
||||
|
||||
CGAL::Polygon_mesh_processing::triangulate_hole(poly, *it,
|
||||
CGAL::parameters::use_delaunay_triangulation(true).
|
||||
face_output_iterator(back_inserter(patch)));
|
||||
CGAL::Polygon_mesh_processing::triangulate_hole(poly, *it, back_inserter(patch),
|
||||
CGAL::parameters::use_delaunay_triangulation(true));
|
||||
if(!patch.empty()) {
|
||||
std::cerr << " Error: patch should be empty" << std::endl;
|
||||
assert(false);
|
||||
@@ -197,7 +194,7 @@ void test_triangulate_and_refine_hole(const std::string file_name) {
|
||||
std::vector<Facet_handle> patch_facets;
|
||||
std::vector<Vertex_handle> patch_vertices;
|
||||
CGAL::Polygon_mesh_processing::triangulate_and_refine_hole(poly, *it,
|
||||
back_inserter(patch_facets), back_inserter(patch_vertices));
|
||||
CGAL::parameters::face_output_iterator(back_inserter(patch_facets)).vertex_output_iterator(back_inserter(patch_vertices)));
|
||||
|
||||
if(patch_facets.empty()) {
|
||||
std::cerr << " Error: empty patch created." << std::endl;
|
||||
@@ -228,7 +225,7 @@ void test_triangulate_refine_and_fair_hole(const std::string file_name) {
|
||||
std::vector<Facet_handle> patch_facets;
|
||||
std::vector<Vertex_handle> patch_vertices;
|
||||
CGAL::Polygon_mesh_processing::triangulate_refine_and_fair_hole(poly,
|
||||
*it, back_inserter(patch_facets), back_inserter(patch_vertices));
|
||||
*it, CGAL::parameters::face_output_iterator(back_inserter(patch_facets)).vertex_output_iterator(back_inserter(patch_vertices)));
|
||||
|
||||
if(patch_facets.empty()) {
|
||||
std::cerr << " Error: empty patch created." << std::endl;
|
||||
@@ -261,12 +258,11 @@ void test_ouput_iterators_triangulate_hole(const std::string file_name) {
|
||||
typename std::vector<Halfedge_handle>::iterator it_2 = border_reps_2.begin();
|
||||
for(typename std::vector<Halfedge_handle>::iterator it = border_reps.begin(); it != border_reps.end(); ++it, ++it_2) {
|
||||
std::vector<Facet_handle> patch;
|
||||
CGAL::Polygon_mesh_processing::triangulate_hole(poly, *it, CGAL::parameters::face_output_iterator(back_inserter(patch)));
|
||||
CGAL::Polygon_mesh_processing::triangulate_hole(poly, *it, back_inserter(patch));
|
||||
|
||||
std::vector<Facet_handle> patch_2 = patch;
|
||||
Facet_handle* output_it =
|
||||
CGAL::Polygon_mesh_processing::triangulate_hole(poly_2, *it_2,
|
||||
CGAL::parameters::face_output_iterator(&*patch_2.begin()));
|
||||
CGAL::Polygon_mesh_processing::triangulate_hole(poly_2, *it_2, &*patch_2.begin());
|
||||
|
||||
if(patch.size() != (std::size_t)(output_it - &*patch_2.begin())) {
|
||||
std::cerr << " Error: returned facet output iterator is not valid!" << std::endl;
|
||||
|
||||
Reference in New Issue
Block a user