Made dispatch::reverse able to find the tag by itself.

[SVN r81077]
This commit is contained in:
Bruno Lalande
2012-10-28 19:25:13 +00:00
parent 0bb3c3f9c9
commit cd44f9090e
2 changed files with 15 additions and 30 deletions

View File

@@ -32,9 +32,9 @@ namespace detail { namespace reverse
{
template <typename Range>
struct range_reverse
{
template <typename Range>
static inline void apply(Range& range)
{
std::reverse(boost::begin(range), boost::end(range));
@@ -42,21 +42,20 @@ struct range_reverse
};
template <typename Polygon>
struct polygon_reverse
struct polygon_reverse: private range_reverse
{
template <typename Polygon>
static inline void apply(Polygon& polygon)
{
typedef typename geometry::ring_type<Polygon>::type ring_type;
typedef range_reverse<ring_type> per_range;
per_range::apply(exterior_ring(polygon));
range_reverse::apply(exterior_ring(polygon));
typename interior_return_type<Polygon>::type rings
= interior_rings(polygon);
for (BOOST_AUTO_TPL(it, boost::begin(rings)); it != boost::end(rings); ++it)
{
per_range::apply(*it);
range_reverse::apply(*it);
}
}
};
@@ -71,11 +70,7 @@ namespace dispatch
{
template
<
typename Tag,
typename Geometry
>
template <typename Geometry, typename Tag = typename tag<Geometry>::type>
struct reverse
{
static inline void apply(Geometry&)
@@ -84,20 +79,20 @@ struct reverse
template <typename Ring>
struct reverse<ring_tag, Ring>
: detail::reverse::range_reverse<Ring>
struct reverse<Ring, ring_tag>
: detail::reverse::range_reverse
{};
template <typename LineString>
struct reverse<linestring_tag, LineString>
: detail::reverse::range_reverse<LineString>
struct reverse<LineString, linestring_tag>
: detail::reverse::range_reverse
{};
template <typename Polygon>
struct reverse<polygon_tag, Polygon>
: detail::reverse::polygon_reverse<Polygon>
struct reverse<Polygon, polygon_tag>
: detail::reverse::polygon_reverse
{};
@@ -121,11 +116,7 @@ inline void reverse(Geometry& geometry)
{
concept::check<Geometry>();
dispatch::reverse
<
typename tag<Geometry>::type,
Geometry
>::apply(geometry);
dispatch::reverse<Geometry>::apply(geometry);
}
}} // namespace boost::geometry

View File

@@ -34,27 +34,21 @@ namespace dispatch
template <typename Geometry>
struct reverse<multi_linestring_tag, Geometry>
struct reverse<Geometry, multi_linestring_tag>
: detail::multi_modify
<
Geometry,
detail::reverse::range_reverse
<
typename boost::range_value<Geometry>::type
>
>
{};
template <typename Geometry>
struct reverse<multi_polygon_tag, Geometry>
struct reverse<Geometry, multi_polygon_tag>
: detail::multi_modify
<
Geometry,
detail::reverse::polygon_reverse
<
typename boost::range_value<Geometry>::type
>
>
{};