From 7a36d65bab9abc8864dfbd9dae62087ca15ce3a5 Mon Sep 17 00:00:00 2001 From: Adam Wulkiewicz Date: Mon, 13 Jun 2011 21:04:55 +0000 Subject: [PATCH] translator::getter added + some cleanup e.g. in /rstar/insert.hpp visitors::insert replaced by detail::rstar::insert. [SVN r72573] --- .../extensions/index/rtree/rstar/insert.hpp | 188 +++++++----------- .../geometry/extensions/index/rtree/rtree.hpp | 2 +- .../index/rtree/visitors/insert.hpp | 3 +- .../extensions/index/translator/getter.hpp | 33 +++ .../index/translator/translator.hpp | 17 ++ tests/translators.hpp | 18 +- 6 files changed, 142 insertions(+), 119 deletions(-) create mode 100644 include/boost/geometry/extensions/index/translator/getter.hpp create mode 100644 include/boost/geometry/extensions/index/translator/translator.hpp diff --git a/include/boost/geometry/extensions/index/rtree/rstar/insert.hpp b/include/boost/geometry/extensions/index/rtree/rstar/insert.hpp index b361815f6..ac2d74739 100644 --- a/include/boost/geometry/extensions/index/rtree/rstar/insert.hpp +++ b/include/boost/geometry/extensions/index/rtree/rstar/insert.hpp @@ -364,89 +364,6 @@ struct level_insert<0, Value, Value, Options, Translator, Box> } }; -// R*-tree insert visitor -template -class insert : public rtree::visitor::type -{ -protected: - typedef typename rtree::node::type node; - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::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::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 - 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 class insert - : public detail::rstar::insert + : public rtree::visitor::type { - typedef detail::rstar::insert base; - typedef typename base::node node; +private: + typedef typename rtree::node::type node; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::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 -class insert - : public detail::rstar::insert -{ - typedef detail::rstar::insert base; - typedef typename base::node node; + inline void operator()(internal_node & n) + { + typedef typename elements_type::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 + 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 diff --git a/include/boost/geometry/extensions/index/rtree/rtree.hpp b/include/boost/geometry/extensions/index/rtree/rtree.hpp index 125b4ed9c..b7499918c 100644 --- a/include/boost/geometry/extensions/index/rtree/rtree.hpp +++ b/include/boost/geometry/extensions/index/rtree/rtree.hpp @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include diff --git a/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp b/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp index 246bc09e7..8c2e180fc 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp @@ -227,10 +227,11 @@ protected: } // namespace detail +// Insert visitor forward declaration template struct insert; -// Default insert visitor +// Default insert visitor used for nodes elements template struct insert : public detail::insert diff --git a/include/boost/geometry/extensions/index/translator/getter.hpp b/include/boost/geometry/extensions/index/translator/getter.hpp new file mode 100644 index 000000000..a3cacdfea --- /dev/null +++ b/include/boost/geometry/extensions/index/translator/getter.hpp @@ -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 +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 diff --git a/include/boost/geometry/extensions/index/translator/translator.hpp b/include/boost/geometry/extensions/index/translator/translator.hpp new file mode 100644 index 000000000..349e394f1 --- /dev/null +++ b/include/boost/geometry/extensions/index/translator/translator.hpp @@ -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 +#include +#include + +#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_TRANSLATOR_TRANSLATOR_HPP diff --git a/tests/translators.hpp b/tests/translators.hpp index ab5abceac..929499f4e 100644 --- a/tests/translators.hpp +++ b/tests/translators.hpp @@ -5,8 +5,7 @@ #include #include -#include -#include +#include #include #include @@ -14,6 +13,17 @@ #include #include +template +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, B>() ); tmp_b = dd( std::pair >() ); + + tests_translators_val

val_p; + index::translator::getter, P, &tests_translators_val

::get_box> tr_get_p; + tmp_p = tr_get_p(val_p); } #endif // TESTS_TRANSLATORS_HPP