iterators.hpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // Boost.Geometry Index
  2. //
  3. // R-tree iterators
  4. //
  5. // Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland.
  6. //
  7. // Use, modification and distribution is subject to the Boost Software License,
  8. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  9. // http://www.boost.org/LICENSE_1_0.txt)
  10. #ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_ITERATORS_HPP
  11. #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_ITERATORS_HPP
  12. namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace iterators {
  13. template <typename Value, typename Allocators>
  14. struct end_iterator
  15. {
  16. typedef std::forward_iterator_tag iterator_category;
  17. typedef Value value_type;
  18. typedef typename Allocators::const_reference reference;
  19. typedef typename Allocators::difference_type difference_type;
  20. typedef typename Allocators::const_pointer pointer;
  21. reference operator*() const
  22. {
  23. BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not dereferencable");
  24. pointer p(0);
  25. return *p;
  26. }
  27. const value_type * operator->() const
  28. {
  29. BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not dereferencable");
  30. const value_type * p = 0;
  31. return p;
  32. }
  33. end_iterator & operator++()
  34. {
  35. BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not incrementable");
  36. return *this;
  37. }
  38. end_iterator operator++(int)
  39. {
  40. BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not incrementable");
  41. return *this;
  42. }
  43. friend bool operator==(end_iterator const& /*l*/, end_iterator const& /*r*/)
  44. {
  45. return true;
  46. }
  47. };
  48. template <typename Value, typename Options, typename Translator, typename Box, typename Allocators>
  49. class iterator
  50. {
  51. typedef visitors::iterator<Value, Options, Translator, Box, Allocators> visitor_type;
  52. typedef typename visitor_type::node_pointer node_pointer;
  53. public:
  54. typedef std::forward_iterator_tag iterator_category;
  55. typedef Value value_type;
  56. typedef typename Allocators::const_reference reference;
  57. typedef typename Allocators::difference_type difference_type;
  58. typedef typename Allocators::const_pointer pointer;
  59. inline iterator()
  60. {}
  61. inline iterator(node_pointer root)
  62. {
  63. m_visitor.initialize(root);
  64. }
  65. reference operator*() const
  66. {
  67. return m_visitor.dereference();
  68. }
  69. const value_type * operator->() const
  70. {
  71. return boost::addressof(m_visitor.dereference());
  72. }
  73. iterator & operator++()
  74. {
  75. m_visitor.increment();
  76. return *this;
  77. }
  78. iterator operator++(int)
  79. {
  80. iterator temp = *this;
  81. this->operator++();
  82. return temp;
  83. }
  84. friend bool operator==(iterator const& l, iterator const& r)
  85. {
  86. return l.m_visitor == r.m_visitor;
  87. }
  88. friend bool operator==(iterator const& l, end_iterator<Value, Allocators> const& /*r*/)
  89. {
  90. return l.m_visitor.is_end();
  91. }
  92. friend bool operator==(end_iterator<Value, Allocators> const& /*l*/, iterator const& r)
  93. {
  94. return r.m_visitor.is_end();
  95. }
  96. private:
  97. visitor_type m_visitor;
  98. };
  99. }}}}}} // namespace boost::geometry::index::detail::rtree::iterators
  100. #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_ITERATORS_HPP