diff --git a/include/boost/geometry/extensions/index/indexable.hpp b/include/boost/geometry/extensions/index/indexable.hpp index d964e091e..05a8ded9b 100644 --- a/include/boost/geometry/extensions/index/indexable.hpp +++ b/include/boost/geometry/extensions/index/indexable.hpp @@ -140,8 +140,6 @@ struct indexable_indexed_access } // namespace dispatch -namespace detail { - template typename traits::coordinate_type::type get(Indexable const& i) { @@ -153,8 +151,6 @@ typename traits::coordinate_type::type get(Indexable const& i) >::get(i); } -} // namespace detail - }}} // namespace boost::geometry::index #endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_INDEXABLE_HPP diff --git a/include/boost/geometry/extensions/index/rtree/filters.hpp b/include/boost/geometry/extensions/index/rtree/filters.hpp index 15bef8fa6..4855ae8a6 100644 --- a/include/boost/geometry/extensions/index/rtree/filters.hpp +++ b/include/boost/geometry/extensions/index/rtree/filters.hpp @@ -18,20 +18,20 @@ namespace boost { namespace geometry { namespace index { -template +template class rtree; namespace filters { -template -class spatial_filter< index::rtree > +template +class spatial_filter< index::rtree > { public: typedef typename std::vector::iterator iterator; typedef typename std::vector::const_iterator const_iterator; template - spatial_filter(index::rtree const& rtree, Geometry const& geom) + spatial_filter(index::rtree const& rtree, Geometry const& geom) { m_result = rtree.find(geom); } 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 20b88e08f..11ca1a2d3 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 @@ -70,6 +70,38 @@ class rtree_rstar_choose_next_node // //}; +//template +//typename index::area_result< +// typename detail::rtree_element_indexable_type< +// typename std::iterator_traits::value_type, +// Translator +// >::type +//>::type calculate_elements_overlap(ElIter el, ElIter first, ElIter last, Translator const& tr) +//{ +// typedef typename detail::rtree_element_indexable_type< +// typename std::iterator_traits::value_type, +// Translator +// >::type box_type; +// typedef typename index::area_result::type area_type; +// +// area_type result = 0; +// +// for ( ; first != last ; ++first ) +// { +// if ( first != el ) +// { +// box_type inters; +// geometry::assign_zero(inters); +// geometry::intersection( +// detail::rtree_element_indexable(*first, tr), +// detail::rtree_element_indexable(*el, tr), +// inters); +// result += index::area(inters); +// } +// } +// return result; +//} + // TODO: awulkiew - wrong algorithm? Should branch check be applied to Leafs? // TODO: awulkiew - further optimization: don't calculate area with the overlap, calculate it only if // overlap < smallest_overlap (and current area must be stored) OR @@ -130,7 +162,7 @@ private: struct branch_areas { - typedef typename area_result::type area_type; + typedef typename index::area_result::type area_type; template inline branch_areas(children_type const& ch, typename children_type::iterator const& k_it, Indexable const& indexable) diff --git a/include/boost/geometry/extensions/index/rtree/rstar/split.hpp b/include/boost/geometry/extensions/index/rtree/rstar/split.hpp index f0b01af24..d0ee35322 100644 --- a/include/boost/geometry/extensions/index/rtree/rstar/split.hpp +++ b/include/boost/geometry/extensions/index/rtree/rstar/split.hpp @@ -41,11 +41,11 @@ public: inline bool operator()(element_type const& e1, element_type const e2) const { return - index::detail::get( + index::get( index::detail::rtree_element_indexable(e1, m_tr) ) < - index::detail::get( + index::get( index::detail::rtree_element_indexable(e2, m_tr) ); } diff --git a/include/boost/geometry/extensions/index/rtree/rtree.hpp b/include/boost/geometry/extensions/index/rtree/rtree.hpp index 6a362080e..efb821fc0 100644 --- a/include/boost/geometry/extensions/index/rtree/rtree.hpp +++ b/include/boost/geometry/extensions/index/rtree/rtree.hpp @@ -27,21 +27,25 @@ namespace boost { namespace geometry { namespace index { template < typename Value, typename Translator = default_parameter, - typename Box = default_parameter, typename Tag = rtree_rstar_tag > class rtree { public: typedef Value value_type; - typedef typename detail::default_translator_type::type translator_type; - typedef typename detail::default_box_type::type box_type; + typedef typename detail::default_translator_type::type translator_type; + typedef typename detail::geometry_box_type::type box_type; + typedef Tag tag_type; - 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 = 2, size_t min_elems_per_node = 1, translator_type const& translator = translator_type()) + inline explicit rtree( + size_t max_elems_per_node = 2, + size_t min_elems_per_node = 1, + translator_type const& translator = translator_type() + ) : m_values_count(0) , m_max_elems_per_node(max_elems_per_node) , m_min_elems_per_node(min_elems_per_node) @@ -58,21 +62,21 @@ public: ~rtree() { - visitors::rtree_delete del_v; + visitors::rtree_delete del_v; boost::apply_visitor(del_v, *m_root); } template - inline std::vector find(Geometry const& geom) const + inline std::vector find(Geometry const& geom) const { - visitors::rtree_find find_v(geom, m_translator); + visitors::rtree_find find_v(geom, m_translator); boost::apply_visitor(find_v, *m_root); return find_v.result; } - void insert(Value const& value) + void insert(value_type const& value) { - visitors::rtree_insert + visitors::rtree_insert insert_v(m_root, value, m_min_elems_per_node, m_max_elems_per_node, m_translator); boost::apply_visitor(insert_v, *m_root); @@ -104,8 +108,8 @@ private: translator_type m_translator; }; -template -void insert(rtree & tree, Value const& v) +template +void insert(rtree & tree, Value const& v) { tree.insert(v); } diff --git a/include/boost/geometry/extensions/index/rtree/rtree_node.hpp b/include/boost/geometry/extensions/index/rtree/rtree_node.hpp index 97000e192..a7129922e 100644 --- a/include/boost/geometry/extensions/index/rtree/rtree_node.hpp +++ b/include/boost/geometry/extensions/index/rtree/rtree_node.hpp @@ -159,10 +159,14 @@ rtree_element_indexable(Value const& el, Translator const& tr) template inline Box rtree_elements_box(FwdIter first, FwdIter last, Translator const& tr) { - assert(first != last); - Box result; + if (first == last) + { + geometry::assign_zero(result); + return result; + } + geometry::convert(index::detail::rtree_element_indexable(*first, tr), result); ++first; 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 2038bec98..6f9c45ab6 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp @@ -163,15 +163,17 @@ struct rtree_gl_draw : public boost::static_visitor<> } // namespace visitors -template -void gl_draw(rtree const& tree) +template +void gl_draw(rtree const& tree) { - typedef typename rtree::translator_type translator_type; - typedef typename rtree::box_type box_type; + 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; glClear(GL_COLOR_BUFFER_BIT); - visitors::rtree_gl_draw gl_draw_v(tree.get_translator()); + visitors::rtree_gl_draw gl_draw_v(tree.get_translator()); tree.apply_visitor(gl_draw_v); glFlush(); diff --git a/include/boost/geometry/extensions/index/rtree/visitors/print.hpp b/include/boost/geometry/extensions/index/rtree/visitors/print.hpp index 63910a295..65ad8c95c 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/print.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/print.hpp @@ -179,22 +179,14 @@ struct rtree_print : public boost::static_visitor<> } // namespace visitors -template -std::ostream & print(rtree const& tree, std::ostream & os = std::cout) +template +std::ostream & operator<<(std::ostream & os, rtree const& tree) { - typedef typename rtree::translator_type translator_type; - typedef typename rtree::box_type box_type; - visitors::rtree_print print_v(os, tree.get_translator()); - tree.apply_visitor(print_v); - return os; -} - -template -std::ostream & operator<<(std::ostream & os, rtree const& tree) -{ - typedef typename rtree::translator_type translator_type; - typedef typename rtree::box_type box_type; - visitors::rtree_print print_v(os, tree.get_translator()); + 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; + visitors::rtree_print print_v(os, tree.get_translator()); tree.apply_visitor(print_v); return os; } diff --git a/include/boost/geometry/extensions/index/rtree/visitors/rtree_are_boxes_ok.hpp b/include/boost/geometry/extensions/index/rtree/visitors/rtree_are_boxes_ok.hpp index 5d09631e0..2e7c0d755 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/rtree_are_boxes_ok.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/rtree_are_boxes_ok.hpp @@ -85,15 +85,15 @@ private: } // namespace visitors -template -bool rtree_are_boxes_ok(rtree const& tree) +template +bool rtree_are_boxes_ok(rtree const& tree) { - typedef rtree rt; + typedef rtree rt; visitors::rtree_are_boxes_ok< typename rt::value_type, typename rt::translator_type, typename rt::box_type, - Tag> v(tree.get_translator()); + typename rt::tag_type> v(tree.get_translator()); return tree.apply_visitor(v); }