// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2010-2011 Barend Gehrels, Amsterdam, the Netherlands. // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_GEOMETRY_GEOMETRIES_ADAPTED_BOOST_POLYGON_HOLES_PROXY_HPP #define BOOST_GEOMETRY_GEOMETRIES_ADAPTED_BOOST_POLYGON_HOLES_PROXY_HPP // Adapts Geometries from Boost.Polygon for usage in Boost.Geometry // boost::polygon::polygon_with_holes_data -> boost::geometry::polygon // pair{begin_holes, begin_holes} -> interior_proxy #include #include #include namespace boost { namespace geometry { namespace adapt { namespace bp { // Polygon should implement the boost::polygon::polygon_with_holes_concept // Specify constness in the template parameter if necessary template struct holes_proxy { typedef ring_proxy < typename boost::mpl::if_ < typename boost::is_const, Polygon const, Polygon >::type > proxy_type; typedef hole_iterator iterator_type; // The next line does not work probably because coordinate_type is part of the // polygon_traits, but not of the polygon_with_holes_traits // typedef typename boost::polygon::polygon_traits::coordinate_type coordinate_type; // So we use: typedef typename Polygon::coordinate_type coordinate_type; inline holes_proxy(Polygon& p) : polygon(p) {} inline void clear() { Polygon empty; // Clear the holes polygon.set_holes ( boost::polygon::begin_holes(empty), boost::polygon::end_holes(empty) ); } inline void resize(std::size_t new_size) { std::vector > temporary_copy ( boost::polygon::begin_holes(polygon), boost::polygon::end_holes(polygon) ); temporary_copy.resize(new_size); polygon.set_holes(temporary_copy.begin(), temporary_copy.end()); } template inline void push_back(Ring const& ring) { std::vector > temporary_copy ( boost::polygon::begin_holes(polygon), boost::polygon::end_holes(polygon) ); boost::polygon::polygon_data added; boost::polygon::set_points(added, ring.begin(), ring.end()); temporary_copy.push_back(added); polygon.set_holes(temporary_copy.begin(), temporary_copy.end()); } Polygon& polygon; }; // Support holes_proxy for Boost.Range ADP // Const versions template inline typename boost::geometry::adapt::bp::holes_proxy::iterator_type range_begin(boost::geometry::adapt::bp::holes_proxy const& proxy) { typename boost::geometry::adapt::bp::holes_proxy::iterator_type begin(proxy.polygon, boost::polygon::begin_holes(proxy.polygon)); return begin; } template inline typename boost::geometry::adapt::bp::holes_proxy::iterator_type range_end(boost::geometry::adapt::bp::holes_proxy const& proxy) { typename boost::geometry::adapt::bp::holes_proxy::iterator_type end(proxy.polygon, boost::polygon::end_holes(proxy.polygon)); return end; } // Mutable versions template inline typename boost::geometry::adapt::bp::holes_proxy::iterator_type range_begin(boost::geometry::adapt::bp::holes_proxy& proxy) { typename boost::geometry::adapt::bp::holes_proxy::iterator_type begin(proxy.polygon, boost::polygon::begin_holes(proxy.polygon)); return begin; } template inline typename boost::geometry::adapt::bp::holes_proxy::iterator_type range_end(boost::geometry::adapt::bp::holes_proxy& proxy) { typename boost::geometry::adapt::bp::holes_proxy::iterator_type end(proxy.polygon, boost::polygon::end_holes(proxy.polygon)); return end; } }} namespace traits { template struct rvalue_type > { typedef adapt::bp::holes_proxy type; }; template struct clear > { static inline void apply(adapt::bp::holes_proxy proxy) { proxy.clear(); } }; template struct resize > { static inline void apply(adapt::bp::holes_proxy proxy, std::size_t new_size) { proxy.resize(new_size); } }; template struct push_back > { template static inline void apply(adapt::bp::holes_proxy proxy, Ring const& ring) { proxy.push_back(ring); } }; } // namespace traits }} // Specialize holes_proxy for Boost.Range namespace boost { template struct range_mutable_iterator > { typedef typename geometry::adapt::bp::holes_proxy::iterator_type type; }; template struct range_const_iterator > { typedef typename geometry::adapt::bp::holes_proxy::iterator_type type; }; } // namespace boost #endif // BOOST_GEOMETRY_GEOMETRIES_ADAPTED_BOOST_POLYGON_HOLES_PROXY_HPP