From dd731e101a51250fe0767fbb3f06050ec654e3e4 Mon Sep 17 00:00:00 2001 From: Adam Wulkiewicz Date: Mon, 13 Jun 2011 00:26:38 +0000 Subject: [PATCH] simple Tag template parameter replaced by Algo traits containing tags of some number of algorithms. User now may use a combination of implemented algorithms or just use one of the predefined. [SVN r72562] --- .../geometry/extensions/index/rtree/algo.hpp | 45 +++++++++ .../extensions/index/rtree/filters.hpp | 2 +- .../extensions/index/rtree/linear/algo.hpp | 29 ++++++ .../extensions/index/rtree/linear/linear.hpp | 7 +- .../rtree/linear/redistribute_elements.hpp | 10 +- .../extensions/index/rtree/quadratic/algo.hpp | 29 ++++++ .../index/rtree/quadratic/quadratic.hpp | 7 +- .../rtree/quadratic/redistribute_elements.hpp | 22 ++--- .../extensions/index/rtree/rstar/algo.hpp | 31 ++++++ .../index/rtree/rstar/choose_next_node.hpp | 10 +- .../extensions/index/rtree/rstar/insert.hpp | 97 +++++++++---------- .../rtree/rstar/redistribute_elements.hpp | 10 +- .../extensions/index/rtree/rstar/rstar.hpp | 7 +- .../geometry/extensions/index/rtree/rtree.hpp | 31 +++--- .../index/rtree/visitors/are_boxes_ok.hpp | 18 ++-- .../index/rtree/visitors/are_levels_ok.hpp | 18 ++-- .../index/rtree/visitors/destroy.hpp | 8 +- .../extensions/index/rtree/visitors/find.hpp | 10 +- .../index/rtree/visitors/gl_draw.hpp | 24 ++--- .../index/rtree/visitors/insert.hpp | 46 +++++---- .../index/rtree/visitors/is_leaf.hpp | 8 +- .../extensions/index/rtree/visitors/print.hpp | 22 ++--- .../index/rtree/visitors/remove.hpp | 14 +-- tests/additional_sizes_and_times.cpp | 4 + tests/translators.hpp | 1 + 25 files changed, 322 insertions(+), 188 deletions(-) create mode 100644 include/boost/geometry/extensions/index/rtree/algo.hpp create mode 100644 include/boost/geometry/extensions/index/rtree/linear/algo.hpp create mode 100644 include/boost/geometry/extensions/index/rtree/quadratic/algo.hpp create mode 100644 include/boost/geometry/extensions/index/rtree/rstar/algo.hpp diff --git a/include/boost/geometry/extensions/index/rtree/algo.hpp b/include/boost/geometry/extensions/index/rtree/algo.hpp new file mode 100644 index 000000000..b3a8e83e8 --- /dev/null +++ b/include/boost/geometry/extensions/index/rtree/algo.hpp @@ -0,0 +1,45 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) +// +// Boost.SpatialIndex - rtree variants algorithms +// +// 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_RTREE_ALGO_HPP +#define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_ALGO_HPP + +namespace boost { namespace geometry { namespace index { + +struct default_tag {}; +struct analyze_area_tag {}; + +namespace detail { namespace rtree { + +template +struct algo +{ + typedef InsertTag insert_tag; + typedef ChooseNextNodeTag choose_next_node_tag; + typedef RedistributeTag redistribute_tag; + typedef NodeTag node_tag; +}; + +template +struct algo_type +{ + typedef void type; +}; + +template +struct algo_type< algo > +{ + typedef algo type; +}; + +}} // namespace detail::rtree + +}}} // namespace boost::geometry::index + +#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_ALGO_HPP diff --git a/include/boost/geometry/extensions/index/rtree/filters.hpp b/include/boost/geometry/extensions/index/rtree/filters.hpp index 1f3a610b4..5673cc504 100644 --- a/include/boost/geometry/extensions/index/rtree/filters.hpp +++ b/include/boost/geometry/extensions/index/rtree/filters.hpp @@ -20,7 +20,7 @@ namespace boost { namespace geometry { namespace index { -template +template class rtree; namespace filters { diff --git a/include/boost/geometry/extensions/index/rtree/linear/algo.hpp b/include/boost/geometry/extensions/index/rtree/linear/algo.hpp new file mode 100644 index 000000000..52b24da63 --- /dev/null +++ b/include/boost/geometry/extensions/index/rtree/linear/algo.hpp @@ -0,0 +1,29 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) +// +// Boost.SpatialIndex - rtree variants algorithms +// +// 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_RTREE_LINEAR_ALGO_HPP +#define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_LINEAR_ALGO_HPP + +namespace boost { namespace geometry { namespace index { + +struct linear_tag {}; + +namespace detail { namespace rtree { + +template <> +struct algo_type +{ + typedef algo type; +}; + +}} // namespace detail::rtree + +}}} // namespace boost::geometry::index + +#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_LINEAR_ALGO_HPP diff --git a/include/boost/geometry/extensions/index/rtree/linear/linear.hpp b/include/boost/geometry/extensions/index/rtree/linear/linear.hpp index 7bb7879c4..5850102f9 100644 --- a/include/boost/geometry/extensions/index/rtree/linear/linear.hpp +++ b/include/boost/geometry/extensions/index/rtree/linear/linear.hpp @@ -10,12 +10,7 @@ #ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_LINEAR_LINEAR_HPP #define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_LINEAR_LINEAR_HPP -namespace boost { namespace geometry { namespace index { - -struct linear_tag {}; - -}}} // namespace boost::geometry::index - +#include #include #endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_LINEAR_LINEAR_HPP diff --git a/include/boost/geometry/extensions/index/rtree/linear/redistribute_elements.hpp b/include/boost/geometry/extensions/index/rtree/linear/redistribute_elements.hpp index cdd9eacec..29812132f 100644 --- a/include/boost/geometry/extensions/index/rtree/linear/redistribute_elements.hpp +++ b/include/boost/geometry/extensions/index/rtree/linear/redistribute_elements.hpp @@ -172,12 +172,12 @@ struct pick_seeds // from void split_node(node_pointer const& n, node_pointer& n1, node_pointer& n2) const -template -struct redistribute_elements +template +struct redistribute_elements { - typedef typename rtree::node::type node; - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::type leaf; + typedef typename rtree::node::type node; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; template static inline void apply(Node & n, diff --git a/include/boost/geometry/extensions/index/rtree/quadratic/algo.hpp b/include/boost/geometry/extensions/index/rtree/quadratic/algo.hpp new file mode 100644 index 000000000..b27ad22a8 --- /dev/null +++ b/include/boost/geometry/extensions/index/rtree/quadratic/algo.hpp @@ -0,0 +1,29 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) +// +// Boost.SpatialIndex - rtree variants algorithms +// +// 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_RTREE_QUADRATIC_ALGO_HPP +#define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_QUADRATIC_ALGO_HPP + +namespace boost { namespace geometry { namespace index { + +struct quadratic_tag {}; + +namespace detail { namespace rtree { + +template <> +struct algo_type +{ + typedef algo type; +}; + +}} // namespace detail::rtree + +}}} // namespace boost::geometry::index + +#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_QUADRATIC_ALGO_HPP diff --git a/include/boost/geometry/extensions/index/rtree/quadratic/quadratic.hpp b/include/boost/geometry/extensions/index/rtree/quadratic/quadratic.hpp index fed52522e..6a236759a 100644 --- a/include/boost/geometry/extensions/index/rtree/quadratic/quadratic.hpp +++ b/include/boost/geometry/extensions/index/rtree/quadratic/quadratic.hpp @@ -10,12 +10,7 @@ #ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_QUADRATIC_QUADRATIC_HPP #define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_QUADRATIC_QUADRATIC_HPP -namespace boost { namespace geometry { namespace index { - -struct quadratic_tag {}; - -}}} // namespace boost::geometry::index - +#include #include #endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_QUADRATIC_QUADRATIC_HPP diff --git a/include/boost/geometry/extensions/index/rtree/quadratic/redistribute_elements.hpp b/include/boost/geometry/extensions/index/rtree/quadratic/redistribute_elements.hpp index 8d2b43d58..774b736d8 100644 --- a/include/boost/geometry/extensions/index/rtree/quadratic/redistribute_elements.hpp +++ b/include/boost/geometry/extensions/index/rtree/quadratic/redistribute_elements.hpp @@ -75,23 +75,23 @@ struct pick_seeds } // namespace quadratic -template -struct redistribute_elements +template +struct redistribute_elements { - typedef typename rtree::node::type node; - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::type leaf; + typedef typename rtree::node::type node; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; typedef typename index::default_area_result::type area_type; template static inline void apply(Node & n, - Node & second_node, - Box & box1, - Box & box2, - size_t min_elems, - size_t max_elems, - Translator const& tr) + Node & second_node, + Box & box1, + Box & box2, + size_t min_elems, + size_t max_elems, + Translator const& tr) { typedef typename rtree::elements_type::type elements_type; typedef typename elements_type::value_type element_type; diff --git a/include/boost/geometry/extensions/index/rtree/rstar/algo.hpp b/include/boost/geometry/extensions/index/rtree/rstar/algo.hpp new file mode 100644 index 000000000..20847c132 --- /dev/null +++ b/include/boost/geometry/extensions/index/rtree/rstar/algo.hpp @@ -0,0 +1,31 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) +// +// Boost.SpatialIndex - rtree variants algorithms +// +// 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_RTREE_RSTAR_ALGO_HPP +#define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RSTAR_ALGO_HPP + +namespace boost { namespace geometry { namespace index { + +struct with_reinsert_tag {}; +struct find_minimum_cost_tag {}; +struct rstar_tag {}; + +namespace detail { namespace rtree { + +template <> +struct algo_type +{ + typedef algo type; +}; + +}} // namespace detail::rtree + +}}} // namespace boost::geometry::index + +#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RSTAR_ALGO_HPP diff --git a/include/boost/geometry/extensions/index/rtree/rstar/choose_next_node.hpp b/include/boost/geometry/extensions/index/rtree/rstar/choose_next_node.hpp index eb34a346a..7778fe379 100644 --- a/include/boost/geometry/extensions/index/rtree/rstar/choose_next_node.hpp +++ b/include/boost/geometry/extensions/index/rtree/rstar/choose_next_node.hpp @@ -27,12 +27,12 @@ namespace detail { namespace rtree { namespace visitors { namespace detail { -template -class choose_next_node +template +class choose_next_node { - typedef typename rtree::node::type node; - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::type leaf; + typedef typename rtree::node::type node; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; typedef typename rtree::elements_type::type children_type; diff --git a/include/boost/geometry/extensions/index/rtree/rstar/insert.hpp b/include/boost/geometry/extensions/index/rtree/rstar/insert.hpp index 649956a74..d59c71e3d 100644 --- a/include/boost/geometry/extensions/index/rtree/rstar/insert.hpp +++ b/include/boost/geometry/extensions/index/rtree/rstar/insert.hpp @@ -25,23 +25,22 @@ namespace detail { namespace rstar { -template +template class remove_elements_to_reinsert { public: - typedef typename rtree::node::type node; - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::type leaf; + typedef typename rtree::node::type node; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; template - static inline void apply( - typename rtree::elements_type::type & result_elements, - Node & n, - internal_node *parent, - size_t current_child_index, - size_t min_elems, - size_t max_elems, - Translator const& tr) + static inline void apply(typename rtree::elements_type::type & result_elements, + Node & n, + internal_node *parent, + size_t current_child_index, + size_t min_elems, + size_t max_elems, + Translator const& tr) { typedef typename rtree::elements_type::type elements_type; typedef typename elements_type::value_type element_type; @@ -107,32 +106,32 @@ private: } }; -template +template struct level_insert_result_type { typedef typename rtree::elements_type< - typename rtree::internal_node::type + typename rtree::internal_node::type >::type type; }; -template -struct level_insert_result_type<0, Value, Value, Box> +template +struct level_insert_result_type<0, Value, Value, Algo, Box> { typedef typename rtree::elements_type< - typename rtree::leaf::type + typename rtree::leaf::type >::type type; }; -template +template struct level_insert_base - : public detail::insert + : public detail::insert { - typedef detail::insert base; + typedef detail::insert base; typedef typename base::node node; typedef typename base::internal_node internal_node; typedef typename base::leaf leaf; - typedef typename level_insert_result_type::type result_type; + typedef typename level_insert_result_type::type result_type; inline level_insert_base(node* & root, size_t & leafs_level, @@ -159,7 +158,7 @@ struct level_insert_base // node isn't root node if ( base::m_parent ) { - rstar::remove_elements_to_reinsert::apply( + rstar::remove_elements_to_reinsert::apply( result_elements, n, base::m_parent, base::m_current_child_index, base::m_min_elems_per_node, base::m_max_elems_per_node, base::m_tr); @@ -199,11 +198,11 @@ struct level_insert_base result_type result_elements; }; -template +template struct level_insert - : public level_insert_base + : public level_insert_base { - typedef level_insert_base base; + typedef level_insert_base base; typedef typename base::node node; typedef typename base::internal_node internal_node; typedef typename base::leaf leaf; @@ -268,11 +267,11 @@ struct level_insert } }; -template -struct level_insert - : public level_insert_base +template +struct level_insert + : public level_insert_base { - typedef level_insert_base base; + typedef level_insert_base base; typedef typename base::node node; typedef typename base::internal_node internal_node; typedef typename base::leaf leaf; @@ -319,11 +318,11 @@ struct level_insert } }; -template -struct level_insert<0, Value, Value, Translator, Box> - : public level_insert_base<0, Value, Value, Translator, Box> +template +struct level_insert<0, Value, Value, Algo, Translator, Box> + : public level_insert_base<0, Value, Value, Algo, Translator, Box> { - typedef level_insert_base<0, Value, Value, Translator, Box> base; + typedef level_insert_base<0, Value, Value, Algo, Translator, Box> base; typedef typename base::node node; typedef typename base::internal_node internal_node; typedef typename base::leaf leaf; @@ -366,13 +365,13 @@ struct level_insert<0, Value, Value, Translator, Box> }; // R*-tree insert visitor -template -class insert : public rtree::visitor::type +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; + 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, @@ -392,7 +391,7 @@ public: { typedef typename elements_type::type elements_type; - rstar::level_insert<0, Element, Value, Translator, Box> lins_v( + rstar::level_insert<0, Element, Value, Algo, 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); @@ -405,7 +404,7 @@ public: inline void operator()(leaf & n) { - rstar::level_insert<0, Element, Value, Translator, Box> lins_v( + rstar::level_insert<0, Element, Value, Algo, 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); @@ -424,7 +423,7 @@ protected: for ( typename Elements::const_reverse_iterator it = elements.rbegin(); it != elements.rend(); ++it) { - rstar::level_insert<1, element_type, Value, Translator, Box> lins_v( + rstar::level_insert<1, element_type, Value, Algo, 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); @@ -453,11 +452,11 @@ protected: } // namespace detail // R*-tree insert visitor -template -class insert - : public detail::rstar::insert +template +class insert + : public detail::rstar::insert { - typedef detail::rstar::insert base; + typedef detail::rstar::insert base; typedef typename base::node node; public: @@ -474,11 +473,11 @@ public: }; // R*-tree insert visitor -template -class insert - : public detail::rstar::insert +template +class insert + : public detail::rstar::insert { - typedef detail::rstar::insert base; + typedef detail::rstar::insert base; typedef typename base::node node; public: diff --git a/include/boost/geometry/extensions/index/rtree/rstar/redistribute_elements.hpp b/include/boost/geometry/extensions/index/rtree/rstar/redistribute_elements.hpp index 574704ee9..7619a0366 100644 --- a/include/boost/geometry/extensions/index/rtree/rstar/redistribute_elements.hpp +++ b/include/boost/geometry/extensions/index/rtree/rstar/redistribute_elements.hpp @@ -311,12 +311,12 @@ struct partial_sort } // namespace rstar -template -struct redistribute_elements +template +struct redistribute_elements { - typedef typename rtree::node::type node; - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::type leaf; + typedef typename rtree::node::type node; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; static const size_t dimension = index::traits::dimension::value; diff --git a/include/boost/geometry/extensions/index/rtree/rstar/rstar.hpp b/include/boost/geometry/extensions/index/rtree/rstar/rstar.hpp index a8878636a..4e435de1f 100644 --- a/include/boost/geometry/extensions/index/rtree/rstar/rstar.hpp +++ b/include/boost/geometry/extensions/index/rtree/rstar/rstar.hpp @@ -10,12 +10,7 @@ #ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RSTAR_RSTAR_HPP #define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RSTAR_RSTAR_HPP -namespace boost { namespace geometry { namespace index { - -struct rstar_tag {}; - -}}} // namespace boost::geometry::index - +#include #include #include #include diff --git a/include/boost/geometry/extensions/index/rtree/rtree.hpp b/include/boost/geometry/extensions/index/rtree/rtree.hpp index 66b536330..87fa0c6b9 100644 --- a/include/boost/geometry/extensions/index/rtree/rtree.hpp +++ b/include/boost/geometry/extensions/index/rtree/rtree.hpp @@ -16,6 +16,7 @@ #include +#include #include #include @@ -33,7 +34,7 @@ namespace boost { namespace geometry { namespace index { template < typename Value, - typename Tag = linear_tag, + typename Algo = linear_tag, typename Translator = translator::def > class rtree @@ -43,11 +44,13 @@ public: typedef Translator translator_type; typedef typename translator_type::indexable_type indexable_type; typedef typename index::default_box_type::type box_type; - typedef Tag tag_type; + + typedef typename detail::rtree::algo_type::type algo_type; + typedef typename algo_type::node_tag node_tag; - typedef typename detail::rtree::node::type node; - typedef typename detail::rtree::internal_node::type internal_node; - typedef typename detail::rtree::leaf::type leaf; + typedef typename detail::rtree::node::type node; + typedef typename detail::rtree::internal_node::type internal_node; + typedef typename detail::rtree::leaf::type leaf; inline explicit rtree( size_t max_elems_per_node = 4, @@ -71,7 +74,7 @@ public: ~rtree() { - detail::rtree::visitors::destroy del_v; + detail::rtree::visitors::destroy del_v; detail::rtree::apply_visitor(del_v, *m_root); } @@ -80,7 +83,7 @@ public: template inline void find(Geometry const& geom, OutIter out_it) const { - detail::rtree::visitors::find + detail::rtree::visitors::find find_v(m_translator, geom, out_it); detail::rtree::apply_visitor(find_v, *m_root); @@ -90,7 +93,7 @@ public: { // TODO: awulkiew - assert for correct value - detail::rtree::visitors::insert + detail::rtree::visitors::insert insert_v(m_root, m_leafs_level, value, m_min_elems_per_node, m_max_elems_per_node, m_translator); detail::rtree::apply_visitor(insert_v, *m_root); @@ -103,7 +106,7 @@ public: // TODO: awulkiew - assert for correct value assert(0 < m_values_count); - detail::rtree::visitors::remove + detail::rtree::visitors::remove remove_v(m_root, m_leafs_level, value, m_min_elems_per_node, m_max_elems_per_node, m_translator); detail::rtree::apply_visitor(remove_v, *m_root); @@ -153,18 +156,18 @@ private: translator_type m_translator; }; -template -void insert(rtree & tree, Value const& v) +template +void insert(rtree & tree, Value const& v) { tree.insert(v); } -template -void remove(rtree & tree, Value const& v) +template +void remove(rtree & tree, Value const& v) { tree.remove(v); } }}} // namespace boost::geometry::index -#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RSTREE_RSTREE_HPP +#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RTREE_HPP diff --git a/include/boost/geometry/extensions/index/rtree/visitors/are_boxes_ok.hpp b/include/boost/geometry/extensions/index/rtree/visitors/are_boxes_ok.hpp index 0154198ed..ac4b7a903 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/are_boxes_ok.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/are_boxes_ok.hpp @@ -17,11 +17,11 @@ namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace visitors { -template -class are_boxes_ok : public rtree::visitor::type +template +class are_boxes_ok : public rtree::visitor::type { - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::type leaf; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; public: inline are_boxes_ok(Translator const& tr) @@ -107,15 +107,15 @@ private: }}} // namespace detail::rtree::visitors -template -bool are_boxes_ok(rtree const& tree) +template +bool are_boxes_ok(rtree const& tree) { - typedef rtree rt; + typedef rtree rt; detail::rtree::visitors::are_boxes_ok< typename rt::value_type, + typename rt::algo_type, typename rt::translator_type, - typename rt::box_type, - typename rt::tag_type> v(tree.get_translator()); + typename rt::box_type> v(tree.get_translator()); tree.apply_visitor(v); diff --git a/include/boost/geometry/extensions/index/rtree/visitors/are_levels_ok.hpp b/include/boost/geometry/extensions/index/rtree/visitors/are_levels_ok.hpp index 8c00b9612..e8ed8bf51 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/are_levels_ok.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/are_levels_ok.hpp @@ -16,11 +16,11 @@ namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace visitors { -template -class are_levels_ok : public rtree::visitor::type +template +class are_levels_ok : public rtree::visitor::type { - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::type leaf; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; public: inline are_levels_ok(Translator const& tr) @@ -85,15 +85,15 @@ private: }}} // namespace detail::rtree::visitors -template -bool are_levels_ok(rtree const& tree) +template +bool are_levels_ok(rtree const& tree) { - typedef rtree rt; + typedef rtree rt; detail::rtree::visitors::are_levels_ok< typename rt::value_type, + typename rt::algo_type, typename rt::translator_type, - typename rt::box_type, - typename rt::tag_type> v(tree.get_translator()); + typename rt::box_type> v(tree.get_translator()); tree.apply_visitor(v); diff --git a/include/boost/geometry/extensions/index/rtree/visitors/destroy.hpp b/include/boost/geometry/extensions/index/rtree/visitors/destroy.hpp index 111d82352..19d7ee0bf 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/destroy.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/destroy.hpp @@ -16,11 +16,11 @@ namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace visitors { -template -struct destroy : public rtree::visitor::type +template +struct destroy : public rtree::visitor::type { - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::type leaf; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; inline void operator()(internal_node & n) { diff --git a/include/boost/geometry/extensions/index/rtree/visitors/find.hpp b/include/boost/geometry/extensions/index/rtree/visitors/find.hpp index e3c88abdb..9b4a9b046 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/find.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/find.hpp @@ -142,12 +142,12 @@ namespace detail { namespace rtree { namespace visitors { // rtree spatial query visitor -template -struct find : public rtree::visitor::type +template +struct find : public rtree::visitor::type { - typedef typename rtree::node::type node; - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::type leaf; + typedef typename rtree::node::type node; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; inline find(Translator const& t, Geometry const& g, OutIter out_it) : tr(t), geom(g), out_iter(out_it) diff --git a/include/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp b/include/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp index 38278e4bc..dacb3523a 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp @@ -94,11 +94,11 @@ inline void gl_draw_indexable(Indexable const& i, typename index::traits::coordi } // namespace detail -template -struct gl_draw : public rtree::visitor::type +template +struct gl_draw : public rtree::visitor::type { - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::type leaf; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; inline gl_draw(Translator const& t, size_t level_first = 0, @@ -187,23 +187,23 @@ struct gl_draw : public rtree::visitor::type }}} // namespace detail::rtree::visitors -template -void gl_draw(rtree const& tree, +template +void gl_draw(rtree const& tree, size_t level_first = 0, size_t level_last = std::numeric_limits::max(), typename index::traits::coordinate_type< - typename rtree::box_type + typename rtree::box_type >::type z_coord_level_multiplier = 1 ) { - typedef typename rtree::value_type value_type; - typedef typename rtree::translator_type translator_type; - typedef typename rtree::box_type box_type; - typedef typename rtree::tag_type tag_type; + typedef typename rtree::value_type value_type; + typedef typename rtree::algo_type algo_type; + typedef typename rtree::translator_type translator_type; + typedef typename rtree::box_type box_type; glClear(GL_COLOR_BUFFER_BIT); - detail::rtree::visitors::gl_draw + detail::rtree::visitors::gl_draw gl_draw_v(tree.get_translator(), level_first, level_last, z_coord_level_multiplier); tree.apply_visitor(gl_draw_v); diff --git a/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp b/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp index 9f45eab0d..0af63db5b 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp @@ -21,12 +21,15 @@ namespace detail { namespace rtree { namespace visitors { namespace detail { // Default choose_next_node -template -struct choose_next_node +template +struct choose_next_node; + +template +struct choose_next_node { - typedef typename rtree::node::type node; - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::type leaf; + typedef typename rtree::node::type node; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; typedef typename rtree::elements_type::type children_type; @@ -75,17 +78,17 @@ struct choose_next_node }; // Not implemented here -template +template struct redistribute_elements; // Default insert visitor -template -class insert : public rtree::visitor::type +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; + typedef typename rtree::node::type node; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; inline insert(node* & root, size_t & leafs_level, @@ -117,7 +120,7 @@ protected: inline void traverse(Visitor & visitor, internal_node & n) { // choose next node - size_t choosen_node_index = detail::choose_next_node:: + size_t choosen_node_index = detail::choose_next_node:: apply(n, rtree::element_indexable(m_element, m_tr), m_leafs_level - m_current_level); // expand the node to contain value @@ -175,7 +178,7 @@ protected: // redistribute elements Box box1, box2; - redistribute_elements:: + redistribute_elements:: apply(n, n2, box1, box2, m_min_elems_per_node, m_max_elems_per_node, m_tr); // check numbers of elements @@ -224,11 +227,15 @@ protected: } // namespace detail +template +struct insert; + // Default insert visitor -template -struct insert : public detail::insert +template +struct insert + : public detail::insert { - typedef detail::insert base; + typedef detail::insert base; typedef typename base::node node; typedef typename base::internal_node internal_node; typedef typename base::leaf leaf; @@ -271,10 +278,11 @@ struct insert : public detail::insert }; // Default insert visitor specialized for Values elements -template -struct insert : public detail::insert +template +struct insert + : public detail::insert { - typedef detail::insert base; + typedef detail::insert base; typedef typename base::node node; typedef typename base::internal_node internal_node; typedef typename base::leaf leaf; diff --git a/include/boost/geometry/extensions/index/rtree/visitors/is_leaf.hpp b/include/boost/geometry/extensions/index/rtree/visitors/is_leaf.hpp index e637ae6fb..2d3b8ca8f 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/is_leaf.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/is_leaf.hpp @@ -16,11 +16,11 @@ namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace visitors { -template -struct is_leaf : public rtree::visitor::type +template +struct is_leaf : public rtree::visitor::type { - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::type leaf; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; inline void operator()(internal_node const&) { diff --git a/include/boost/geometry/extensions/index/rtree/visitors/print.hpp b/include/boost/geometry/extensions/index/rtree/visitors/print.hpp index 933b86851..1b83eae23 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/print.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/print.hpp @@ -113,11 +113,11 @@ inline void print_indexable(std::ostream & os, Indexable const& i) } // namespace detail -template -struct print : public rtree::visitor::type +template +struct print : public rtree::visitor::type { - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::type leaf; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; inline print(std::ostream & o, Translator const& t) : os(o), tr(t), level(0) @@ -180,14 +180,14 @@ struct print : public rtree::visitor::type }}} // namespace detail::rtree::visitors -template -std::ostream & operator<<(std::ostream & os, rtree const& tree) +template +std::ostream & operator<<(std::ostream & os, rtree const& tree) { - typedef typename rtree::value_type value_type; - typedef typename rtree::translator_type translator_type; - typedef typename rtree::box_type box_type; - typedef typename rtree::tag_type tag_type; - detail::rtree::visitors::print print_v(os, tree.get_translator()); + typedef typename rtree::value_type value_type; + typedef typename rtree::algo_type algo_type; + typedef typename rtree::translator_type translator_type; + typedef typename rtree::box_type box_type; + detail::rtree::visitors::print print_v(os, tree.get_translator()); tree.apply_visitor(print_v); return os; } diff --git a/include/boost/geometry/extensions/index/rtree/visitors/remove.hpp b/include/boost/geometry/extensions/index/rtree/visitors/remove.hpp index a7e777e11..d1d8b7354 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/remove.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/remove.hpp @@ -21,12 +21,12 @@ namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace visitors { // Default remove algorithm -template -class remove : public rtree::visitor::type +template +class remove : public rtree::visitor::type { - typedef typename rtree::node::type node; - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::type leaf; + typedef typename rtree::node::type node; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; public: inline remove(node* & root, @@ -115,7 +115,7 @@ public: for ( typename std::vector< std::pair >::reverse_iterator it = m_underflowed_nodes.rbegin(); it != m_underflowed_nodes.rend() ; ++it ) { - is_leaf ilv; + is_leaf ilv; rtree::apply_visitor(ilv, *it->second); if ( ilv.result ) reinsert_elements(rtree::get(*it->second), it->first); @@ -193,7 +193,7 @@ private: for ( typename elements_type::iterator it = elements.begin(); it != elements.end() ; ++it ) { - visitors::insert insert_v( + visitors::insert insert_v( m_root_node, m_leafs_level, *it, diff --git a/tests/additional_sizes_and_times.cpp b/tests/additional_sizes_and_times.cpp index d93387440..1d4a9e32c 100644 --- a/tests/additional_sizes_and_times.cpp +++ b/tests/additional_sizes_and_times.cpp @@ -32,6 +32,10 @@ int main() //typedef bgi::rtree, bgi::linear_tag> RT; //typedef bgi::rtree, bgi::quadratic_tag> RT; typedef bgi::rtree, bgi::rstar_tag> RT; + /*typedef bgi::rtree< + std::pair, + bgi::detail::rtree::algo + > RT;*/ // load config file std::ifstream file_cfg("config.txt"); diff --git a/tests/translators.hpp b/tests/translators.hpp index f53681c8c..ab5abceac 100644 --- a/tests/translators.hpp +++ b/tests/translators.hpp @@ -2,6 +2,7 @@ #define TESTS_TRANSLATORS_HPP #include +#include #include #include