translator::getter added + some cleanup e.g. in /rstar/insert.hpp visitors::insert replaced by detail::rstar::insert.

[SVN r72573]
This commit is contained in:
Adam Wulkiewicz
2011-06-13 21:04:55 +00:00
parent 7ae26e7c0f
commit 7a36d65bab
6 changed files with 142 additions and 119 deletions

View File

@@ -364,89 +364,6 @@ struct level_insert<0, Value, Value, Options, Translator, Box>
}
};
// R*-tree insert visitor
template <typename Element, typename Value, typename Options, typename Translator, typename Box>
class insert : public rtree::visitor<Value, Box, typename Options::node_tag, false>::type
{
protected:
typedef typename rtree::node<Value, Box, typename Options::node_tag>::type node;
typedef typename rtree::internal_node<Value, Box, typename Options::node_tag>::type internal_node;
typedef typename rtree::leaf<Value, Box, typename Options::node_tag>::type leaf;
public:
inline insert(node* & root,
size_t & leafs_level,
Element const& element,
size_t min_elements,
size_t max_elements,
Translator const& tr,
size_t relative_level = 0
)
: m_root(root), m_leafs_level(leafs_level), m_element(element)
, m_min_elements(min_elements), m_max_elements(max_elements)
, m_tr(tr), m_relative_level(relative_level)
{}
inline void operator()(internal_node & n)
{
typedef typename elements_type<internal_node>::type elements_type;
rstar::level_insert<0, Element, Value, Options, Translator, Box> lins_v(
m_root, m_leafs_level, m_element, m_min_elements, m_max_elements, m_tr, m_relative_level);
rtree::apply_visitor(lins_v, n);
if ( !lins_v.result_elements.empty() )
{
recursive_reinsert(lins_v.result_elements, lins_v.result_relative_level);
}
}
inline void operator()(leaf & n)
{
rstar::level_insert<0, Element, Value, Options, Translator, Box> lins_v(
m_root, m_leafs_level, m_element, m_min_elements, m_max_elements, m_tr, m_relative_level);
rtree::apply_visitor(lins_v, n);
// we're in the root, so root should be split and there should be no elements to reinsert
assert(lins_v.result_elements.empty());
}
protected:
template <typename Elements>
inline void recursive_reinsert(Elements const& elements, size_t relative_level)
{
typedef typename Elements::value_type element_type;
// reinsert children starting from the minimum distance
for ( typename Elements::const_reverse_iterator it = elements.rbegin();
it != elements.rend(); ++it)
{
rstar::level_insert<1, element_type, Value, Options, Translator, Box> lins_v(
m_root, m_leafs_level, *it, m_min_elements, m_max_elements, m_tr, relative_level);
rtree::apply_visitor(lins_v, *m_root);
assert(relative_level + 1 == lins_v.result_relative_level);
// non-root relative level
if ( lins_v.result_relative_level < m_leafs_level && !lins_v.result_elements.empty())
{
recursive_reinsert(lins_v.result_elements, lins_v.result_relative_level);
}
}
}
node* & m_root;
size_t & m_leafs_level;
Element const& m_element;
size_t m_min_elements;
size_t m_max_elements;
Translator const& m_tr;
size_t m_relative_level;
};
} // namespace rstar
} // namespace detail
@@ -454,43 +371,84 @@ protected:
// R*-tree insert visitor
template <typename Element, typename Value, typename Options, typename Translator, typename Box>
class insert<Element, Value, Options, Translator, Box, reinsert_tag>
: public detail::rstar::insert<Element, Value, Options, Translator, Box>
: public rtree::visitor<Value, Box, typename Options::node_tag, false>::type
{
typedef detail::rstar::insert<Element, Value, Options, Translator, Box> base;
typedef typename base::node node;
private:
typedef typename rtree::node<Value, Box, typename Options::node_tag>::type node;
typedef typename rtree::internal_node<Value, Box, typename Options::node_tag>::type internal_node;
typedef typename rtree::leaf<Value, Box, typename Options::node_tag>::type leaf;
public:
inline insert(node* & root,
size_t & leafs_level,
Element const& element,
size_t min_elements,
size_t max_elements,
Translator const& tr,
size_t relative_level = 0
)
: base(root, leafs_level, element, min_elements, max_elements, tr, relative_level)
{}
};
inline insert(node* & root,
size_t & leafs_level,
Element const& element,
size_t min_elements,
size_t max_elements,
Translator const& tr,
size_t relative_level = 0)
: m_root(root), m_leafs_level(leafs_level), m_element(element)
, m_min_elements(min_elements), m_max_elements(max_elements)
, m_tr(tr), m_relative_level(relative_level)
{}
// R*-tree insert visitor
template <typename Value, typename Options, typename Translator, typename Box>
class insert<Value, Value, Options, Translator, Box, reinsert_tag>
: public detail::rstar::insert<Value, Value, Options, Translator, Box>
{
typedef detail::rstar::insert<Value, Value, Options, Translator, Box> base;
typedef typename base::node node;
inline void operator()(internal_node & n)
{
typedef typename elements_type<internal_node>::type elements_type;
public:
inline insert(node* & root,
size_t & leafs_level,
Value const& element,
size_t min_elements,
size_t max_elements,
Translator const& tr,
size_t relative_level = 0
)
: base(root, leafs_level, element, min_elements, max_elements, tr, relative_level)
{}
detail::rstar::level_insert<0, Element, Value, Options, Translator, Box> lins_v(
m_root, m_leafs_level, m_element, m_min_elements, m_max_elements, m_tr, m_relative_level);
rtree::apply_visitor(lins_v, n);
if ( !lins_v.result_elements.empty() )
{
recursive_reinsert(lins_v.result_elements, lins_v.result_relative_level);
}
}
inline void operator()(leaf & n)
{
detail::rstar::level_insert<0, Element, Value, Options, Translator, Box> lins_v(
m_root, m_leafs_level, m_element, m_min_elements, m_max_elements, m_tr, m_relative_level);
rtree::apply_visitor(lins_v, n);
// we're in the root, so root should be split and there should be no elements to reinsert
assert(lins_v.result_elements.empty());
}
private:
template <typename Elements>
inline void recursive_reinsert(Elements const& elements, size_t relative_level)
{
typedef typename Elements::value_type element_type;
// reinsert children starting from the minimum distance
for ( typename Elements::const_reverse_iterator it = elements.rbegin();
it != elements.rend(); ++it)
{
detail::rstar::level_insert<1, element_type, Value, Options, Translator, Box> lins_v(
m_root, m_leafs_level, *it, m_min_elements, m_max_elements, m_tr, relative_level);
rtree::apply_visitor(lins_v, *m_root);
assert(relative_level + 1 == lins_v.result_relative_level);
// non-root relative level
if ( lins_v.result_relative_level < m_leafs_level && !lins_v.result_elements.empty())
{
recursive_reinsert(lins_v.result_elements, lins_v.result_relative_level);
}
}
}
node* & m_root;
size_t & m_leafs_level;
Element const& m_element;
size_t m_min_elements;
size_t m_max_elements;
Translator const& m_tr;
size_t m_relative_level;
};
}}} // namespace detail::rtree::visitors

View File

@@ -14,7 +14,7 @@
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/extensions/index/translator/def.hpp>
#include <boost/geometry/extensions/index/translator/translator.hpp>
#include <boost/geometry/extensions/index/rtree/options.hpp>
#include <boost/geometry/extensions/index/rtree/filters.hpp>

View File

@@ -227,10 +227,11 @@ protected:
} // namespace detail
// Insert visitor forward declaration
template <typename Element, typename Value, typename Options, typename Translator, typename Box, typename InsertTag>
struct insert;
// Default insert visitor
// Default insert visitor used for nodes elements
template <typename Element, typename Value, typename Options, typename Translator, typename Box>
struct insert<Element, Value, Options, Translator, Box, insert_tag>
: public detail::insert<Element, Value, Options, Translator, Box>

View File

@@ -0,0 +1,33 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
//
// Boost.SpatialIndex - value to bounding object translation as a getter (object's member function)
//
// Copyright 2011 Adam Wulkiewicz.
// 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_TRANSLATOR_GETTER_HPP
#define BOOST_GEOMETRY_EXTENSIONS_INDEX_TRANSLATOR_GETTER_HPP
namespace boost { namespace geometry { namespace index { namespace translator {
template <typename Value, typename Indexable, Indexable const& (Value::*Getter)() const>
struct getter
{
typedef Indexable indexable_type;
indexable_type const& operator()(Value const& v) const
{
return (v.*Getter)();
}
bool equals(Value const& v1, Value const& v2) const
{
return geometry::equals(operator()(v1), operator()(v2));
}
};
}}}} // namespace boost::geometry::index::translator
#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_TRANSLATOR_GETTER_HPP

View File

@@ -0,0 +1,17 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
//
// Boost.SpatialIndex - translators
//
// Copyright 2011 Adam Wulkiewicz.
// 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_TRANSLATOR_TRANSLATOR_HPP
#define BOOST_GEOMETRY_EXTENSIONS_INDEX_TRANSLATOR_TRANSLATOR_HPP
#include <boost/geometry/extensions/index/translator/def.hpp>
#include <boost/geometry/extensions/index/translator/index.hpp>
#include <boost/geometry/extensions/index/translator/getter.hpp>
#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_TRANSLATOR_TRANSLATOR_HPP

View File

@@ -5,8 +5,7 @@
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/extensions/index/rtree/rtree.hpp>
#include <boost/geometry/extensions/index/translator/def.hpp>
#include <boost/geometry/extensions/index/translator/index.hpp>
#include <boost/geometry/extensions/index/translator/translator.hpp>
#include <vector>
#include <map>
@@ -14,6 +13,17 @@
#include <boost/shared_ptr.hpp>
#include <boost/scoped_ptr.hpp>
template <typename Indexable>
struct tests_translators_val
{
Indexable const& get_box() const
{
return i;
}
Indexable i;
};
void tests_translators_hpp()
{
std::cout << "tests/translators.hpp\n";
@@ -68,6 +78,10 @@ void tests_translators_hpp()
B tmp_b;
tmp_b = d( std::pair<model::polygon<P>, B>() );
tmp_b = dd( std::pair<B, model::polygon<P> >() );
tests_translators_val<P> val_p;
index::translator::getter<tests_translators_val<P>, P, &tests_translators_val<P>::get_box> tr_get_p;
tmp_p = tr_get_p(val_p);
}
#endif // TESTS_TRANSLATORS_HPP