ring_type.hpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
  3. // Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
  4. // Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
  5. // This file was modified by Oracle on 2015.
  6. // Modifications copyright (c) 2015, Oracle and/or its affiliates.
  7. // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
  8. // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
  9. // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
  10. // Use, modification and distribution is subject to the Boost Software License,
  11. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  12. // http://www.boost.org/LICENSE_1_0.txt)
  13. #ifndef BOOST_GEOMETRY_CORE_RING_TYPE_HPP
  14. #define BOOST_GEOMETRY_CORE_RING_TYPE_HPP
  15. #include <boost/mpl/assert.hpp>
  16. #include <boost/mpl/if.hpp>
  17. #include <boost/range/value_type.hpp>
  18. #include <boost/type_traits/is_const.hpp>
  19. #include <boost/type_traits/remove_const.hpp>
  20. #include <boost/type_traits/remove_reference.hpp>
  21. #include <boost/geometry/core/tag.hpp>
  22. #include <boost/geometry/core/tags.hpp>
  23. namespace boost { namespace geometry
  24. {
  25. namespace traits
  26. {
  27. /*!
  28. \brief Traits class to indicate ring-type of a polygon's exterior ring/interior rings
  29. \ingroup traits
  30. \par Geometries:
  31. - polygon
  32. \par Specializations should provide:
  33. - typedef XXX type ( e.g. ring<P> )
  34. \tparam Geometry geometry
  35. */
  36. template <typename Geometry>
  37. struct ring_const_type
  38. {
  39. BOOST_MPL_ASSERT_MSG
  40. (
  41. false, NOT_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE
  42. , (types<Geometry>)
  43. );
  44. };
  45. template <typename Geometry>
  46. struct ring_mutable_type
  47. {
  48. BOOST_MPL_ASSERT_MSG
  49. (
  50. false, NOT_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE
  51. , (types<Geometry>)
  52. );
  53. };
  54. } // namespace traits
  55. #ifndef DOXYGEN_NO_DISPATCH
  56. namespace core_dispatch
  57. {
  58. template <typename GeometryTag, typename Geometry>
  59. struct ring_return_type
  60. {};
  61. template <typename LineString>
  62. struct ring_return_type<linestring_tag, LineString>
  63. {
  64. typedef LineString& type;
  65. };
  66. template <typename Ring>
  67. struct ring_return_type<ring_tag, Ring>
  68. {
  69. typedef Ring& type;
  70. };
  71. template <typename Polygon>
  72. struct ring_return_type<polygon_tag, Polygon>
  73. {
  74. typedef typename boost::remove_const<Polygon>::type nc_polygon_type;
  75. typedef typename boost::mpl::if_
  76. <
  77. boost::is_const<Polygon>,
  78. typename traits::ring_const_type<nc_polygon_type>::type,
  79. typename traits::ring_mutable_type<nc_polygon_type>::type
  80. >::type type;
  81. };
  82. template <typename MultiLinestring>
  83. struct ring_return_type<multi_linestring_tag, MultiLinestring>
  84. {
  85. typedef typename ring_return_type
  86. <
  87. linestring_tag,
  88. typename boost::mpl::if_
  89. <
  90. boost::is_const<MultiLinestring>,
  91. typename boost::range_value<MultiLinestring>::type const,
  92. typename boost::range_value<MultiLinestring>::type
  93. >::type
  94. >::type type;
  95. };
  96. template <typename MultiPolygon>
  97. struct ring_return_type<multi_polygon_tag, MultiPolygon>
  98. {
  99. typedef typename ring_return_type
  100. <
  101. polygon_tag,
  102. typename boost::mpl::if_
  103. <
  104. boost::is_const<MultiPolygon>,
  105. typename boost::range_value<MultiPolygon>::type const,
  106. typename boost::range_value<MultiPolygon>::type
  107. >::type
  108. >::type type;
  109. };
  110. template <typename GeometryTag, typename Geometry>
  111. struct ring_type
  112. {};
  113. template <typename Ring>
  114. struct ring_type<ring_tag, Ring>
  115. {
  116. typedef Ring type;
  117. };
  118. template <typename Polygon>
  119. struct ring_type<polygon_tag, Polygon>
  120. {
  121. typedef typename boost::remove_reference
  122. <
  123. typename ring_return_type<polygon_tag, Polygon>::type
  124. >::type type;
  125. };
  126. template <typename MultiLinestring>
  127. struct ring_type<multi_linestring_tag, MultiLinestring>
  128. {
  129. typedef typename boost::remove_reference
  130. <
  131. typename ring_return_type<multi_linestring_tag, MultiLinestring>::type
  132. >::type type;
  133. };
  134. template <typename MultiPolygon>
  135. struct ring_type<multi_polygon_tag, MultiPolygon>
  136. {
  137. typedef typename boost::remove_reference
  138. <
  139. typename ring_return_type<multi_polygon_tag, MultiPolygon>::type
  140. >::type type;
  141. };
  142. } // namespace core_dispatch
  143. #endif
  144. /*!
  145. \brief \brief_meta{type, ring_type, \meta_geometry_type}
  146. \details A polygon contains one exterior ring
  147. and zero or more interior rings (holes).
  148. This metafunction retrieves the type of the rings.
  149. Exterior ring and each of the interior rings all have the same ring_type.
  150. \tparam Geometry A type fullfilling the Ring, Polygon or MultiPolygon concept.
  151. \ingroup core
  152. \qbk{[include reference/core/ring_type.qbk]}
  153. */
  154. template <typename Geometry>
  155. struct ring_type
  156. {
  157. typedef typename core_dispatch::ring_type
  158. <
  159. typename tag<Geometry>::type,
  160. Geometry
  161. >::type type;
  162. };
  163. template <typename Geometry>
  164. struct ring_return_type
  165. {
  166. typedef typename core_dispatch::ring_return_type
  167. <
  168. typename tag<Geometry>::type,
  169. Geometry
  170. >::type type;
  171. };
  172. }} // namespace boost::geometry
  173. #endif // BOOST_GEOMETRY_CORE_RING_TYPE_HPP