diff --git a/include/boost/geometry/extensions/index/rtree/linear/linear.hpp b/include/boost/geometry/extensions/index/rtree/linear/linear.hpp index 67e0a5e8d..7bb7879c4 100644 --- a/include/boost/geometry/extensions/index/rtree/linear/linear.hpp +++ b/include/boost/geometry/extensions/index/rtree/linear/linear.hpp @@ -16,9 +16,6 @@ struct linear_tag {}; }}} // namespace boost::geometry::index -//TEST -// TODO - #include #endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_LINEAR_LINEAR_HPP diff --git a/include/boost/geometry/extensions/index/rtree/node.hpp b/include/boost/geometry/extensions/index/rtree/node.hpp index 95cafd568..a151134b5 100644 --- a/include/boost/geometry/extensions/index/rtree/node.hpp +++ b/include/boost/geometry/extensions/index/rtree/node.hpp @@ -30,16 +30,16 @@ struct internal_node_def Box, typename node::type * > - > children_type; + > elements_type; - children_type children; + elements_type elements; }; template struct leaf_def { - typedef std::vector values_type; - values_type values; + typedef std::vector elements_type; + elements_type elements; }; // nodes traits @@ -73,18 +73,6 @@ struct elements_type typedef typename Node::elements_type type; }; -template -struct elements_type< internal_node_def > -{ - typedef typename internal_node_def::children_type type; -}; - -template -struct elements_type< leaf_def > -{ - typedef typename leaf_def::values_type type; -}; - template typename elements_type::type & elements_get(Node & n) @@ -92,18 +80,11 @@ elements_get(Node & n) return n.elements; } -template -typename internal_node_def::children_type & -elements_get(internal_node_def & n) +template +typename elements_type::type const& +elements_get(Node const& n) { - return n.children; -} - -template -typename leaf_def::values_type & -elements_get(leaf_def & n) -{ - return n.values; + return n.elements; } //template 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 af242e945..e87a16d55 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 @@ -30,7 +30,10 @@ public: inline bool operator()(internal_node const& n) { - if (n.children.empty()) + typedef typename rtree::elements_type::type elements_type; + elements_type const& elements = rtree::elements_get(n); + + if (elements.empty()) return false; Box box_bckup = m_box; @@ -38,8 +41,8 @@ public: m_is_root = false; - for ( internal_node::children_type::const_iterator it = n.children.begin(); - it != n.children.end() ; ++it) + for ( typename elements_type::const_iterator it = elements.begin(); + it != elements.end() ; ++it) { m_box = it->first; @@ -51,9 +54,9 @@ public: m_is_root = is_root_bckup; Box result; - geometry::convert(n.children.front().first, result); - for(internal_node::children_type::const_iterator it = n.children.begin() + 1; - it != n.children.end() ; ++it) + geometry::convert(elements.front().first, result); + for( typename elements_type::const_iterator it = elements.begin() + 1; + it != elements.end() ; ++it) { geometry::expand(result, it->first); } @@ -63,13 +66,16 @@ public: inline bool operator()(leaf const& n) { - if (n.values.empty()) + typedef typename rtree::elements_type::type elements_type; + elements_type const& elements = rtree::elements_get(n); + + if (elements.empty()) return false; Box result; - geometry::convert(m_tr(n.values.front()), result); - for(leaf::values_type::const_iterator it = n.values.begin() + 1; - it != n.values.end() ; ++it) + geometry::convert(m_tr(elements.front()), result); + for(typename elements_type::const_iterator it = elements.begin() + 1; + it != elements.end() ; ++it) { geometry::expand(result, m_tr(*it)); } diff --git a/include/boost/geometry/extensions/index/rtree/visitors/destroy.hpp b/include/boost/geometry/extensions/index/rtree/visitors/destroy.hpp index 71af3b99c..b4229ee82 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/destroy.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/destroy.hpp @@ -24,10 +24,11 @@ struct destroy : public boost::static_visitor<> inline void operator()(internal_node & n) const { - typedef typename internal_node::children_type children_type; + typedef typename rtree::elements_type::type elements_type; + elements_type & elements = rtree::elements_get(n); - for (typename children_type::iterator it = n.children.begin(); - it != n.children.end(); ++it) + for (typename elements_type::iterator it = elements.begin(); + it != elements.end(); ++it) { boost::apply_visitor(*this, *it->second); diff --git a/include/boost/geometry/extensions/index/rtree/visitors/find.hpp b/include/boost/geometry/extensions/index/rtree/visitors/find.hpp index 5cdc65e12..8d00a9e08 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/find.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/find.hpp @@ -193,10 +193,11 @@ struct find : public boost::static_visitor<> // } //} - typedef typename internal_node::children_type children_type; + typedef typename rtree::elements_type::type elements_type; + elements_type const& elements = rtree::elements_get(n); - for (typename children_type::const_iterator it = n.children.begin(); - it != n.children.end(); ++it) + for (typename elements_type::const_iterator it = elements.begin(); + it != elements.end(); ++it) { if ( geometry::intersects(it->first, geom) ) boost::apply_visitor(*this, *it->second); @@ -205,10 +206,11 @@ struct find : public boost::static_visitor<> inline void operator()(leaf const& n) { - typedef typename leaf::values_type values_type; + typedef typename rtree::elements_type::type elements_type; + elements_type const& elements = rtree::elements_get(n); - for (typename values_type::const_iterator it = n.values.begin(); - it != n.values.end(); ++it) + for (typename elements_type::const_iterator it = elements.begin(); + it != elements.end(); ++it) { if ( geometry::intersects(tr(*it), geom) ) { 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 7acddd13c..bae32690e 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp @@ -114,7 +114,8 @@ struct gl_draw : public boost::static_visitor<> inline void operator()(internal_node const& n) { - typedef typename internal_node::children_type children_type; + typedef typename rtree::elements_type::type elements_type; + elements_type const& elements = rtree::elements_get(n); if ( level_f <= level ) { @@ -135,8 +136,8 @@ struct gl_draw : public boost::static_visitor<> else glColor3f(0.5f, 0.5f, 0.5f); - for (typename children_type::const_iterator it = n.children.begin(); - it != n.children.end(); ++it) + for (typename elements_type::const_iterator it = elements.begin(); + it != elements.end(); ++it) { detail::gl_draw_indexable(it->first, level_rel * z_mul); } @@ -147,8 +148,8 @@ struct gl_draw : public boost::static_visitor<> if ( level < level_l ) { - for (typename children_type::const_iterator it = n.children.begin(); - it != n.children.end(); ++it) + for (typename elements_type::const_iterator it = elements.begin(); + it != elements.end(); ++it) { boost::apply_visitor(*this, *it->second); } @@ -159,7 +160,8 @@ struct gl_draw : public boost::static_visitor<> inline void operator()(leaf const& n) { - typedef typename leaf::values_type values_type; + typedef typename rtree::elements_type::type elements_type; + elements_type const& elements = rtree::elements_get(n); if ( level_f <= level ) { @@ -167,8 +169,8 @@ struct gl_draw : public boost::static_visitor<> glColor3f(1.0f, 1.0f, 1.0f); - for (typename values_type::const_iterator it = n.values.begin(); - it != n.values.end(); ++it) + for (typename elements_type::const_iterator it = elements.begin(); + it != elements.end(); ++it) { detail::gl_draw_indexable(tr(*it), level_rel * z_mul); } diff --git a/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp b/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp index 8ece15db2..928f33ade 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp @@ -111,9 +111,9 @@ struct split if ( parent != 0 ) { // update old node's box - parent->children[current_child_index].first = box1; + rtree::elements_get(*parent)[current_child_index].first = box1; // add new node to the parent's children - parent->children.push_back(std::make_pair(box2, second_node)); + rtree::elements_get(*parent).push_back(std::make_pair(box2, second_node)); } // node is the root else @@ -123,8 +123,8 @@ struct split // create new root and add nodes node * new_root = rtree::create_node(internal_node()); - boost::get(*new_root).children.push_back(std::make_pair(box1, root)); - boost::get(*new_root).children.push_back(std::make_pair(box2, second_node)); + rtree::elements_get(boost::get(*new_root)).push_back(std::make_pair(box1, root)); + rtree::elements_get(boost::get(*new_root)).push_back(std::make_pair(box2, second_node)); root = new_root; } @@ -209,7 +209,7 @@ protected: // expand the node to contain value geometry::expand( - n.children[choosen_node_index].first, + rtree::elements_get(n)[choosen_node_index].first, rtree::element_indexable(m_element, m_tr)); // next traversing step diff --git a/include/boost/geometry/extensions/index/rtree/visitors/print.hpp b/include/boost/geometry/extensions/index/rtree/visitors/print.hpp index b208ea36d..e39be12ae 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/print.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/print.hpp @@ -125,12 +125,13 @@ struct print : public boost::static_visitor<> inline void operator()(internal_node const& n) { - typedef typename internal_node::children_type children_type; + typedef typename rtree::elements_type::type elements_type; + elements_type const& elements = rtree::elements_get(n); - spaces(level) << "INTERNAL NODE - L:" << level << " Ch:" << n.children.size() << " @:" << &n << '\n'; + spaces(level) << "INTERNAL NODE - L:" << level << " Ch:" << elements.size() << " @:" << &n << '\n'; - for (typename children_type::const_iterator it = n.children.begin(); - it != n.children.end(); ++it) + for (typename elements_type::const_iterator it = elements.begin(); + it != elements.end(); ++it) { spaces(level); detail::print_indexable(os, it->first); @@ -140,8 +141,8 @@ struct print : public boost::static_visitor<> size_t level_backup = level; ++level; - for (typename children_type::const_iterator it = n.children.begin(); - it != n.children.end(); ++it) + for (typename elements_type::const_iterator it = elements.begin(); + it != elements.end(); ++it) { boost::apply_visitor(*this, *it->second); } @@ -151,11 +152,12 @@ struct print : public boost::static_visitor<> inline void operator()(leaf const& n) { - typedef typename leaf::values_type values_type; + typedef typename rtree::elements_type::type elements_type; + elements_type const& elements = rtree::elements_get(n); - spaces(level) << "LEAF - L:" << level << " V:" << n.values.size() << " @:" << &n << '\n'; - for (typename values_type::const_iterator it = n.values.begin(); - it != n.values.end(); ++it) + spaces(level) << "LEAF - L:" << level << " V:" << elements.size() << " @:" << &n << '\n'; + for (typename elements_type::const_iterator it = elements.begin(); + it != elements.end(); ++it) { spaces(level); detail::print_indexable(os, tr(*it)); diff --git a/include/boost/geometry/extensions/index/rtree/visitors/remove.hpp b/include/boost/geometry/extensions/index/rtree/visitors/remove.hpp index 5647ad6fc..fb4f95121 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/remove.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/remove.hpp @@ -167,7 +167,7 @@ private: ++m_current_level; // next traversing step - boost::apply_visitor(*this, *n.children[choosen_node_index].second); + boost::apply_visitor(*this, *rtree::elements_get(n)[choosen_node_index].second); // restore previous traverse inputs m_parent = parent_bckup; diff --git a/include/boost/geometry/extensions/index/rtree/visitors/save.hpp b/include/boost/geometry/extensions/index/rtree/visitors/save.hpp index 29652a7f1..156d83a69 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/save.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/save.hpp @@ -54,35 +54,41 @@ struct save< inline void operator()(internal_node & n) { - os << n.children.size() << '\n'; + typedef typename rtree::elements_type::type elements_type; + elements_type & elements = rtree::elements_get(n); - for ( size_t i = 0 ; i < n.children.size() ; ++i ) + os << elements.size() << '\n'; + + for ( size_t i = 0 ; i < elements.size() ; ++i ) { - if ( boost::apply_visitor(visitors::is_leaf(), *(n.children[i].second)) ) + if ( boost::apply_visitor(visitors::is_leaf(), *(elements[i].second)) ) os << "l "; else os << "i "; - os << geometry::get(n.children[i].first) << ' '; - os << geometry::get(n.children[i].first) << ' '; - os << geometry::get(n.children[i].first) << ' '; - os << geometry::get(n.children[i].first) << ' '; + os << geometry::get(elements[i].first) << ' '; + os << geometry::get(elements[i].first) << ' '; + os << geometry::get(elements[i].first) << ' '; + os << geometry::get(elements[i].first) << ' '; - boost::apply_visitor(*this, *(n.children[i].second)); + boost::apply_visitor(*this, *(elements[i].second)); } } inline void operator()(leaf & n) { - os << n.values.size() << '\n'; + typedef typename rtree::elements_type::type elements_type; + elements_type & elements = rtree::elements_get(n); - for ( size_t i = 0 ; i < n.values.size() ; ++i ) + os << elements.size() << '\n'; + + for ( size_t i = 0 ; i < elements.size() ; ++i ) { os << "v "; - os << geometry::get(n.values[i].first) << ' '; - os << geometry::get(n.values[i].first) << ' '; - os << geometry::get(n.values[i].first) << ' '; - os << geometry::get(n.values[i].first) << ' '; - os << n.values[i].second << '\n'; + os << geometry::get(elements[i].first) << ' '; + os << geometry::get(elements[i].first) << ' '; + os << geometry::get(elements[i].first) << ' '; + os << geometry::get(elements[i].first) << ' '; + os << elements[i].second << '\n'; } } diff --git a/tests/main.cpp b/tests/main.cpp index 3966633e3..2af71fd58 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -8,9 +8,9 @@ int main() { tests_translators_hpp(); tests_rtree_native_hpp(); - //tests_rtree_native_hpp(); + tests_rtree_native_hpp(); tests_rtree_filters_hpp(); - + /* { namespace bg = boost::geometry; namespace bgi = boost::geometry::index; @@ -22,21 +22,21 @@ int main() const int m = 15; for ( int i = 0 ; i < m ; ++i ) { - bgi::insert(t, V(B(P(i*2, i*2), P(i*2+1, i*2+1)), i)); + bgi::insert(t, V(B(P(i*2.0f, i*2.0f), P(i*2.0f+1, i*2.0f+1)), i)); } std::cout << t << "\n------------------------------------\n"; std::cin.get(); for ( int i = 0 ; i < m ; ++i ) { - bgi::remove(t, V(B(P(i*2, i*2), P(i*2+1, i*2+1)), i)); + bgi::remove(t, V(B(P(i*2.0f, i*2.0f), P(i*2.0f+1, i*2.0f+1)), i)); std::cout << t << '\n'; std::cout << ( boost::geometry::index::are_boxes_ok(t) ? "boxes OK" : "WRONG BOXES!" ); std::cout << "\n------------------------------------\n"; std::cin.get(); } } - + */ #ifdef _MSC_VER std::cin.get(); #endif