|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r80753 - sandbox-branches/geometry/index_dev/boost/geometry/extensions/index/rtree
From: adam.wulkiewicz_at_[hidden]
Date: 2012-09-29 08:56:39
Author: awulkiew
Date: 2012-09-29 08:56:38 EDT (Sat, 29 Sep 2012)
New Revision: 80753
URL: http://svn.boost.org/trac/boost/changeset/80753
Log:
implemented basic functionality of node_proxy
Added:
sandbox-branches/geometry/index_dev/boost/geometry/extensions/index/rtree/node_proxy.hpp (contents, props changed)
Text files modified:
sandbox-branches/geometry/index_dev/boost/geometry/extensions/index/rtree/rtree.hpp | 136 +++++++++++++++------------------------
1 files changed, 54 insertions(+), 82 deletions(-)
Added: sandbox-branches/geometry/index_dev/boost/geometry/extensions/index/rtree/node_proxy.hpp
==============================================================================
--- (empty file)
+++ sandbox-branches/geometry/index_dev/boost/geometry/extensions/index/rtree/node_proxy.hpp 2012-09-29 08:56:38 EDT (Sat, 29 Sep 2012)
@@ -0,0 +1,96 @@
+// Boost.Geometry Index
+//
+// R-tree node proxy
+//
+// Copyright (c) 2011-2012 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_EXTENSIONS_INDEX_RTREE_NODE_PROXY_HPP
+#define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_NODE_PROXY_HPP
+
+namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree {
+
+template <
+ typename Value,
+ typename Parameters,
+ typename Translator = translator::def<Value>,
+ typename Allocator = std::allocator<Value>
+>
+class node_proxy
+{
+public:
+ typedef Value value_type;
+ typedef Translator translator_type;
+ typedef typename translator::indexable_type<Translator>::type indexable_type;
+ typedef typename index::default_box_type<indexable_type>::type box_type;
+
+ typedef typename detail::rtree::options_type<Parameters>::type options_type;
+ typedef typename options_type::parameters_type parameters_type;
+ typedef typename options_type::node_tag node_tag;
+
+ typedef Allocator allocator_type;
+
+ typedef detail::rtree::allocators<
+ allocator_type, value_type, parameters_type, box_type, node_tag
+ > allocators_type;
+
+ typedef typename allocators_type::size_type size_type;
+
+ typedef typename detail::rtree::node<
+ value_type, parameters_type, box_type, allocators_type, node_tag
+ >::type node;
+
+ typedef typename detail::rtree::internal_node<
+ value_type, parameters_type, box_type, allocators_type, node_tag
+ >::type internal_node;
+
+ typedef typename detail::rtree::leaf<
+ value_type, parameters_type, box_type, allocators_type, node_tag
+ >::type leaf;
+
+ node_proxy(Parameters parameters, translator_type const& translator, Allocator allocator)
+ : m_parameters(parameters)
+ , m_translator(translator)
+ , m_allocators(allocator)
+ {}
+
+ template <typename Node>
+ node * create_node()
+ {
+ return detail::rtree::create_node<allocators_type, Node>::apply(m_allocators);
+ }
+
+ template <typename Node>
+ void destroy_node(node * n)
+ {
+ return detail::rtree::destroy_node<allocators_type, Node>::apply(m_allocators, n);
+ }
+
+ template <typename Visitor>
+ void apply_visitor(Visitor & visitor, node * n) const
+ {
+ detail::rtree::apply_visitor(visitor, *n);
+ }
+
+ indexable_type const& translate(value_type const& v) const
+ {
+ return m_translator(v);
+ }
+
+ translator_type const& translator() const
+ {
+ return m_translator;
+ }
+
+private:
+ Parameters m_parameters;
+ translator_type m_translator;
+ allocators_type m_allocators;
+};
+
+}}} // namespace boost::geometry::index::detail::rtree
+
+#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_NODE_PROXY_HPP
Modified: sandbox-branches/geometry/index_dev/boost/geometry/extensions/index/rtree/rtree.hpp
==============================================================================
--- sandbox-branches/geometry/index_dev/boost/geometry/extensions/index/rtree/rtree.hpp (original)
+++ sandbox-branches/geometry/index_dev/boost/geometry/extensions/index/rtree/rtree.hpp 2012-09-29 08:56:38 EDT (Sat, 29 Sep 2012)
@@ -30,6 +30,8 @@
#include <boost/geometry/extensions/index/rtree/node/node.hpp>
+#include <boost/geometry/extensions/index/rtree/node_proxy.hpp>
+
#include <boost/geometry/extensions/index/algorithms/is_valid.hpp>
#include <boost/geometry/extensions/index/rtree/visitors/insert.hpp>
@@ -47,8 +49,6 @@
namespace boost { namespace geometry { namespace index {
-
-
/*!
The R-tree spatial index. This is self-balancing spatial index capable to store various types
of Values and balancing algorithms.
@@ -78,22 +78,16 @@
{
BOOST_COPYABLE_AND_MOVABLE(rtree)
+ typedef node_proxy<Value, Parameters, Translator, Allocator> node_proxy_type;
+
public:
- typedef Value value_type;
- typedef Translator translator_type;
- typedef typename translator::indexable_type<Translator>::type indexable_type;
- typedef typename index::default_box_type<indexable_type>::type box_type;
-
- typedef typename detail::rtree::options_type<Parameters>::type options_type;
- typedef typename options_type::node_tag node_tag;
-
- typedef Allocator allocator_type;
- typedef detail::rtree::allocators<allocator_type, value_type, typename options_type::parameters_type, box_type, node_tag> allocators_type;
- typedef typename allocators_type::size_type size_type;
-
- typedef typename detail::rtree::node<value_type, typename options_type::parameters_type, box_type, allocators_type, node_tag>::type node;
- typedef typename detail::rtree::internal_node<value_type, typename options_type::parameters_type, box_type, allocators_type, node_tag>::type internal_node;
- typedef typename detail::rtree::leaf<value_type, typename options_type::parameters_type, box_type, allocators_type, node_tag>::type leaf;
+ typedef typename node_proxy_type::value_type value_type;
+ typedef typename node_proxy_type::translator_type translator_type;
+ typedef typename node_proxy_type::indexable_type indexable_type;
+ typedef typename node_proxy_type::box_type box_type;
+
+ typedef typename node_proxy_type::allocator_type allocator_type;
+ typedef typename node_proxy_type::size_type size_type size_type;
/*!
The constructor.
@@ -102,13 +96,11 @@
\param translator The translator object.
\param allocator The allocator object.
*/
- inline explicit rtree(Parameters parameters = Parameters(), translator_type const& translator = translator_type(), Allocator allocator = Allocator())
+ inline explicit rtree(Parameters parameters = Parameters(), translator_type const& translator = translator_type(), allocator_type allocator = allocator_type())
: m_values_count(0)
, m_root(0)
, m_leafs_level(0)
- , m_parameters(parameters)
- , m_translator(translator)
- , m_allocators(allocator)
+ , m_node_proxy(parameters, translator, allocator)
{
this->create();
}
@@ -127,9 +119,7 @@
: m_values_count(0)
, m_root(0)
, m_leafs_level(0)
- , m_parameters(parameters)
- , m_translator(translator)
- , m_allocators(allocator)
+ , m_node_proxy(parameters, translator, allocator)
{
this->create();
this->insert(first, last);
@@ -148,9 +138,7 @@
The copy constructor.
*/
inline rtree(rtree const& src)
- : m_parameters(src.m_parameters)
- , m_translator(src.m_translator)
- , m_allocators(src.m_allocators)
+ : m_node_proxy(src.m_node_proxy)
{
//TODO use Boost.Container allocator_traits_type::select_on_container_copy_construction()
@@ -169,9 +157,7 @@
The copy constructor.
*/
inline rtree(rtree const& src, Allocator const& allocator)
- : m_parameters(src.m_parameters)
- , m_translator(src.m_translator)
- , m_allocators(allocator)
+ : m_node_proxy(src.m_parameters, src.m_translator, allocator)
{
try
{
@@ -191,9 +177,7 @@
: m_values_count(src.m_values_count)
, m_root(src.m_root)
, m_leafs_level(src.m_leafs_level)
- , m_parameters(src.m_parameters)
- , m_translator(src.m_translator)
- , m_allocators(src.m_allocators)
+ , m_node_proxy(src.m_node_proxy)
{
src.m_values_count = 0;
src.m_root = 0;
@@ -213,9 +197,7 @@
if ( !this->empty() )
this->destroy(*this);
- m_parameters = src.m_parameters;
- m_translator = src.m_translator;
- //m_allocators = src.m_allocators;
+ m_node_proxy = src.m_node_proxy;
try
{
@@ -243,9 +225,7 @@
if ( !this->empty() )
this->destroy(*this);
- m_parameters = src.m_parameters;
- m_translator = src.m_translator;
- //m_allocators = src.m_allocators;
+ m_node_proxy = src.m_node_proxy;
if ( m_allocators.allocator == src.m_allocators.allocator)
{
@@ -279,21 +259,18 @@
*/
inline void insert(value_type const& value)
{
- BOOST_GEOMETRY_INDEX_ASSERT(index::is_valid(m_translator(value)), "Indexable is invalid");
+ BOOST_GEOMETRY_INDEX_ASSERT(index::is_valid(m_node_proxy.translate(value)), "Indexable is invalid");
try
{
detail::rtree::visitors::insert<
value_type,
value_type,
- options_type,
- translator_type,
- box_type,
- allocators_type,
+ node_proxy_type,
typename options_type::insert_tag
- > insert_v(m_root, m_leafs_level, value, m_parameters, m_translator, m_allocators);
+ > insert_v(m_root, m_leafs_level, value, m_node_proxy);
- detail::rtree::apply_visitor(insert_v, *m_root);
+ m_node_proxy.apply_visitor(insert_v, *m_root);
++m_values_count;
}
@@ -332,13 +309,10 @@
{
detail::rtree::visitors::remove<
value_type,
- options_type,
- translator_type,
- box_type,
- allocators_type
- > remove_v(m_root, m_leafs_level, value, m_parameters, m_translator, m_allocators);
+ node_proxy_type
+ > remove_v(m_root, m_leafs_level, value, m_node_proxy);
- detail::rtree::apply_visitor(remove_v, *m_root);
+ m_node_proxy.apply_visitor(remove_v, *m_root);
--m_values_count;
}
@@ -381,10 +355,10 @@
template <typename Predicates, typename OutIter>
inline size_type query(Predicates const& pred, OutIter out_it) const
{
- detail::rtree::visitors::query<value_type, options_type, translator_type, box_type, allocators_type, Predicates, OutIter>
- find_v(m_translator, pred, out_it);
+ detail::rtree::visitors::query<value_type, node_proxy_type, Predicates, OutIter>
+ find_v(m_node_proxy, pred, out_it);
- detail::rtree::apply_visitor(find_v, *m_root);
+ m_node_proxy.apply_visitor(find_v, *m_root);
return find_v.found_count;
}
@@ -541,10 +515,10 @@
return result;
}
- detail::rtree::visitors::children_box<value_type, options_type, translator_type, box_type, allocators_type>
- children_box_v(m_translator);
+ detail::rtree::visitors::children_box<value_type, node_proxy>
+ children_box_v(m_node_proxy);
- detail::rtree::apply_visitor(children_box_v, *m_root);
+ m_node_proxy.apply_visitor(children_box_v, *m_root);
return children_box_v.result;
}
@@ -559,7 +533,7 @@
template <typename Visitor>
inline void apply_visitor(Visitor & visitor) const
{
- detail::rtree::apply_visitor(visitor, *m_root);
+ m_node_proxy.apply_visitor(visitor, *m_root);
}
/*!
@@ -570,7 +544,7 @@
*/
inline translator_type const& translator() const
{
- return m_translator;
+ return m_node_proxy.m_translator;
}
/*!
@@ -603,7 +577,7 @@
{
assert(0 == m_root);
- m_root = detail::rtree::create_node<allocators_type, leaf>::apply(m_allocators);
+ m_root = m_node_proxy.template create_node<leaf>();
m_values_count = 0;
m_leafs_level = 0;
}
@@ -615,8 +589,11 @@
*/
inline void destroy(rtree & t)
{
- detail::rtree::visitors::destroy<value_type, options_type, translator_type, box_type, allocators_type> del_v(t.m_root, t.m_allocators);
- detail::rtree::apply_visitor(del_v, *t.m_root);
+ detail::rtree::visitors::destroy<
+ value_type,
+ node_proxy_type
+ > del_v(t.m_root, t.m_node_proxy);
+ m_node_proxy.apply_visitor(del_v, *t.m_root);
t.m_root = 0;
t.m_values_count = 0;
@@ -631,8 +608,11 @@
*/
inline void copy(rtree const& src, rtree & dst) const
{
- detail::rtree::visitors::copy<value_type, options_type, translator_type, box_type, allocators_type> copy_v(dst.m_allocators);
- detail::rtree::apply_visitor(copy_v, *src.m_root);
+ detail::rtree::visitors::copy<
+ value_type,
+ node_proxy_type
+ > copy_v(dst.m_node_proxy);
+ m_node_proxy.apply_visitor(copy_v, *src.m_root);
dst.m_root = copy_v.result;
dst.m_values_count = src.m_values_count;
@@ -650,7 +630,7 @@
typedef detail::rtree::visitors::nearest_one<
value_type,
- translator_type,
+ node_proxy_type,
point_type
> result_type;
@@ -658,16 +638,13 @@
detail::rtree::visitors::nearest<
value_type,
- options_type,
- translator_type,
- box_type,
- allocators_type,
+ node_proxy_type,
DistancesPredicates,
Predicates,
result_type
- > nearest_v(m_parameters, m_translator, dpred, pred, result);
+ > nearest_v(m_node_proxy, dpred, pred, result);
- detail::rtree::apply_visitor(nearest_v, *m_root);
+ m_node_proxy.apply_visitor(nearest_v, *m_root);
return result.get(v);
}
@@ -683,7 +660,7 @@
typedef detail::rtree::visitors::nearest_k<
value_type,
- translator_type,
+ node_proxy_type,
point_type
> result_type;
@@ -691,16 +668,13 @@
detail::rtree::visitors::nearest<
value_type,
- options_type,
- translator_type,
- box_type,
- allocators_type,
+ node_proxy_type,
DistancesPredicates,
Predicates,
result_type
- > nearest_v(m_parameters, m_translator, dpred, pred, result);
+ > nearest_v(m_node_proxy, dpred, pred, result);
- detail::rtree::apply_visitor(nearest_v, *m_root);
+ m_node_proxy.apply_visitor(nearest_v, *m_root);
return result.get(out_it);
}
@@ -709,9 +683,7 @@
node *m_root;
size_type m_leafs_level;
- Parameters m_parameters;
- translator_type m_translator;
- allocators_type m_allocators;
+ node_proxy_type m_node_proxy;
};
/*!
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk