// Boost.Geometry Index // // R-tree iterators // // Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland. // // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_ITERATORS_HPP #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_ITERATORS_HPP namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace iterators { template struct end_iterator { typedef std::forward_iterator_tag iterator_category; typedef Value value_type; typedef typename Allocators::const_reference reference; typedef typename Allocators::difference_type difference_type; typedef typename Allocators::const_pointer pointer; reference operator*() const { BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not dereferencable"); pointer p(0); return *p; } const value_type * operator->() const { BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not dereferencable"); const value_type * p = 0; return p; } end_iterator & operator++() { BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not incrementable"); return *this; } end_iterator operator++(int) { BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not incrementable"); return *this; } friend bool operator==(end_iterator const& /*l*/, end_iterator const& /*r*/) { return true; } }; template class iterator { typedef visitors::iterator visitor_type; typedef typename visitor_type::node_pointer node_pointer; public: typedef std::forward_iterator_tag iterator_category; typedef Value value_type; typedef typename Allocators::const_reference reference; typedef typename Allocators::difference_type difference_type; typedef typename Allocators::const_pointer pointer; inline iterator() {} inline iterator(node_pointer root) { m_visitor.initialize(root); } reference operator*() const { return m_visitor.dereference(); } const value_type * operator->() const { return boost::addressof(m_visitor.dereference()); } iterator & operator++() { m_visitor.increment(); return *this; } iterator operator++(int) { iterator temp = *this; this->operator++(); return temp; } friend bool operator==(iterator const& l, iterator const& r) { return l.m_visitor == r.m_visitor; } friend bool operator==(iterator const& l, end_iterator const& /*r*/) { return l.m_visitor.is_end(); } friend bool operator==(end_iterator const& /*l*/, iterator const& r) { return r.m_visitor.is_end(); } private: visitor_type m_visitor; }; }}}}}} // namespace boost::geometry::index::detail::rtree::iterators #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_ITERATORS_HPP