mirror of
https://github.com/boostorg/geometry.git
synced 2026-02-12 00:02:09 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user