Stream_support: Return false if nothing read

This commit is contained in:
Andreas Fabri 2025-08-20 15:10:31 +01:00
parent 2ae34a22ba
commit 8cedde9036
2 changed files with 35 additions and 7 deletions

View File

@ -133,16 +133,19 @@ bool read_multi_point_WKT(std::istream& in,
MultiPoint& mp) MultiPoint& mp)
{ {
std::string line; std::string line;
bool found = false;
while(internal::get_a_new_line(in, line)) while(internal::get_a_new_line(in, line))
{ {
if(line.substr(0, 10).compare("MULTIPOINT") == 0) if(line.substr(0, 10).compare("MULTIPOINT") == 0)
{ {
CGAL::internal::Geometry_container<MultiPoint, boost::geometry::multi_point_tag> gc(mp); CGAL::internal::Geometry_container<MultiPoint, boost::geometry::multi_point_tag> gc(mp);
internal::read_wkt_or_fail_stream(in, line, gc); found = internal::read_wkt_or_fail_stream(in, line, gc);
break; break;
} }
} }
if(! found){
return false;
}
return !in.fail(); return !in.fail();
} }
@ -168,16 +171,20 @@ bool read_linestring_WKT(std::istream& in,
LineString& polyline) LineString& polyline)
{ {
std::string line; std::string line;
bool found = false;
while(internal::get_a_new_line(in, line)) while(internal::get_a_new_line(in, line))
{ {
if(line.substr(0, 10).compare("LINESTRING") == 0) if(line.substr(0, 10).compare("LINESTRING") == 0)
{ {
CGAL::internal::Geometry_container<LineString, boost::geometry::linestring_tag> gc(polyline); CGAL::internal::Geometry_container<LineString, boost::geometry::linestring_tag> gc(polyline);
internal::read_wkt_or_fail_stream(in, line, gc); found = internal::read_wkt_or_fail_stream(in, line, gc);
break; break;
} }
} }
if(! found){
return false;
}
return !in.fail(); return !in.fail();
} }
@ -199,6 +206,7 @@ bool read_multi_linestring_WKT(std::istream& in,
MultiLineString& mls) MultiLineString& mls)
{ {
std::string line; std::string line;
bool found = false;
while(internal::get_a_new_line(in, line)) while(internal::get_a_new_line(in, line))
{ {
if(line.substr(0, 15).compare("MULTILINESTRING") == 0) if(line.substr(0, 15).compare("MULTILINESTRING") == 0)
@ -209,7 +217,7 @@ bool read_multi_linestring_WKT(std::istream& in,
std::vector<LineString> pr_range; std::vector<LineString> pr_range;
CGAL::internal::Geometry_container<std::vector<LineString>, boost::geometry::multi_linestring_tag> gc(pr_range); CGAL::internal::Geometry_container<std::vector<LineString>, boost::geometry::multi_linestring_tag> gc(pr_range);
internal::read_wkt_or_fail_stream(in, line, gc); found = internal::read_wkt_or_fail_stream(in, line, gc);
for(LineString& ls : gc) { for(LineString& ls : gc) {
mls.push_back(*ls.range); mls.push_back(*ls.range);
} }
@ -237,15 +245,19 @@ bool read_polygon_WKT(std::istream& in,
Polygon& polygon) Polygon& polygon)
{ {
std::string line; std::string line;
bool found = false;
while(internal::get_a_new_line(in, line)) while(internal::get_a_new_line(in, line))
{ {
if(line.substr(0, 7).compare("POLYGON") == 0) if(line.substr(0, 7).compare("POLYGON") == 0)
{ {
internal::read_wkt_or_fail_stream(in, line, polygon); found = internal::read_wkt_or_fail_stream(in, line, polygon);
internal::pop_back_if_equal_to_front(polygon); internal::pop_back_if_equal_to_front(polygon);
break; break;
} }
} }
if(! found){
return false;
}
return !in.fail(); return !in.fail();
} }
@ -268,12 +280,13 @@ bool read_multi_polygon_WKT(std::istream& in,
MultiPolygon& polygons) MultiPolygon& polygons)
{ {
std::string line; std::string line;
bool found = false;
while(internal::get_a_new_line(in, line)) while(internal::get_a_new_line(in, line))
{ {
if(line.substr(0, 12).compare("MULTIPOLYGON") == 0) if(line.substr(0, 12).compare("MULTIPOLYGON") == 0)
{ {
CGAL::internal::Geometry_container<MultiPolygon, boost::geometry::multi_polygon_tag> gc(polygons); CGAL::internal::Geometry_container<MultiPolygon, boost::geometry::multi_polygon_tag> gc(polygons);
internal::read_wkt_or_fail_stream(in, line, gc); found = internal::read_wkt_or_fail_stream(in, line, gc);
for(auto& p : gc) for(auto& p : gc)
internal::pop_back_if_equal_to_front(p); internal::pop_back_if_equal_to_front(p);
@ -281,7 +294,9 @@ bool read_multi_polygon_WKT(std::istream& in,
break; break;
} }
} }
if(! found){
return false;
}
return !in.fail(); return !in.fail();
} }

View File

@ -24,6 +24,17 @@ typedef std::vector<Point3> MultiPoint
typedef std::vector<Linestring3> MultiLinestring3; typedef std::vector<Linestring3> MultiLinestring3;
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
bool test_mismatch()
{
Point3 p(1,2,3);
MultiPoint3 mq;
std::stringstream ss;
CGAL::IO::write_point_WKT(ss, p);
bool b = CGAL::IO::read_multi_point_WKT(ss, mq);
assert(!b);
return !b;
}
bool test_WKT_3D() bool test_WKT_3D()
{ {
{ {
@ -337,6 +348,8 @@ int main()
assert(ok); assert(ok);
ok = test_WKT_3D(); ok = test_WKT_3D();
assert(ok); assert(ok);
ok = test_mismatch();
assert(ok);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }