From e2d15e9eb3e22bb5b1ab044c21b2cdc85746e052 Mon Sep 17 00:00:00 2001 From: Menelaos Karavelas Date: Thu, 29 Jan 2015 23:31:14 +0200 Subject: [PATCH] [algorithms][is_simple][debug][turns] add debugging support for the boundary (endpoints) of linestrings --- .../is_simple/debug_print_boundary_points.hpp | 83 +++++++++++++------ 1 file changed, 57 insertions(+), 26 deletions(-) diff --git a/include/boost/geometry/algorithms/detail/is_simple/debug_print_boundary_points.hpp b/include/boost/geometry/algorithms/detail/is_simple/debug_print_boundary_points.hpp index 75c37c68f..196d89b92 100644 --- a/include/boost/geometry/algorithms/detail/is_simple/debug_print_boundary_points.hpp +++ b/include/boost/geometry/algorithms/detail/is_simple/debug_print_boundary_points.hpp @@ -1,6 +1,6 @@ // Boost.Geometry (aka GGL, Generic Geometry Library) -// Copyright (c) 2014, Oracle and/or its affiliates. +// Copyright (c) 2014-2015, Oracle and/or its affiliates. // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle @@ -18,6 +18,8 @@ #include #include +#include +#include #include @@ -26,7 +28,8 @@ #include #include -#endif +#include +#endif // BOOST_GEOMETRY_TEST_DEBUG namespace boost { namespace geometry @@ -37,39 +40,67 @@ namespace detail { namespace is_simple #ifdef BOOST_GEOMETRY_TEST_DEBUG -template -inline void debug_print_boundary_points(MultiLinestring const& multilinestring) +template ::type> +struct debug_boundary_points_printer + : not_implemented +{}; + +template +struct debug_boundary_points_printer { - typedef typename point_type::type point_type; - typedef std::vector point_vector; - - point_vector boundary_points; - for (typename boost::range_iterator::type it - = boost::begin(multilinestring); - it != boost::end(multilinestring); ++it) + static inline void apply(Linestring const& linestring) { - if ( boost::size(*it) > 1 - && !geometry::equals(range::front(*it), range::back(*it)) ) + std::cout << "boundary points: "; + std::cout << " " << geometry::dsv(range::front(linestring)); + std::cout << " " << geometry::dsv(range::back(linestring)); + std::cout << std::endl << std::endl; + } +}; + +template +struct debug_boundary_points_printer +{ + static inline void apply(MultiLinestring const& multilinestring) + { + typedef typename point_type::type point_type; + typedef std::vector point_vector; + + point_vector boundary_points; + for (typename boost::range_iterator::type it + = boost::begin(multilinestring); + it != boost::end(multilinestring); ++it) { - boundary_points.push_back( range::front(*it) ); - boundary_points.push_back( range::back(*it) ); + if ( boost::size(*it) > 1 + && !geometry::equals(range::front(*it), range::back(*it)) ) + { + boundary_points.push_back( range::front(*it) ); + boundary_points.push_back( range::back(*it) ); + } } - } - std::sort(boundary_points.begin(), boundary_points.end(), - geometry::less()); + std::sort(boundary_points.begin(), boundary_points.end(), + geometry::less()); - std::cout << "boundary points: "; - for (typename point_vector::const_iterator pit = boundary_points.begin(); - pit != boundary_points.end(); ++pit) - { - std::cout << " " << geometry::dsv(*pit); + std::cout << "boundary points: "; + for (typename point_vector::const_iterator + pit = boundary_points.begin(); + pit != boundary_points.end(); ++pit) + { + std::cout << " " << geometry::dsv(*pit); + } + std::cout << std::endl << std::endl; } - std::cout << std::endl << std::endl; +}; + + +template +inline void debug_print_boundary_points(Linear const& linear) +{ + debug_boundary_points_printer::apply(linear); } #else -template -inline void debug_print_boundary_points(MultiLinestring const&) +template +inline void debug_print_boundary_points(Linear const&) { } #endif // BOOST_GEOMETRY_TEST_DEBUG