statistics.hpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Boost.Geometry Index
  2. //
  3. // R-tree visitor collecting basic statistics
  4. //
  5. // Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
  6. // Copyright (c) 2013 Mateusz Loskot, London, UK.
  7. //
  8. // This file was modified by Oracle on 2019.
  9. // Modifications copyright (c) 2019 Oracle and/or its affiliates.
  10. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
  11. //
  12. // Use, modification and distribution is subject to the Boost Software License,
  13. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  14. // http://www.boost.org/LICENSE_1_0.txt)
  15. #ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_STATISTICS_HPP
  16. #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_STATISTICS_HPP
  17. #include <algorithm>
  18. #include <boost/tuple/tuple.hpp>
  19. namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace utilities {
  20. namespace visitors {
  21. template <typename MembersHolder>
  22. struct statistics
  23. : public MembersHolder::visitor_const
  24. {
  25. typedef typename MembersHolder::internal_node internal_node;
  26. typedef typename MembersHolder::leaf leaf;
  27. inline statistics()
  28. : level(0)
  29. , levels(1) // count root
  30. , nodes(0)
  31. , leaves(0)
  32. , values(0)
  33. , values_min(0)
  34. , values_max(0)
  35. {}
  36. inline void operator()(internal_node const& n)
  37. {
  38. typedef typename rtree::elements_type<internal_node>::type elements_type;
  39. elements_type const& elements = rtree::elements(n);
  40. ++nodes; // count node
  41. size_t const level_backup = level;
  42. ++level;
  43. levels += level++ > levels ? 1 : 0; // count level (root already counted)
  44. for (typename elements_type::const_iterator it = elements.begin();
  45. it != elements.end(); ++it)
  46. {
  47. rtree::apply_visitor(*this, *it->second);
  48. }
  49. level = level_backup;
  50. }
  51. inline void operator()(leaf const& n)
  52. {
  53. typedef typename rtree::elements_type<leaf>::type elements_type;
  54. elements_type const& elements = rtree::elements(n);
  55. ++leaves; // count leaves
  56. std::size_t const v = elements.size();
  57. // count values spread per node and total
  58. values_min = (std::min)(values_min == 0 ? v : values_min, v);
  59. values_max = (std::max)(values_max, v);
  60. values += v;
  61. }
  62. std::size_t level;
  63. std::size_t levels;
  64. std::size_t nodes;
  65. std::size_t leaves;
  66. std::size_t values;
  67. std::size_t values_min;
  68. std::size_t values_max;
  69. };
  70. } // namespace visitors
  71. template <typename Rtree> inline
  72. boost::tuple<std::size_t, std::size_t, std::size_t, std::size_t, std::size_t, std::size_t>
  73. statistics(Rtree const& tree)
  74. {
  75. typedef utilities::view<Rtree> RTV;
  76. RTV rtv(tree);
  77. visitors::statistics<
  78. typename RTV::members_holder
  79. > stats_v;
  80. rtv.apply_visitor(stats_v);
  81. return boost::make_tuple(stats_v.levels, stats_v.nodes, stats_v.leaves, stats_v.values, stats_v.values_min, stats_v.values_max);
  82. }
  83. }}}}}} // namespace boost::geometry::index::detail::rtree::utilities
  84. #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_STATISTICS_HPP