Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/geometry/algorithms/envelope.hpp @ 101:c530137014c0
Update Boost headers (1.58.0)
author | Chris Cannam |
---|---|
date | Mon, 07 Sep 2015 11:12:49 +0100 |
parents | 2665513ce2d3 |
children |
line wrap: on
line diff
--- a/DEPENDENCIES/generic/include/boost/geometry/algorithms/envelope.hpp Fri Sep 04 12:01:02 2015 +0100 +++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/envelope.hpp Mon Sep 07 11:12:49 2015 +0100 @@ -14,15 +14,23 @@ #ifndef BOOST_GEOMETRY_ALGORITHMS_ENVELOPE_HPP #define BOOST_GEOMETRY_ALGORITHMS_ENVELOPE_HPP +#include <vector> + +#include <boost/numeric/conversion/cast.hpp> #include <boost/range.hpp> -#include <boost/numeric/conversion/cast.hpp> +#include <boost/variant/apply_visitor.hpp> +#include <boost/variant/static_visitor.hpp> +#include <boost/variant/variant_fwd.hpp> #include <boost/geometry/algorithms/assign.hpp> #include <boost/geometry/algorithms/expand.hpp> #include <boost/geometry/algorithms/not_implemented.hpp> #include <boost/geometry/core/cs.hpp> #include <boost/geometry/core/exterior_ring.hpp> +#include <boost/geometry/core/point_type.hpp> +#include <boost/geometry/core/tags.hpp> + #include <boost/geometry/geometries/concepts/check.hpp> @@ -74,6 +82,42 @@ } }; + +struct envelope_multi_linestring +{ + template<typename MultiLinestring, typename Box> + static inline void apply(MultiLinestring const& mp, Box& mbr) + { + assign_inverse(mbr); + for (typename boost::range_iterator<MultiLinestring const>::type + it = mp.begin(); + it != mp.end(); + ++it) + { + envelope_range_additional(*it, mbr); + } + } +}; + + +// version for multi_polygon: outer ring's of all polygons +struct envelope_multi_polygon +{ + template<typename MultiPolygon, typename Box> + static inline void apply(MultiPolygon const& mp, Box& mbr) + { + assign_inverse(mbr); + for (typename boost::range_const_iterator<MultiPolygon>::type + it = mp.begin(); + it != mp.end(); + ++it) + { + envelope_range_additional(exterior_ring(*it), mbr); + } + } +}; + + }} // namespace detail::envelope #endif // DOXYGEN_NO_DETAIL @@ -135,10 +179,72 @@ }; +template <typename Multi> +struct envelope<Multi, multi_point_tag> + : detail::envelope::envelope_range +{}; + + +template <typename Multi> +struct envelope<Multi, multi_linestring_tag> + : detail::envelope::envelope_multi_linestring +{}; + + +template <typename Multi> +struct envelope<Multi, multi_polygon_tag> + : detail::envelope::envelope_multi_polygon +{}; + + } // namespace dispatch #endif +namespace resolve_variant { + +template <typename Geometry> +struct envelope +{ + template <typename Box> + static inline void apply(Geometry const& geometry, Box& box) + { + concept::check<Geometry const>(); + concept::check<Box>(); + + dispatch::envelope<Geometry>::apply(geometry, box); + } +}; + +template <BOOST_VARIANT_ENUM_PARAMS(typename T)> +struct envelope<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> > +{ + template <typename Box> + struct visitor: boost::static_visitor<void> + { + Box& m_box; + + visitor(Box& box): m_box(box) {} + + template <typename Geometry> + void operator()(Geometry const& geometry) const + { + envelope<Geometry>::apply(geometry, m_box); + } + }; + + template <typename Box> + static inline void + apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry, + Box& box) + { + boost::apply_visitor(visitor<Box>(box), geometry); + } +}; + +} // namespace resolve_variant + + /*! \brief \brief_calc{envelope} \ingroup envelope @@ -157,10 +263,7 @@ template<typename Geometry, typename Box> inline void envelope(Geometry const& geometry, Box& mbr) { - concept::check<Geometry const>(); - concept::check<Box>(); - - dispatch::envelope<Geometry>::apply(geometry, mbr); + resolve_variant::envelope<Geometry>::apply(geometry, mbr); } @@ -182,11 +285,8 @@ template<typename Box, typename Geometry> inline Box return_envelope(Geometry const& geometry) { - concept::check<Geometry const>(); - concept::check<Box>(); - Box mbr; - dispatch::envelope<Geometry>::apply(geometry, mbr); + resolve_variant::envelope<Geometry>::apply(geometry, mbr); return mbr; }