default_strategies.hpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
  3. // Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
  4. // Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
  5. // Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
  6. // This file was modified by Oracle on 2014.
  7. // Modifications copyright (c) 2014, Oracle and/or its affiliates.
  8. // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
  9. // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
  10. // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
  11. // Use, modification and distribution is subject to the Boost Software License,
  12. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  13. // http://www.boost.org/LICENSE_1_0.txt)
  14. #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_DEFAULT_STRATEGIES_HPP
  15. #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_DEFAULT_STRATEGIES_HPP
  16. #include <boost/geometry/core/cs.hpp>
  17. #include <boost/geometry/core/tag.hpp>
  18. #include <boost/geometry/core/tag_cast.hpp>
  19. #include <boost/geometry/core/tags.hpp>
  20. #include <boost/geometry/core/point_type.hpp>
  21. #include <boost/geometry/core/reverse_dispatch.hpp>
  22. #include <boost/geometry/strategies/distance.hpp>
  23. namespace boost { namespace geometry
  24. {
  25. #ifndef DOXYGEN_NO_DETAIL
  26. namespace detail { namespace distance
  27. {
  28. // Helper metafunction for default strategy retrieval
  29. template
  30. <
  31. typename Geometry1,
  32. typename Geometry2 = Geometry1,
  33. typename Tag1 = typename tag_cast
  34. <
  35. typename tag<Geometry1>::type, pointlike_tag
  36. >::type,
  37. typename Tag2 = typename tag_cast
  38. <
  39. typename tag<Geometry2>::type, pointlike_tag
  40. >::type,
  41. bool Reverse = geometry::reverse_dispatch<Geometry1, Geometry2>::type::value
  42. >
  43. struct default_strategy
  44. : strategy::distance::services::default_strategy
  45. <
  46. point_tag, segment_tag,
  47. typename point_type<Geometry1>::type,
  48. typename point_type<Geometry2>::type
  49. >
  50. {};
  51. template
  52. <
  53. typename Geometry1,
  54. typename Geometry2,
  55. typename Tag1,
  56. typename Tag2
  57. >
  58. struct default_strategy<Geometry1, Geometry2, Tag1, Tag2, true>
  59. : default_strategy<Geometry2, Geometry1, Tag2, Tag1, false>
  60. {};
  61. template <typename Pointlike1, typename Pointlike2>
  62. struct default_strategy
  63. <
  64. Pointlike1, Pointlike2,
  65. pointlike_tag, pointlike_tag, false
  66. > : strategy::distance::services::default_strategy
  67. <
  68. point_tag, point_tag,
  69. typename point_type<Pointlike1>::type,
  70. typename point_type<Pointlike2>::type
  71. >
  72. {};
  73. template <typename Pointlike, typename Box>
  74. struct default_strategy<Pointlike, Box, pointlike_tag, box_tag, false>
  75. : strategy::distance::services::default_strategy
  76. <
  77. point_tag, box_tag,
  78. typename point_type<Pointlike>::type,
  79. typename point_type<Box>::type
  80. >
  81. {};
  82. template <typename Box1, typename Box2>
  83. struct default_strategy<Box1, Box2, box_tag, box_tag, false>
  84. : strategy::distance::services::default_strategy
  85. <
  86. box_tag, box_tag,
  87. typename point_type<Box1>::type,
  88. typename point_type<Box2>::type
  89. >
  90. {};
  91. template <typename Linear, typename Box>
  92. struct default_strategy<Linear, Box, segment_tag, box_tag, false>
  93. : strategy::distance::services::default_strategy
  94. <
  95. segment_tag, box_tag,
  96. typename point_type<Linear>::type,
  97. typename point_type<Box>::type
  98. >
  99. {};
  100. template <typename Linear, typename Box>
  101. struct default_strategy<Linear, Box, linear_tag, box_tag, false>
  102. : strategy::distance::services::default_strategy
  103. <
  104. segment_tag, box_tag,
  105. typename point_type<Linear>::type,
  106. typename point_type<Box>::type
  107. >
  108. {};
  109. // Helper metafunction for default point-segment strategy retrieval
  110. template <typename Geometry1, typename Geometry2, typename Strategy>
  111. struct default_ps_strategy
  112. : strategy::distance::services::default_strategy
  113. <
  114. point_tag, segment_tag,
  115. typename point_type<Geometry1>::type,
  116. typename point_type<Geometry2>::type,
  117. typename cs_tag<typename point_type<Geometry1>::type>::type,
  118. typename cs_tag<typename point_type<Geometry2>::type>::type,
  119. Strategy
  120. >
  121. {};
  122. }} // namespace detail::distance
  123. #endif // DOXYGEN_NO_DETAIL
  124. }} // namespace boost::geometry
  125. #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_DEFAULT_STRATEGIES_HPP