holes_proxy.hpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Copyright (c) 2010-2012 Barend Gehrels, Amsterdam, the Netherlands.
  3. // Use, modification and distribution is subject to the Boost Software License,
  4. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. #ifndef BOOST_GEOMETRY_GEOMETRIES_ADAPTED_BOOST_POLYGON_HOLES_PROXY_HPP
  7. #define BOOST_GEOMETRY_GEOMETRIES_ADAPTED_BOOST_POLYGON_HOLES_PROXY_HPP
  8. // Adapts Geometries from Boost.Polygon for usage in Boost.Geometry
  9. // boost::polygon::polygon_with_holes_data -> boost::geometry::polygon
  10. // pair{begin_holes, begin_holes} -> interior_proxy
  11. #include <boost/polygon/polygon.hpp>
  12. #include <boost/geometry/geometries/adapted/boost_polygon/hole_iterator.hpp>
  13. #include <boost/geometry/geometries/adapted/boost_polygon/ring_proxy.hpp>
  14. namespace boost { namespace geometry
  15. {
  16. namespace adapt { namespace bp
  17. {
  18. // Polygon should implement the boost::polygon::polygon_with_holes_concept
  19. // Specify constness in the template parameter if necessary
  20. template<typename Polygon>
  21. struct holes_proxy
  22. {
  23. typedef ring_proxy
  24. <
  25. typename boost::mpl::if_
  26. <
  27. typename boost::is_const<Polygon>,
  28. Polygon const,
  29. Polygon
  30. >::type
  31. > proxy_type;
  32. typedef hole_iterator<Polygon, proxy_type> iterator_type;
  33. // The next line does not work probably because coordinate_type is part of the
  34. // polygon_traits, but not of the polygon_with_holes_traits
  35. // typedef typename boost::polygon::polygon_traits<Polygon>::coordinate_type coordinate_type;
  36. // So we use:
  37. typedef typename Polygon::coordinate_type coordinate_type;
  38. inline holes_proxy(Polygon& p)
  39. : polygon(p)
  40. {}
  41. inline void clear()
  42. {
  43. Polygon empty;
  44. // Clear the holes
  45. polygon.set_holes
  46. (
  47. boost::polygon::begin_holes(empty),
  48. boost::polygon::end_holes(empty)
  49. );
  50. }
  51. inline void resize(std::size_t new_size)
  52. {
  53. std::vector<boost::polygon::polygon_data<coordinate_type> > temporary_copy
  54. (
  55. boost::polygon::begin_holes(polygon),
  56. boost::polygon::end_holes(polygon)
  57. );
  58. temporary_copy.resize(new_size);
  59. polygon.set_holes(temporary_copy.begin(), temporary_copy.end());
  60. }
  61. template <typename Ring>
  62. inline void push_back(Ring const& ring)
  63. {
  64. std::vector<boost::polygon::polygon_data<coordinate_type> > temporary_copy
  65. (
  66. boost::polygon::begin_holes(polygon),
  67. boost::polygon::end_holes(polygon)
  68. );
  69. boost::polygon::polygon_data<coordinate_type> added;
  70. boost::polygon::set_points(added, ring.begin(), ring.end());
  71. temporary_copy.push_back(added);
  72. polygon.set_holes(temporary_copy.begin(), temporary_copy.end());
  73. }
  74. Polygon& polygon;
  75. };
  76. // Support holes_proxy for Boost.Range ADP
  77. // Const versions
  78. template<typename Polygon>
  79. inline typename boost::geometry::adapt::bp::holes_proxy<Polygon const>::iterator_type
  80. range_begin(boost::geometry::adapt::bp::holes_proxy<Polygon const> const& proxy)
  81. {
  82. typename boost::geometry::adapt::bp::holes_proxy<Polygon const>::iterator_type
  83. begin(proxy.polygon, boost::polygon::begin_holes(proxy.polygon));
  84. return begin;
  85. }
  86. template<typename Polygon>
  87. inline typename boost::geometry::adapt::bp::holes_proxy<Polygon const>::iterator_type
  88. range_end(boost::geometry::adapt::bp::holes_proxy<Polygon const> const& proxy)
  89. {
  90. typename boost::geometry::adapt::bp::holes_proxy<Polygon const>::iterator_type
  91. end(proxy.polygon, boost::polygon::end_holes(proxy.polygon));
  92. return end;
  93. }
  94. // Mutable versions
  95. template<typename Polygon>
  96. inline typename boost::geometry::adapt::bp::holes_proxy<Polygon>::iterator_type
  97. range_begin(boost::geometry::adapt::bp::holes_proxy<Polygon>& proxy)
  98. {
  99. typename boost::geometry::adapt::bp::holes_proxy<Polygon>::iterator_type
  100. begin(proxy.polygon, boost::polygon::begin_holes(proxy.polygon));
  101. return begin;
  102. }
  103. template<typename Polygon>
  104. inline typename boost::geometry::adapt::bp::holes_proxy<Polygon>::iterator_type
  105. range_end(boost::geometry::adapt::bp::holes_proxy<Polygon>& proxy)
  106. {
  107. typename boost::geometry::adapt::bp::holes_proxy<Polygon>::iterator_type
  108. end(proxy.polygon, boost::polygon::end_holes(proxy.polygon));
  109. return end;
  110. }
  111. }}
  112. namespace traits
  113. {
  114. template <typename Polygon>
  115. struct rvalue_type<adapt::bp::holes_proxy<Polygon> >
  116. {
  117. typedef adapt::bp::holes_proxy<Polygon> type;
  118. };
  119. template <typename Polygon>
  120. struct clear<adapt::bp::holes_proxy<Polygon> >
  121. {
  122. static inline void apply(adapt::bp::holes_proxy<Polygon> proxy)
  123. {
  124. proxy.clear();
  125. }
  126. };
  127. template <typename Polygon>
  128. struct resize<adapt::bp::holes_proxy<Polygon> >
  129. {
  130. static inline void apply(adapt::bp::holes_proxy<Polygon> proxy, std::size_t new_size)
  131. {
  132. proxy.resize(new_size);
  133. }
  134. };
  135. template <typename Polygon>
  136. struct push_back<adapt::bp::holes_proxy<Polygon> >
  137. {
  138. template <typename Ring>
  139. static inline void apply(adapt::bp::holes_proxy<Polygon> proxy, Ring const& ring)
  140. {
  141. proxy.push_back(ring);
  142. }
  143. };
  144. } // namespace traits
  145. }}
  146. // Specialize holes_proxy for Boost.Range
  147. namespace boost
  148. {
  149. template<typename Polygon>
  150. struct range_mutable_iterator<geometry::adapt::bp::holes_proxy<Polygon> >
  151. {
  152. typedef typename geometry::adapt::bp::holes_proxy<Polygon>::iterator_type type;
  153. };
  154. template<typename Polygon>
  155. struct range_const_iterator<geometry::adapt::bp::holes_proxy<Polygon> >
  156. {
  157. typedef typename geometry::adapt::bp::holes_proxy<Polygon const>::iterator_type type;
  158. };
  159. } // namespace boost
  160. #endif // BOOST_GEOMETRY_GEOMETRIES_ADAPTED_BOOST_POLYGON_HOLES_PROXY_HPP