summaryrefslogtreecommitdiff
path: root/boost/geometry/index/detail/rtree/query_iterators.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/index/detail/rtree/query_iterators.hpp')
-rw-r--r--boost/geometry/index/detail/rtree/query_iterators.hpp135
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
{