Made reverse algorithm variant-aware.

[SVN r86678]
This commit is contained in:
Bruno Lalande 2013-11-13 14:53:37 +00:00
parent 128ebab54c
commit fb3ec9de1f
2 changed files with 51 additions and 8 deletions

View File

@ -18,6 +18,9 @@
#include <boost/range.hpp>
#include <boost/typeof/typeof.hpp>
#include <boost/variant/static_visitor.hpp>
#include <boost/variant/apply_visitor.hpp>
#include <boost/variant/variant_fwd.hpp>
#include <boost/geometry/core/interior_rings.hpp>
#include <boost/geometry/geometries/concepts/check.hpp>
@ -100,6 +103,40 @@ struct reverse<Polygon, polygon_tag>
#endif
namespace resolve_variant
{
template <typename Geometry>
struct reverse
{
static void apply(Geometry& geometry)
{
concept::check<Geometry>();
dispatch::reverse<Geometry>::apply(geometry);
}
};
template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
struct reverse<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
{
struct visitor: boost::static_visitor<void>
{
template <typename Geometry>
void operator()(Geometry& geometry) const
{
reverse<Geometry>::apply(geometry);
}
};
static inline void apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>& geometry)
{
boost::apply_visitor(visitor(), geometry);
}
};
} // namespace resolve_variant
/*!
\brief Reverses the points within a geometry
\details Generic function to reverse a geometry. It resembles the std::reverse
@ -114,9 +151,7 @@ struct reverse<Polygon, polygon_tag>
template <typename Geometry>
inline void reverse(Geometry& geometry)
{
concept::check<Geometry>();
dispatch::reverse<Geometry>::apply(geometry);
resolve_variant::reverse<Geometry>::apply(geometry);
}
}} // namespace boost::geometry

View File

@ -13,16 +13,13 @@
#include <geometry_test_common.hpp>
#include <boost/geometry/algorithms/reverse.hpp>
#include <boost/geometry/io/wkt/wkt.hpp>
#include <boost/variant/variant.hpp>
template <typename Geometry>
void test_geometry(std::string const& wkt, std::string const& expected)
void check_geometry(Geometry& geometry, std::string const& wkt, std::string const& expected)
{
Geometry geometry;
bg::read_wkt(wkt, geometry);
bg::reverse(geometry);
std::ostringstream out;
@ -34,5 +31,16 @@ void test_geometry(std::string const& wkt, std::string const& expected)
<< " got " << out.str());
}
template <typename Geometry>
void test_geometry(std::string const& wkt, std::string const& expected)
{
Geometry geometry;
bg::read_wkt(wkt, geometry);
boost::variant<Geometry> v(geometry);
check_geometry(geometry, wkt, expected);
check_geometry(v, wkt, expected);
}
#endif