summaryrefslogtreecommitdiff
path: root/boost/geometry/views/detail/range_type.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/views/detail/range_type.hpp')
-rw-r--r--boost/geometry/views/detail/range_type.hpp42
1 files changed, 35 insertions, 7 deletions
diff --git a/boost/geometry/views/detail/range_type.hpp b/boost/geometry/views/detail/range_type.hpp
index a40670cf99..fff634c379 100644
--- a/boost/geometry/views/detail/range_type.hpp
+++ b/boost/geometry/views/detail/range_type.hpp
@@ -16,7 +16,7 @@
#include <boost/mpl/assert.hpp>
-#include <boost/type_traits.hpp>
+#include <boost/range/value_type.hpp>
#include <boost/geometry/core/ring_type.hpp>
#include <boost/geometry/core/tag.hpp>
@@ -33,7 +33,8 @@ namespace dispatch
{
-template <typename GeometryTag, typename Geometry>
+template <typename Geometry,
+ typename Tag = typename tag<Geometry>::type>
struct range_type
{
BOOST_MPL_ASSERT_MSG
@@ -45,31 +46,59 @@ struct range_type
template <typename Geometry>
-struct range_type<ring_tag, Geometry>
+struct range_type<Geometry, ring_tag>
{
typedef Geometry type;
};
+
template <typename Geometry>
-struct range_type<linestring_tag, Geometry>
+struct range_type<Geometry, linestring_tag>
{
typedef Geometry type;
};
template <typename Geometry>
-struct range_type<polygon_tag, Geometry>
+struct range_type<Geometry, polygon_tag>
{
typedef typename ring_type<Geometry>::type type;
};
+
template <typename Geometry>
-struct range_type<box_tag, Geometry>
+struct range_type<Geometry, box_tag>
{
typedef box_view<Geometry> type;
};
+// multi-point acts itself as a range
+template <typename Geometry>
+struct range_type<Geometry, multi_point_tag>
+{
+ typedef Geometry type;
+};
+
+
+template <typename Geometry>
+struct range_type<Geometry, multi_linestring_tag>
+{
+ typedef typename boost::range_value<Geometry>::type type;
+};
+
+
+template <typename Geometry>
+struct range_type<Geometry, multi_polygon_tag>
+{
+ // Call its single-version
+ typedef typename dispatch::range_type
+ <
+ typename boost::range_value<Geometry>::type
+ >::type type;
+};
+
+
} // namespace dispatch
#endif // DOXYGEN_NO_DISPATCH
@@ -93,7 +122,6 @@ struct range_type
{
typedef typename dispatch::range_type
<
- typename tag<Geometry>::type,
Geometry
>::type type;
};