Made dispatch::perimeter able to retrieve the tag by itself.

[SVN r80665]
This commit is contained in:
Bruno Lalande
2012-09-23 12:30:51 +00:00
parent 189d847b90
commit 9a84ecdf0e
2 changed files with 7 additions and 19 deletions

View File

@@ -33,7 +33,7 @@ namespace dispatch
{
// Default perimeter is 0.0, specializations implement calculated values
template <typename Tag, typename Geometry>
template <typename Geometry, typename Tag = typename tag<Geometry>::type>
struct perimeter : detail::calculate_null
{
typedef typename default_length_result<Geometry>::type return_type;
@@ -46,7 +46,7 @@ struct perimeter : detail::calculate_null
};
template <typename Geometry>
struct perimeter<ring_tag, Geometry>
struct perimeter<Geometry, ring_tag>
: detail::length::range_length
<
Geometry,
@@ -55,7 +55,7 @@ struct perimeter<ring_tag, Geometry>
{};
template <typename Polygon>
struct perimeter<polygon_tag, Polygon> : detail::calculate_polygon_sum
struct perimeter<Polygon, polygon_tag> : detail::calculate_polygon_sum
{
typedef typename default_length_result<Polygon>::type return_type;
typedef detail::length::range_length
@@ -103,11 +103,7 @@ inline typename default_length_result<Geometry>::type perimeter(
// detail::throw_on_empty_input(geometry);
return dispatch::perimeter
<
typename tag<Geometry>::type,
Geometry
>::apply(geometry, strategy_type());
return dispatch::perimeter<Geometry>::apply(geometry, strategy_type());
}
/*!
@@ -132,11 +128,7 @@ inline typename default_length_result<Geometry>::type perimeter(
// detail::throw_on_empty_input(geometry);
return dispatch::perimeter
<
typename tag<Geometry>::type,
Geometry
>::apply(geometry, strategy);
return dispatch::perimeter<Geometry>::apply(geometry, strategy);
}
}} // namespace boost::geometry

View File

@@ -31,7 +31,7 @@ namespace boost { namespace geometry
namespace dispatch
{
template <typename MultiPolygon>
struct perimeter<multi_polygon_tag, MultiPolygon> : detail::multi_sum
struct perimeter<MultiPolygon, multi_polygon_tag> : detail::multi_sum
{
template <typename Strategy>
static inline typename default_length_result<MultiPolygon>::type
@@ -40,11 +40,7 @@ struct perimeter<multi_polygon_tag, MultiPolygon> : detail::multi_sum
return multi_sum::apply
<
typename default_length_result<MultiPolygon>::type,
perimeter
<
polygon_tag,
typename boost::range_value<MultiPolygon>::type
>
perimeter<typename boost::range_value<MultiPolygon>::type>
>(multi, strategy);
}
};