Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/geometry/index/rtree.hpp @ 101:c530137014c0
Update Boost headers (1.58.0)
author | Chris Cannam |
---|---|
date | Mon, 07 Sep 2015 11:12:49 +0100 |
parents | 2665513ce2d3 |
children |
line wrap: on
line diff
--- a/DEPENDENCIES/generic/include/boost/geometry/index/rtree.hpp Fri Sep 04 12:01:02 2015 +0100 +++ b/DEPENDENCIES/generic/include/boost/geometry/index/rtree.hpp Mon Sep 07 11:12:49 2015 +0100 @@ -3,7 +3,7 @@ // R-tree implementation // // Copyright (c) 2008 Federico J. Fernandez. -// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland. +// Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland. // // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at @@ -12,13 +12,30 @@ #ifndef BOOST_GEOMETRY_INDEX_RTREE_HPP #define BOOST_GEOMETRY_INDEX_RTREE_HPP +// STD #include <algorithm> +// Boost #include <boost/tuple/tuple.hpp> #include <boost/move/move.hpp> -#include <boost/geometry/geometry.hpp> +// Boost.Geometry +#include <boost/geometry/algorithms/detail/comparable_distance/interface.hpp> +#include <boost/geometry/algorithms/centroid.hpp> +#include <boost/geometry/algorithms/covered_by.hpp> +#include <boost/geometry/algorithms/disjoint.hpp> +#include <boost/geometry/algorithms/equals.hpp> +#include <boost/geometry/algorithms/intersects.hpp> +#include <boost/geometry/algorithms/overlaps.hpp> +#include <boost/geometry/algorithms/touches.hpp> +#include <boost/geometry/algorithms/within.hpp> +#include <boost/geometry/geometries/point.hpp> +#include <boost/geometry/geometries/box.hpp> + +#include <boost/geometry/strategies/strategies.hpp> + +// Boost.Geometry.Index #include <boost/geometry/index/detail/config_begin.hpp> #include <boost/geometry/index/detail/assert.hpp> @@ -79,12 +96,13 @@ /*! \brief The R-tree spatial index. -This is self-balancing spatial index capable to store various types of Values and balancing algorithms. +This is self-balancing spatial index capable to store various types of Values +and balancing algorithms. \par Parameters The user must pass a type defining the Parameters which will -be used in rtree creation process. This type is used e.g. to specify balancing algorithm -with specific parameters like min and max number of elements in node. +be used in rtree creation process. This type is used e.g. to specify balancing +algorithm with specific parameters like min and max number of elements in node. \par Predefined algorithms with compile-time parameters are: @@ -99,23 +117,31 @@ \li \c boost::geometry::index::dynamic_rstar. \par IndexableGetter -The object of IndexableGetter type translates from Value to Indexable each time r-tree requires it. Which means that this -operation is done for each Value access. Therefore the IndexableGetter should return the Indexable by -const reference instead of a value. Default one can translate all types adapted to Point -or Box concepts (called Indexables). It also handles <tt>std::pair<Indexable, T></tt> and -<tt>boost::tuple<Indexable, ...></tt>. For example, if <tt>std::pair<Box, int></tt> is stored in the -container, the default IndexableGetter translates from <tt>std::pair<Box, int> const&</tt> to <tt>Box const&</tt>. +The object of IndexableGetter type translates from Value to Indexable each time +r-tree requires it. This means that this operation is done for each Value +access. Therefore the IndexableGetter should return the Indexable by +a reference type. The Indexable should not be calculated since it could harm +the performance. The default IndexableGetter can translate all types adapted +to Point, Box or Segment concepts (called Indexables). Furthermore, it can +handle <tt>std::pair<Indexable, T></tt>, <tt>boost::tuple<Indexable, ...></tt> +and <tt>std::tuple<Indexable, ...></tt> when possible. For example, for Value +of type <tt>std::pair<Box, int></tt>, the default IndexableGetter translates +from <tt>std::pair<Box, int> const&</tt> to <tt>Box const&</tt>. \par EqualTo -The object of EqualTo type compares Values and returns <tt>true</tt> if they're equal. It's similar to <tt>std::equal_to<></tt>. -The default EqualTo returns the result of <tt>boost::geometry::equals()</tt> for types adapted to some Geometry concept -defined in Boost.Geometry and the result of operator= for other types. Components of Pairs and Tuples are compared left-to-right. +The object of EqualTo type compares Values and returns <tt>true</tt> if they +are equal. It's similar to <tt>std::equal_to<></tt>. The default EqualTo +returns the result of <tt>boost::geometry::equals()</tt> for types adapted to +some Geometry concept defined in Boost.Geometry and the result of +<tt>operator==</tt> for other types. Components of Pairs and Tuples are +compared left-to-right. \tparam Value The type of objects stored in the container. \tparam Parameters Compile-time parameters. \tparam IndexableGetter The function object extracting Indexable from Value. \tparam EqualTo The function object comparing objects of type Value. -\tparam Allocator The allocator used to allocate/deallocate memory, construct/destroy nodes and Values. +\tparam Allocator The allocator used to allocate/deallocate memory, + construct/destroy nodes and Values. */ template < typename Value, @@ -171,7 +197,7 @@ typedef typename allocators_type::node_pointer node_pointer; typedef ::boost::container::allocator_traits<Allocator> allocator_traits_type; - typedef detail::rtree::node_auto_ptr<value_type, options_type, translator_type, box_type, allocators_type> node_auto_ptr; + typedef detail::rtree::subtree_destroyer<value_type, options_type, translator_type, box_type, allocators_type> subtree_destroyer; friend class detail::rtree::utilities::view<rtree>; #ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL @@ -573,9 +599,9 @@ } /*! - \brief Insert a range of values to the index. + \brief Insert a value created using convertible object or a range of values to the index. - \param rng The range of values. + \param conv_or_rng An object of type convertible to value_type or a range of values. \par Throws \li If Value copy constructor or copy assignment throws. @@ -587,17 +613,15 @@ elements must not be inserted or removed. Other operations are allowed however some of them may return invalid data. */ - template <typename Range> - inline void insert(Range const& rng) + template <typename ConvertibleOrRange> + inline void insert(ConvertibleOrRange const& conv_or_rng) { - BOOST_MPL_ASSERT_MSG((detail::is_range<Range>::value), PASSED_OBJECT_IS_NOT_A_RANGE, (Range)); + typedef boost::mpl::bool_ + < + boost::is_convertible<ConvertibleOrRange, value_type>::value + > is_conv_t; - if ( !m_members.root ) - this->raw_create(); - - typedef typename boost::range_const_iterator<Range>::type It; - for ( It it = boost::const_begin(rng); it != boost::const_end(rng) ; ++it ) - this->raw_insert(*it); + this->insert_dispatch(conv_or_rng, is_conv_t()); } /*! @@ -658,13 +682,13 @@ } /*! - \brief Remove a range of values from the container. + \brief Remove value corresponding to an object convertible to it or a range of values from the container. In contrast to the \c std::set or <tt>std::map erase()</tt> method it removes values equal to these passed as a range. Furthermore, this method removes only one value for each one passed in the range, not all equal values. - \param rng The range of values. + \param conv_or_rng The object of type convertible to value_type or a range of values. \return The number of removed values. @@ -678,16 +702,15 @@ elements must not be inserted or removed. Other operations are allowed however some of them may return invalid data. */ - template <typename Range> - inline size_type remove(Range const& rng) + template <typename ConvertibleOrRange> + inline size_type remove(ConvertibleOrRange const& conv_or_rng) { - BOOST_MPL_ASSERT_MSG((detail::is_range<Range>::value), PASSED_OBJECT_IS_NOT_A_RANGE, (Range)); + typedef boost::mpl::bool_ + < + boost::is_convertible<ConvertibleOrRange, value_type>::value + > is_conv_t; - size_type result = 0; - typedef typename boost::range_const_iterator<Range>::type It; - for ( It it = boost::const_begin(rng); it != boost::const_end(rng) ; ++it ) - result += this->raw_remove(*it); - return result; + return this->remove_dispatch(conv_or_rng, is_conv_t()); } /*! @@ -1074,15 +1097,36 @@ template <typename ValueOrIndexable> size_type count(ValueOrIndexable const& vori) const { - if ( !m_members.root ) - return 0; + // the input should be convertible to Value or Indexable type - detail::rtree::visitors::count<ValueOrIndexable, value_type, options_type, translator_type, box_type, allocators_type> - count_v(vori, m_members.translator()); + enum { as_val = 0, as_ind, dont_know }; + typedef boost::mpl::int_ + < + boost::is_same<ValueOrIndexable, value_type>::value ? + as_val : + boost::is_same<ValueOrIndexable, indexable_type>::value ? + as_ind : + boost::is_convertible<ValueOrIndexable, indexable_type>::value ? + as_ind : + boost::is_convertible<ValueOrIndexable, value_type>::value ? + as_val : + dont_know + > variant; - detail::rtree::apply_visitor(count_v, *m_members.root); + BOOST_MPL_ASSERT_MSG((variant::value != dont_know), + PASSED_OBJECT_NOT_CONVERTIBLE_TO_VALUE_NOR_INDEXABLE_TYPE, + (ValueOrIndexable)); - return count_v.found_count; + typedef typename boost::mpl::if_c + < + variant::value == as_val, + value_type, + indexable_type + >::type value_or_indexable; + + // NOTE: If an object of convertible but not the same type is passed + // into the function, here a temporary will be created. + return this->template raw_count<value_or_indexable>(vori); } /*! @@ -1200,6 +1244,7 @@ inline void raw_insert(value_type const& value) { BOOST_GEOMETRY_INDEX_ASSERT(m_members.root, "The root must exist"); + // CONSIDER: alternative - ignore invalid indexable or throw an exception BOOST_GEOMETRY_INDEX_ASSERT(detail::is_valid(m_members.translator()(value)), "Indexable is invalid"); detail::rtree::visitors::insert< @@ -1317,7 +1362,7 @@ dst.m_members.parameters() = src.m_members.parameters(); } - // TODO use node_auto_ptr + // TODO use subtree_destroyer if ( dst.m_members.root ) { detail::rtree::visitors::destroy<value_type, options_type, translator_type, box_type, allocators_type> @@ -1332,6 +1377,86 @@ } /*! + \brief Insert a value corresponding to convertible object into the index. + + \param val_conv The object convertible to value. + + \par Exception-safety + basic + */ + template <typename ValueConvertible> + inline void insert_dispatch(ValueConvertible const& val_conv, + boost::mpl::bool_<true> const& /*is_convertible*/) + { + if ( !m_members.root ) + this->raw_create(); + + this->raw_insert(val_conv); + } + + /*! + \brief Insert a range of values into the index. + + \param rng The range of values. + + \par Exception-safety + basic + */ + template <typename Range> + inline void insert_dispatch(Range const& rng, + boost::mpl::bool_<false> const& /*is_convertible*/) + { + BOOST_MPL_ASSERT_MSG((detail::is_range<Range>::value), + PASSED_OBJECT_IS_NOT_CONVERTIBLE_TO_VALUE_NOR_A_RANGE, + (Range)); + + if ( !m_members.root ) + this->raw_create(); + + typedef typename boost::range_const_iterator<Range>::type It; + for ( It it = boost::const_begin(rng); it != boost::const_end(rng) ; ++it ) + this->raw_insert(*it); + } + + /*! + \brief Remove a value corresponding to convertible object from the index. + + \param val_conv The object convertible to value. + + \par Exception-safety + basic + */ + template <typename ValueConvertible> + inline size_type remove_dispatch(ValueConvertible const& val_conv, + boost::mpl::bool_<true> const& /*is_convertible*/) + { + return this->raw_remove(val_conv); + } + + /*! + \brief Remove a range of values from the index. + + \param rng The range of values which will be removed from the container. + + \par Exception-safety + basic + */ + template <typename Range> + inline size_type remove_dispatch(Range const& rng, + boost::mpl::bool_<false> const& /*is_convertible*/) + { + BOOST_MPL_ASSERT_MSG((detail::is_range<Range>::value), + PASSED_OBJECT_IS_NOT_CONVERTIBLE_TO_VALUE_NOR_A_RANGE, + (Range)); + + size_type result = 0; + typedef typename boost::range_const_iterator<Range>::type It; + for ( It it = boost::const_begin(rng); it != boost::const_end(rng) ; ++it ) + result += this->raw_remove(*it); + return result; + } + + /*! \brief Return values meeting predicates. \par Exception-safety @@ -1373,6 +1498,33 @@ return distance_v.finish(); } + + /*! + \brief Count elements corresponding to value or indexable. + + \par Exception-safety + strong + */ + template <typename ValueOrIndexable> + size_type raw_count(ValueOrIndexable const& vori) const + { + if ( !m_members.root ) + return 0; + + detail::rtree::visitors::count + < + ValueOrIndexable, + value_type, + options_type, + translator_type, + box_type, + allocators_type + > count_v(vori, m_members.translator()); + + detail::rtree::apply_visitor(count_v, *m_members.root); + + return count_v.found_count; + } struct members_holder : public translator_type @@ -1439,7 +1591,8 @@ \param v The value which will be stored in the index. */ template <typename Value, typename Parameters, typename IndexableGetter, typename EqualTo, typename Allocator> -inline void insert(rtree<Value, Parameters, IndexableGetter, EqualTo, Allocator> & tree, Value const& v) +inline void insert(rtree<Value, Parameters, IndexableGetter, EqualTo, Allocator> & tree, + Value const& v) { tree.insert(v); } @@ -1455,26 +1608,30 @@ \param first The beginning of the range of values. \param last The end of the range of values. */ -template<typename Value, typename Parameters, typename IndexableGetter, typename EqualTo, typename Allocator, typename Iterator> -inline void insert(rtree<Value, Parameters, IndexableGetter, EqualTo, Allocator> & tree, Iterator first, Iterator last) +template<typename Value, typename Parameters, typename IndexableGetter, typename EqualTo, typename Allocator, + typename Iterator> +inline void insert(rtree<Value, Parameters, IndexableGetter, EqualTo, Allocator> & tree, + Iterator first, Iterator last) { tree.insert(first, last); } /*! -\brief Insert a range of values to the index. +\brief Insert a value created using convertible object or a range of values to the index. -It calls <tt>rtree::insert(Range const&)</tt>. +It calls <tt>rtree::insert(ConvertibleOrRange const&)</tt>. \ingroup rtree_functions -\param tree The spatial index. -\param rng The range of values. +\param tree The spatial index. +\param conv_or_rng The object of type convertible to value_type or a range of values. */ -template<typename Value, typename Parameters, typename IndexableGetter, typename EqualTo, typename Allocator, typename Range> -inline void insert(rtree<Value, Parameters, IndexableGetter, EqualTo, Allocator> & tree, Range const& rng) +template<typename Value, typename Parameters, typename IndexableGetter, typename EqualTo, typename Allocator, + typename ConvertibleOrRange> +inline void insert(rtree<Value, Parameters, IndexableGetter, EqualTo, Allocator> & tree, + ConvertibleOrRange const& conv_or_rng) { - tree.insert(rng); + tree.insert(conv_or_rng); } /*! @@ -1494,7 +1651,8 @@ */ template <typename Value, typename Parameters, typename IndexableGetter, typename EqualTo, typename Allocator> inline typename rtree<Value, Parameters, IndexableGetter, EqualTo, Allocator>::size_type -remove(rtree<Value, Parameters, IndexableGetter, EqualTo, Allocator> & tree, Value const& v) +remove(rtree<Value, Parameters, IndexableGetter, EqualTo, Allocator> & tree, + Value const& v) { return tree.remove(v); } @@ -1517,34 +1675,39 @@ \return The number of removed values. */ -template<typename Value, typename Parameters, typename IndexableGetter, typename EqualTo, typename Allocator, typename Iterator> +template<typename Value, typename Parameters, typename IndexableGetter, typename EqualTo, typename Allocator, + typename Iterator> inline typename rtree<Value, Parameters, IndexableGetter, EqualTo, Allocator>::size_type -remove(rtree<Value, Parameters, IndexableGetter, EqualTo, Allocator> & tree, Iterator first, Iterator last) +remove(rtree<Value, Parameters, IndexableGetter, EqualTo, Allocator> & tree, + Iterator first, Iterator last) { return tree.remove(first, last); } /*! -\brief Remove a range of values from the container. +\brief Remove a value corresponding to an object convertible to it or a range of values from the container. -Remove a range of values from the container. In contrast to the \c std::set or <tt>std::map erase()</tt> method +Remove a value corresponding to an object convertible to it or a range of values from the container. +In contrast to the \c std::set or <tt>std::map erase()</tt> method it removes values equal to these passed as a range. Furthermore this method removes only one value for each one passed in the range, not all equal values. -It calls <tt>rtree::remove(Range const&)</tt>. +It calls <tt>rtree::remove(ConvertibleOrRange const&)</tt>. \ingroup rtree_functions -\param tree The spatial index. -\param rng The range of values. +\param tree The spatial index. +\param conv_or_rng The object of type convertible to value_type or the range of values. \return The number of removed values. */ -template<typename Value, typename Parameters, typename IndexableGetter, typename EqualTo, typename Allocator, typename Range> +template<typename Value, typename Parameters, typename IndexableGetter, typename EqualTo, typename Allocator, + typename ConvertibleOrRange> inline typename rtree<Value, Parameters, IndexableGetter, EqualTo, Allocator>::size_type -remove(rtree<Value, Parameters, IndexableGetter, EqualTo, Allocator> & tree, Range const& rng) +remove(rtree<Value, Parameters, IndexableGetter, EqualTo, Allocator> & tree, + ConvertibleOrRange const& conv_or_rng) { - return tree.remove(rng); + return tree.remove(conv_or_rng); } /*! @@ -1781,6 +1944,9 @@ }}} // namespace boost::geometry::index +// TODO: don't include the implementation at the end of the file +#include <boost/geometry/algorithms/detail/comparable_distance/implementation.hpp> + #include <boost/geometry/index/detail/config_end.hpp> #endif // BOOST_GEOMETRY_INDEX_RTREE_HPP