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.hpp267
1 files changed, 25 insertions, 242 deletions
diff --git a/boost/geometry/index/detail/rtree/query_iterators.hpp b/boost/geometry/index/detail/rtree/query_iterators.hpp
index 8366fca191..74000d03ef 100644
--- a/boost/geometry/index/detail/rtree/query_iterators.hpp
+++ b/boost/geometry/index/detail/rtree/query_iterators.hpp
@@ -2,7 +2,7 @@
//
// R-tree query iterators
//
-// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
+// 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
@@ -11,9 +11,8 @@
#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_QUERY_ITERATORS_HPP
#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_QUERY_ITERATORS_HPP
-#define BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_VIRTUAL
-//#define BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_FUNCTION
-//#define BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_TYPE_ERASURE
+#include <boost/scoped_ptr.hpp>
+
//#define BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_MOVE
namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace iterators {
@@ -29,27 +28,27 @@ struct end_query_iterator
reference operator*() const
{
- BOOST_ASSERT_MSG(false, "iterator not dereferencable");
+ BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not dereferencable");
pointer p(0);
return *p;
}
const value_type * operator->() const
{
- BOOST_ASSERT_MSG(false, "iterator not dereferencable");
+ BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not dereferencable");
const value_type * p = 0;
return p;
}
end_query_iterator & operator++()
{
- BOOST_ASSERT_MSG(false, "iterator not incrementable");
+ BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not incrementable");
return *this;
}
end_query_iterator operator++(int)
{
- BOOST_ASSERT_MSG(false, "iterator not incrementable");
+ BOOST_GEOMETRY_INDEX_ASSERT(false, "iterator not incrementable");
return *this;
}
@@ -197,9 +196,6 @@ inline bool operator!=(L const& l, R const& r)
}}}}}} // namespace boost::geometry::index::detail::rtree::iterators
-#if defined(BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_VIRTUAL) || defined(BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_FUNCTION)
-
-#if defined(BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_VIRTUAL)
namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace iterators {
@@ -246,73 +242,7 @@ public:
virtual bool equals(base_t const& r) const
{
const query_iterator_wrapper * p = dynamic_cast<const query_iterator_wrapper *>(boost::addressof(r));
- BOOST_ASSERT_MSG(p, "those iterators can't be compared");
- return m_iterator == p->m_iterator;
- }
-
-private:
- Iterator m_iterator;
-};
-
-#elif defined(BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_FUNCTION)
-
-#include <boost/function.hpp>
-#include <boost/bind.hpp>
-
-namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace iterators {
-
-template <typename Value, typename Allocators>
-class query_iterator_base
-{
-public:
- typedef std::input_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;
-
- virtual ~query_iterator_base() {}
-
- boost::function<query_iterator_base*()> clone;
- boost::function<bool()> is_end;
- boost::function<reference()> dereference;
- boost::function<void()> increment;
- boost::function<bool(query_iterator_base const&)> equals;
-};
-
-template <typename Value, typename Allocators, typename Iterator>
-class query_iterator_wrapper
- : public query_iterator_base<Value, Allocators>
-{
- typedef query_iterator_base<Value, Allocators> base_t;
-
-public:
- typedef std::input_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;
-
- explicit query_iterator_wrapper(Iterator const& it)
- : m_iterator(it)
- {
- base_t::clone = boost::bind(&query_iterator_wrapper::clone_, this);
- base_t::is_end = boost::bind(&query_iterator_wrapper::is_end_, this);
- base_t::dereference = boost::bind(&query_iterator_wrapper::dereference_, this);
- base_t::increment = boost::bind(&query_iterator_wrapper::increment_, this);
- base_t::equals = boost::bind(&query_iterator_wrapper::equals_, this, _1);
- }
-
-private:
- base_t * clone_() const { return new query_iterator_wrapper(m_iterator); }
-
- bool is_end_() const { return m_iterator == end_query_iterator<Value, Allocators>(); }
- reference dereference_() const { return *m_iterator; }
- void increment_() { ++m_iterator; }
- bool equals_(base_t const& r) const
- {
- const query_iterator_wrapper * p = dynamic_cast<const query_iterator_wrapper *>(boost::addressof(r));
- BOOST_ASSERT_MSG(p, "those iterators can't be compared");
+ BOOST_GEOMETRY_INDEX_ASSERT(p, "iterators can't be compared");
return m_iterator == p->m_iterator;
}
@@ -320,13 +250,12 @@ private:
Iterator m_iterator;
};
-#endif
template <typename Value, typename Allocators>
class query_iterator
{
typedef query_iterator_base<Value, Allocators> iterator_base;
- typedef std::auto_ptr<iterator_base> iterator_ptr;
+ typedef boost::scoped_ptr<iterator_base> iterator_ptr;
public:
typedef std::input_iterator_tag iterator_category;
@@ -353,21 +282,24 @@ public:
#ifndef BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_MOVE
query_iterator & operator=(query_iterator const& o)
{
- m_ptr.reset(o.m_ptr.get() ? o.m_ptr->clone() : 0);
+ if ( this != boost::addressof(o) )
+ {
+ m_ptr.reset(o.m_ptr.get() ? o.m_ptr->clone() : 0);
+ }
return *this;
}
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
query_iterator(query_iterator && o)
- : m_ptr(o.m_ptr.get())
+ : m_ptr(0)
{
- o.m_ptr.release();
+ m_ptr.swap(o.m_ptr);
}
query_iterator & operator=(query_iterator && o)
{
if ( this != boost::addressof(o) )
{
- m_ptr.reset(o.m_ptr.get());
- o.m_ptr.release();
+ m_ptr.swap(o.m_ptr);
+ o.m_ptr.reset();
}
return *this;
}
@@ -378,20 +310,23 @@ private:
public:
query_iterator & operator=(BOOST_COPY_ASSIGN_REF(query_iterator) o)
{
- m_ptr.reset(o.m_ptr.get() ? o.m_ptr->clone() : 0);
+ 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(o.m_ptr.get())
+ : m_ptr(0)
{
- o.m_ptr.release();
+ m_ptr.swap(o.m_ptr);
}
query_iterator & operator=(BOOST_RV_REF(query_iterator) o)
{
if ( this != boost::addressof(o) )
{
- m_ptr.reset(o.m_ptr.get());
- o.m_ptr.release();
+ m_ptr.swap(o.m_ptr);
+ o.m_ptr.reset();
}
return *this;
}
@@ -444,156 +379,4 @@ private:
}}}}}} // namespace boost::geometry::index::detail::rtree::iterators
-#elif defined(BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_TYPE_ERASURE)
-
-#include <boost/type_erasure/any.hpp>
-#include <boost/type_erasure/operators.hpp>
-#include <boost/type_erasure/is_empty.hpp>
-
-namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace iterators {
-
-template<typename T, typename Value, typename Allocators>
-struct single_pass_iterator_concept :
- ::boost::mpl::vector<
- ::boost::type_erasure::copy_constructible<T>,
- ::boost::type_erasure::equality_comparable<T>,
- ::boost::type_erasure::dereferenceable<typename Allocators::const_reference, T>,
- ::boost::type_erasure::assignable<T>,
- ::boost::type_erasure::incrementable<T>,
- ::boost::type_erasure::equality_comparable<T, end_query_iterator<Value, Allocators> >,
- ::boost::type_erasure::relaxed // default ctor
- >
-{};
-
-template <typename Value, typename Allocators>
-struct single_pass_iterator_type
-{
- typedef ::boost::type_erasure::any<
- single_pass_iterator_concept<
- ::boost::type_erasure::_self, Value, Allocators
- >
- > type;
-};
-
-}}}}}} // namespace boost::geometry::index::detail::rtree::iterators
-
-namespace boost { namespace type_erasure {
-
-template<typename T, typename Value, typename Allocators, typename Base>
-struct concept_interface<
- ::boost::geometry::index::detail::rtree::single_pass_iterator_concept<
- T, Value, Allocators
- >, Base, T>
- : Base
-{
- typedef Value value_type;
- typedef typename Allocators::const_reference reference;
- typedef typename Allocators::const_pointer pointer;
- typedef typename Allocators::difference_type difference_type;
- typedef ::std::input_iterator_tag iterator_category;
-};
-
-}} // boost::type_erasure
-
-namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace iterators {
-
-template <typename Value, typename Allocators>
-class query_iterator
-{
-public:
- typedef std::input_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;
-
-private:
- typedef typename rtree::single_pass_iterator_type<Value, Allocators>::type iterator_type;
-
-public:
-
- query_iterator() {}
-
- template <typename It>
- query_iterator(It const& it)
- : m_iterator(it)
- {}
-
- query_iterator(end_query_iterator<Value, Allocators> const& /*it*/)
- {}
-
-#ifdef BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_MOVE
-private:
- BOOST_COPYABLE_AND_MOVABLE(query_iterator)
-public:
- query_iterator(query_iterator const& o)
- : m_iterator(o.m_iterator)
- {}
- query_iterator & operator=(BOOST_COPY_ASSIGN_REF(query_iterator) o)
- {
- m_iterator = o.m_iterator;
- return *this;
- }
- query_iterator(BOOST_RV_REF(query_iterator) o)
- : m_iterator(boost::move(o.m_iterator))
- {}
- query_iterator & operator=(BOOST_RV_REF(query_iterator) o)
- {
- if ( this != boost::addressof(o) )
- {
- m_iterator = boost::move(o.m_iterator);
- }
- return *this;
- }
-#endif // BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_MOVE
-
- reference operator*() const
- {
- return *m_iterator;
- }
-
- const value_type * operator->() const
- {
- return boost::addressof(*m_iterator);
- }
-
- query_iterator & operator++()
- {
- ++m_iterator;
- return *this;
- }
-
- query_iterator operator++(int)
- {
- query_iterator temp = *this;
- ++m_iterator;
- return temp;
- }
-
- friend bool operator==(query_iterator const& l, query_iterator const& r)
- {
- if ( !::boost::type_erasure::is_empty(l.m_iterator) )
- {
- if ( !::boost::type_erasure::is_empty(r.m_iterator) )
- return l.m_iterator == r.m_iterator;
- else
- return l.m_iterator == end_query_iterator<Value, Allocators>();
- }
- else
- {
- if ( !::boost::type_erasure::is_empty(r.m_iterator) )
- return r.m_iterator == end_query_iterator<Value, Allocators>();
- else
- return true;
- }
- }
-
-private:
- iterator_type m_iterator;
-};
-
-}}}}}} // namespace boost::geometry::index::detail::rtree::iterators
-
-#endif // BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_TYPE_ERASURE
-
#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_QUERY_ITERATORS_HPP