diff --git a/include/boost/geometry/io/wkt/write.hpp b/include/boost/geometry/io/wkt/write.hpp index cb4afb377..7e5adb104 100644 --- a/include/boost/geometry/io/wkt/write.hpp +++ b/include/boost/geometry/io/wkt/write.hpp @@ -33,6 +33,10 @@ #include +#include +#include +#include + namespace boost { namespace geometry { @@ -307,6 +311,46 @@ struct wkt {}; +template +struct devarianted_wkt +{ + template + static inline void apply(OutputStream& os, Geometry const& geometry) + { + wkt::apply(os, geometry); + } +}; + +template +struct devarianted_wkt > +{ + template + struct visitor: static_visitor + { + OutputStream& m_os; + + visitor(OutputStream& os) + : m_os(os) + {} + + template + inline void operator()(Geometry const& geometry) const + { + devarianted_wkt::apply(m_os, geometry); + } + }; + + template + static inline void apply( + OutputStream& os, + variant const& geometry + ) + { + apply_visitor(visitor(os), geometry); + } +}; + + } // namespace dispatch #endif // DOXYGEN_NO_DISPATCH @@ -335,7 +379,7 @@ public: std::basic_ostream& os, wkt_manipulator const& m) { - dispatch::wkt::apply(os, m.m_geometry); + dispatch::devarianted_wkt::apply(os, m.m_geometry); os.flush(); return os; } diff --git a/test/io/wkt/wkt.cpp b/test/io/wkt/wkt.cpp index 9da9fc8df..72badd383 100644 --- a/test/io/wkt/wkt.cpp +++ b/test/io/wkt/wkt.cpp @@ -30,6 +30,16 @@ #include #include #include +#include + +template +void check_wkt(G const& geometry, std::string const& expected) +{ + std::ostringstream out; + out << bg::wkt(geometry); + BOOST_CHECK_EQUAL(boost::to_upper_copy(out.str()), + boost::to_upper_copy(expected)); +} template void test_wkt(std::string const& wkt, std::size_t n, double len = 0, @@ -57,10 +67,8 @@ void test_wkt(std::string const& wkt, std::size_t n, double len = 0, BOOST_CHECK_CLOSE(double(bg::perimeter(geometry)), peri, 0.0001); } - std::ostringstream out; - out << bg::wkt(geometry); - BOOST_CHECK_EQUAL(boost::to_upper_copy(out.str()), - boost::to_upper_copy(wkt)); + check_wkt(geometry, wkt); + check_wkt(boost::variant(geometry), wkt); } template