diff options
Diffstat (limited to 'boost/geometry/index/detail/rtree/query_iterators.hpp')
-rw-r--r-- | boost/geometry/index/detail/rtree/query_iterators.hpp | 135 |
1 files changed, 42 insertions, 93 deletions
diff --git a/boost/geometry/index/detail/rtree/query_iterators.hpp b/boost/geometry/index/detail/rtree/query_iterators.hpp index 8822bcf04f..170c3ac9b1 100644 --- a/boost/geometry/index/detail/rtree/query_iterators.hpp +++ b/boost/geometry/index/detail/rtree/query_iterators.hpp @@ -2,10 +2,10 @@ // // R-tree query iterators // -// Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland. +// Copyright (c) 2011-2023 Adam Wulkiewicz, Lodz, Poland. // -// This file was modified by Oracle on 2019. -// Modifications copyright (c) 2019 Oracle and/or its affiliates. +// This file was modified by Oracle on 2019-2021. +// Modifications copyright (c) 2019-2021 Oracle and/or its affiliates. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // // Use, modification and distribution is subject to the Boost Software License, @@ -15,9 +15,11 @@ #ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_QUERY_ITERATORS_HPP #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_QUERY_ITERATORS_HPP -#include <boost/scoped_ptr.hpp> +#include <memory> -//#define BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_MOVE +#include <boost/geometry/index/detail/rtree/node/node_elements.hpp> +#include <boost/geometry/index/detail/rtree/visitors/distance_query.hpp> +#include <boost/geometry/index/detail/rtree/visitors/spatial_query.hpp> namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace iterators { @@ -65,13 +67,8 @@ struct end_query_iterator template <typename MembersHolder, typename Predicates> class spatial_query_iterator { - typedef typename MembersHolder::parameters_type parameters_type; - typedef typename MembersHolder::translator_type translator_type; typedef typename MembersHolder::allocators_type allocators_type; - typedef visitors::spatial_query_incremental<MembersHolder, Predicates> visitor_type; - typedef typename visitor_type::node_pointer node_pointer; - public: typedef std::forward_iterator_tag iterator_category; typedef typename MembersHolder::value_type value_type; @@ -79,32 +76,31 @@ public: typedef typename allocators_type::difference_type difference_type; typedef typename allocators_type::const_pointer pointer; - inline spatial_query_iterator() - {} + spatial_query_iterator() = default; - inline spatial_query_iterator(parameters_type const& par, translator_type const& t, Predicates const& p) - : m_visitor(par, t, p) + explicit spatial_query_iterator(Predicates const& pred) + : m_impl(pred) {} - inline spatial_query_iterator(node_pointer root, parameters_type const& par, translator_type const& t, Predicates const& p) - : m_visitor(par, t, p) + spatial_query_iterator(MembersHolder const& members, Predicates const& pred) + : m_impl(members, pred) { - m_visitor.initialize(root); + m_impl.initialize(members); } reference operator*() const { - return m_visitor.dereference(); + return m_impl.dereference(); } const value_type * operator->() const { - return boost::addressof(m_visitor.dereference()); + return boost::addressof(m_impl.dereference()); } spatial_query_iterator & operator++() { - m_visitor.increment(); + m_impl.increment(); return *this; } @@ -117,33 +113,28 @@ public: friend bool operator==(spatial_query_iterator const& l, spatial_query_iterator const& r) { - return l.m_visitor == r.m_visitor; + return l.m_impl == r.m_impl; } friend bool operator==(spatial_query_iterator const& l, end_query_iterator<value_type, allocators_type> const& /*r*/) { - return l.m_visitor.is_end(); + return l.m_impl.is_end(); } friend bool operator==(end_query_iterator<value_type, allocators_type> const& /*l*/, spatial_query_iterator const& r) { - return r.m_visitor.is_end(); + return r.m_impl.is_end(); } - + private: - visitor_type m_visitor; + visitors::spatial_query_incremental<MembersHolder, Predicates> m_impl; }; -template <typename MembersHolder, typename Predicates, unsigned NearestPredicateIndex> +template <typename MembersHolder, typename Predicates> class distance_query_iterator { - typedef typename MembersHolder::parameters_type parameters_type; - typedef typename MembersHolder::translator_type translator_type; typedef typename MembersHolder::allocators_type allocators_type; - typedef visitors::distance_query_incremental<MembersHolder, Predicates, NearestPredicateIndex> visitor_type; - typedef typename visitor_type::node_pointer node_pointer; - public: typedef std::forward_iterator_tag iterator_category; typedef typename MembersHolder::value_type value_type; @@ -151,32 +142,31 @@ public: typedef typename allocators_type::difference_type difference_type; typedef typename allocators_type::const_pointer pointer; - inline distance_query_iterator() - {} + distance_query_iterator() = default; - inline distance_query_iterator(parameters_type const& par, translator_type const& t, Predicates const& p) - : m_visitor(par, t, p) + explicit distance_query_iterator(Predicates const& pred) + : m_impl(pred) {} - inline distance_query_iterator(node_pointer root, parameters_type const& par, translator_type const& t, Predicates const& p) - : m_visitor(par, t, p) + distance_query_iterator(MembersHolder const& members, Predicates const& pred) + : m_impl(members, pred) { - m_visitor.initialize(root); + m_impl.initialize(members); } reference operator*() const { - return m_visitor.dereference(); + return m_impl.dereference(); } const value_type * operator->() const { - return boost::addressof(m_visitor.dereference()); + return boost::addressof(m_impl.dereference()); } distance_query_iterator & operator++() { - m_visitor.increment(); + m_impl.increment(); return *this; } @@ -189,21 +179,21 @@ public: friend bool operator==(distance_query_iterator const& l, distance_query_iterator const& r) { - return l.m_visitor == r.m_visitor; + return l.m_impl == r.m_impl; } friend bool operator==(distance_query_iterator const& l, end_query_iterator<value_type, allocators_type> const& /*r*/) { - return l.m_visitor.is_end(); + return l.m_impl.is_end(); } friend bool operator==(end_query_iterator<value_type, allocators_type> const& /*l*/, distance_query_iterator const& r) { - return r.m_visitor.is_end(); + return r.m_impl.is_end(); } private: - visitor_type m_visitor; + visitors::distance_query_incremental<MembersHolder, Predicates> m_impl; }; @@ -227,7 +217,7 @@ public: virtual ~query_iterator_base() {} virtual query_iterator_base * clone() const = 0; - + virtual bool is_end() const = 0; virtual reference dereference() const = 0; virtual void increment() = 0; @@ -271,7 +261,7 @@ template <typename Value, typename Allocators> class query_iterator { typedef query_iterator_base<Value, Allocators> iterator_base; - typedef boost::scoped_ptr<iterator_base> iterator_ptr; + typedef std::unique_ptr<iterator_base> iterator_ptr; public: typedef std::forward_iterator_tag iterator_category; @@ -280,8 +270,7 @@ public: typedef typename Allocators::difference_type difference_type; typedef typename Allocators::const_pointer pointer; - query_iterator() - {} + query_iterator() = default; template <typename It> query_iterator(It const& it) @@ -296,7 +285,8 @@ public: : m_ptr(o.m_ptr.get() ? o.m_ptr->clone() : 0) {} -#ifndef BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_MOVE + query_iterator(query_iterator&&) = default; + query_iterator & operator=(query_iterator const& o) { if ( this != boost::addressof(o) ) @@ -305,49 +295,8 @@ public: } return *this; } -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - query_iterator(query_iterator && o) - : m_ptr(0) - { - m_ptr.swap(o.m_ptr); - } - query_iterator & operator=(query_iterator && o) - { - if ( this != boost::addressof(o) ) - { - m_ptr.swap(o.m_ptr); - o.m_ptr.reset(); - } - return *this; - } -#endif -#else // !BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_MOVE -private: - BOOST_COPYABLE_AND_MOVABLE(query_iterator) -public: - query_iterator & operator=(BOOST_COPY_ASSIGN_REF(query_iterator) o) - { - if ( this != boost::addressof(o) ) - { - m_ptr.reset(o.m_ptr.get() ? o.m_ptr->clone() : 0); - } - return *this; - } - query_iterator(BOOST_RV_REF(query_iterator) o) - : m_ptr(0) - { - m_ptr.swap(o.m_ptr); - } - query_iterator & operator=(BOOST_RV_REF(query_iterator) o) - { - if ( this != boost::addressof(o) ) - { - m_ptr.swap(o.m_ptr); - o.m_ptr.reset(); - } - return *this; - } -#endif // BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_MOVE + + query_iterator& operator=(query_iterator &&) = default; reference operator*() const { |