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 11 #ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_ITERATORS_HPP 12 #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_ITERATORS_HPP 13 14 namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace iterators { 15 16 template <typename Value, typename Allocators> 17 struct end_iterator 18 { 19 typedef std::forward_iterator_tag iterator_category; 20 typedef Value value_type; 21 typedef typename Allocators::const_reference reference; 22 typedef typename Allocators::difference_type difference_type; 23 typedef typename Allocators::const_pointer pointer; 24 operator *boost::geometry::index::detail::rtree::iterators::end_iterator25 reference operator*() const 26 { 27 BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not dereferencable"); 28 pointer p(0); 29 return *p; 30 } 31 operator ->boost::geometry::index::detail::rtree::iterators::end_iterator32 const value_type * operator->() const 33 { 34 BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not dereferencable"); 35 const value_type * p = 0; 36 return p; 37 } 38 operator ++boost::geometry::index::detail::rtree::iterators::end_iterator39 end_iterator & operator++() 40 { 41 BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not incrementable"); 42 return *this; 43 } 44 operator ++boost::geometry::index::detail::rtree::iterators::end_iterator45 end_iterator operator++(int) 46 { 47 BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not incrementable"); 48 return *this; 49 } 50 operator ==(end_iterator const &,end_iterator const &)51 friend bool operator==(end_iterator const& /*l*/, end_iterator const& /*r*/) 52 { 53 return true; 54 } 55 }; 56 57 template <typename Value, typename Options, typename Translator, typename Box, typename Allocators> 58 class iterator 59 { 60 typedef visitors::iterator<Value, Options, Translator, Box, Allocators> visitor_type; 61 typedef typename visitor_type::node_pointer node_pointer; 62 63 public: 64 typedef std::forward_iterator_tag iterator_category; 65 typedef Value value_type; 66 typedef typename Allocators::const_reference reference; 67 typedef typename Allocators::difference_type difference_type; 68 typedef typename Allocators::const_pointer pointer; 69 iterator()70 inline iterator() 71 {} 72 iterator(node_pointer root)73 inline iterator(node_pointer root) 74 { 75 m_visitor.initialize(root); 76 } 77 operator *() const78 reference operator*() const 79 { 80 return m_visitor.dereference(); 81 } 82 operator ->() const83 const value_type * operator->() const 84 { 85 return boost::addressof(m_visitor.dereference()); 86 } 87 operator ++()88 iterator & operator++() 89 { 90 m_visitor.increment(); 91 return *this; 92 } 93 operator ++(int)94 iterator operator++(int) 95 { 96 iterator temp = *this; 97 this->operator++(); 98 return temp; 99 } 100 operator ==(iterator const & l,iterator const & r)101 friend bool operator==(iterator const& l, iterator const& r) 102 { 103 return l.m_visitor == r.m_visitor; 104 } 105 operator ==(iterator const & l,end_iterator<Value,Allocators> const &)106 friend bool operator==(iterator const& l, end_iterator<Value, Allocators> const& /*r*/) 107 { 108 return l.m_visitor.is_end(); 109 } 110 operator ==(end_iterator<Value,Allocators> const &,iterator const & r)111 friend bool operator==(end_iterator<Value, Allocators> const& /*l*/, iterator const& r) 112 { 113 return r.m_visitor.is_end(); 114 } 115 116 private: 117 visitor_type m_visitor; 118 }; 119 120 }}}}}} // namespace boost::geometry::index::detail::rtree::iterators 121 122 #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_ITERATORS_HPP 123