single_geometry.hpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. #include <boost/geometry/util/type_traits.hpp>
  16. namespace boost { namespace geometry {
  17. #ifndef DOXYGEN_NO_DISPATCH
  18. namespace detail_dispatch {
  19. // Returns single geometry by Id
  20. // for single geometries returns the geometry itself
  21. template
  22. <
  23. typename Geometry,
  24. bool IsMulti = util::is_multi<Geometry>::value
  25. >
  26. struct single_geometry
  27. {
  28. typedef Geometry & return_type;
  29. template <typename Id>
  30. static inline return_type apply(Geometry & g, Id const& ) { return g; }
  31. };
  32. // for multi geometries returns one of the stored single geometries
  33. template <typename Geometry>
  34. struct single_geometry<Geometry, true>
  35. {
  36. typedef typename boost::range_reference<Geometry>::type return_type;
  37. template <typename Id>
  38. static inline return_type apply(Geometry & g, Id const& id)
  39. {
  40. BOOST_GEOMETRY_ASSERT(id.multi_index >= 0);
  41. typedef typename boost::range_size<Geometry>::type size_type;
  42. return range::at(g, static_cast<size_type>(id.multi_index));
  43. }
  44. };
  45. } // namespace detail_dispatch
  46. #endif // DOXYGEN_NO_DISPATCH
  47. #ifndef DOXYGEN_NO_DETAIL
  48. namespace detail {
  49. template <typename Geometry>
  50. struct single_geometry_return_type
  51. {
  52. typedef typename detail_dispatch::single_geometry<Geometry>::return_type type;
  53. };
  54. template <typename Geometry, typename Id>
  55. inline
  56. typename single_geometry_return_type<Geometry>::type
  57. single_geometry(Geometry & geometry, Id const& id)
  58. {
  59. return detail_dispatch::single_geometry<Geometry>::apply(geometry, id);
  60. }
  61. template <typename Geometry, typename Id>
  62. inline
  63. typename single_geometry_return_type<Geometry const>::type
  64. single_geometry(Geometry const& geometry, Id const& id)
  65. {
  66. return detail_dispatch::single_geometry<Geometry const>::apply(geometry, id);
  67. }
  68. } // namespace detail
  69. #endif // DOXYGEN_NO_DETAIL
  70. }} // namespace boost::geometry
  71. #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_SINGLE_GEOMETRY_HPP