single_geometry.hpp 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
  3. // This file was modified by Oracle on 2013-2020.
  4. // Modifications copyright (c) 2013-2020, Oracle and/or its affiliates.
  5. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
  6. // Use, modification and distribution is subject to the Boost Software License,
  7. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_SINGLE_GEOMETRY_HPP
  10. #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_SINGLE_GEOMETRY_HPP
  11. #include <type_traits>
  12. #include <boost/geometry/core/assert.hpp>
  13. #include <boost/geometry/core/tag.hpp>
  14. #include <boost/geometry/util/range.hpp>
  15. namespace boost { namespace geometry {
  16. #ifndef DOXYGEN_NO_DISPATCH
  17. namespace detail_dispatch {
  18. // Returns single geometry by Id
  19. // for single geometries returns the geometry itself
  20. template
  21. <
  22. typename Geometry,
  23. bool IsMulti = std::is_base_of
  24. <
  25. multi_tag,
  26. typename geometry::tag<Geometry>::type
  27. >::value
  28. >
  29. struct single_geometry
  30. {
  31. typedef Geometry & return_type;
  32. template <typename Id>
  33. static inline return_type apply(Geometry & g, Id const& ) { return g; }
  34. };
  35. // for multi geometries returns one of the stored single geometries
  36. template <typename Geometry>
  37. struct single_geometry<Geometry, true>
  38. {
  39. typedef typename boost::range_reference<Geometry>::type return_type;
  40. template <typename Id>
  41. static inline return_type apply(Geometry & g, Id const& id)
  42. {
  43. BOOST_GEOMETRY_ASSERT(id.multi_index >= 0);
  44. typedef typename boost::range_size<Geometry>::type size_type;
  45. return range::at(g, static_cast<size_type>(id.multi_index));
  46. }
  47. };
  48. } // namespace detail_dispatch
  49. #endif // DOXYGEN_NO_DISPATCH
  50. #ifndef DOXYGEN_NO_DETAIL
  51. namespace detail {
  52. template <typename Geometry>
  53. struct single_geometry_return_type
  54. {
  55. typedef typename detail_dispatch::single_geometry<Geometry>::return_type type;
  56. };
  57. template <typename Geometry, typename Id>
  58. inline
  59. typename single_geometry_return_type<Geometry>::type
  60. single_geometry(Geometry & geometry, Id const& id)
  61. {
  62. return detail_dispatch::single_geometry<Geometry>::apply(geometry, id);
  63. }
  64. template <typename Geometry, typename Id>
  65. inline
  66. typename single_geometry_return_type<Geometry const>::type
  67. single_geometry(Geometry const& geometry, Id const& id)
  68. {
  69. return detail_dispatch::single_geometry<Geometry const>::apply(geometry, id);
  70. }
  71. } // namespace detail
  72. #endif // DOXYGEN_NO_DETAIL
  73. }} // namespace boost::geometry
  74. #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_SINGLE_GEOMETRY_HPP