diff --git a/Convex_hull_3/include/CGAL/Convex_hull_vertex_base_2.h b/Convex_hull_3/include/CGAL/Convex_hull_vertex_base_2.h index 2ec965bb809..a7f31124646 100644 --- a/Convex_hull_3/include/CGAL/Convex_hull_vertex_base_2.h +++ b/Convex_hull_3/include/CGAL/Convex_hull_vertex_base_2.h @@ -77,7 +77,7 @@ template std::ostream& operator<<(std::ostream &os, const Convex_hull_vertex_base_2& v) { - return os << static_cast(v) << v.point(); + return os << static_cast(v) << IO::serialize(v.point()); } } //namespace CGAL diff --git a/Stream_support/include/CGAL/IO/io.h b/Stream_support/include/CGAL/IO/io.h index e287fe8e16f..1034f74abff 100644 --- a/Stream_support/include/CGAL/IO/io.h +++ b/Stream_support/include/CGAL/IO/io.h @@ -698,6 +698,25 @@ inline const char* mode_name( IO::Mode m ) return names[m]; } +namespace internal { + +template constexpr auto has_exact(int) -> decltype(exact(P()), bool()) { return true; } +template constexpr bool has_exact(...) { return false; } + +} + +template +auto +serialize(const P& p) { + if constexpr (internal::has_exact

(0)) { + return exact(p); + } else { + return p; + } +} + + + } // IO namespace #ifndef CGAL_NO_DEPRECATED_CODE diff --git a/Triangulation_2/include/CGAL/Regular_triangulation_vertex_base_2.h b/Triangulation_2/include/CGAL/Regular_triangulation_vertex_base_2.h index 36ec36f2309..a2ca48dac15 100644 --- a/Triangulation_2/include/CGAL/Regular_triangulation_vertex_base_2.h +++ b/Triangulation_2/include/CGAL/Regular_triangulation_vertex_base_2.h @@ -81,7 +81,7 @@ operator<<(std::ostream &os, const Regular_triangulation_vertex_base_2 &v) // non combinatorial information. Default = point { - return os << static_cast(v) << v.point(); + return os << static_cast(v) << IO::serialize(v.point()); } } //namespace CGAL diff --git a/Triangulation_2/include/CGAL/Triangulation_vertex_base_2.h b/Triangulation_2/include/CGAL/Triangulation_vertex_base_2.h index 7936ae66336..ecbb1083689 100644 --- a/Triangulation_2/include/CGAL/Triangulation_vertex_base_2.h +++ b/Triangulation_2/include/CGAL/Triangulation_vertex_base_2.h @@ -109,7 +109,7 @@ std::ostream& operator<<(std::ostream &os, const Triangulation_vertex_base_2 &v) // non combinatorial information. Default = point { - return os << static_cast(v) << v.point(); + return os << static_cast(v) << IO::serialize(v.point()); } #ifndef CGAL_NO_DEPRECATED_CODE diff --git a/Triangulation_3/include/CGAL/Regular_triangulation_vertex_base_3.h b/Triangulation_3/include/CGAL/Regular_triangulation_vertex_base_3.h index f9f642cfbb1..cd697f17978 100644 --- a/Triangulation_3/include/CGAL/Regular_triangulation_vertex_base_3.h +++ b/Triangulation_3/include/CGAL/Regular_triangulation_vertex_base_3.h @@ -75,7 +75,7 @@ std::ostream& operator<<(std::ostream &os, const Regular_triangulation_vertex_base_3 &v) // non combinatorial information. Default = point { - return os << static_cast(v) << v.point(); + return os << static_cast(v) << IO::serialize(v.point()); } } //namespace CGAL diff --git a/Triangulation_3/include/CGAL/Triangulation_vertex_base_3.h b/Triangulation_3/include/CGAL/Triangulation_vertex_base_3.h index b4527f6c403..60e11f6233e 100644 --- a/Triangulation_3/include/CGAL/Triangulation_vertex_base_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_vertex_base_3.h @@ -61,6 +61,7 @@ private: Point _p; }; + template < class GT, class DSVb > std::istream& operator>>(std::istream &is, Triangulation_vertex_base_3 &v) @@ -74,7 +75,7 @@ std::ostream& operator<<(std::ostream &os, const Triangulation_vertex_base_3 &v) // non combinatorial information. Default = point { - return os << static_cast(v) << v.point(); + return os << static_cast(v) << IO::serialize(v.point()); } } //namespace CGAL diff --git a/Triangulation_3/test/Triangulation_3/CMakeLists.txt b/Triangulation_3/test/Triangulation_3/CMakeLists.txt index ffd521512de..88d63413f64 100644 --- a/Triangulation_3/test/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/test/Triangulation_3/CMakeLists.txt @@ -28,6 +28,7 @@ create_single_source_cgal_program("test_segment_simplex_traverser_3.cpp" ) create_single_source_cgal_program("test_static_filters.cpp") create_single_source_cgal_program("test_triangulation_3.cpp") create_single_source_cgal_program("test_io_triangulation_3.cpp") +create_single_source_cgal_program("test_triangulation_serialization_3.cpp") if(TARGET CGAL::TBB_support) message(STATUS "Found TBB")