1 // Boost.Geometry Index
3 // R-tree visitor collecting basic statistics
5 // Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
6 // Copyright (c) 2013 Mateusz Loskot, London, UK.
8 // This file was modified by Oracle on 2019-2020.
9 // Modifications copyright (c) 2019-2020 Oracle and/or its affiliates.
10 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
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)
16 #ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_STATISTICS_HPP
17 #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_STATISTICS_HPP
22 namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace utilities {
26 template <typename MembersHolder>
28 : public MembersHolder::visitor_const
30 typedef typename MembersHolder::internal_node internal_node;
31 typedef typename MembersHolder::leaf leaf;
35 , levels(1) // count root
43 inline void operator()(internal_node const& n)
45 typedef typename rtree::elements_type<internal_node>::type elements_type;
46 elements_type const& elements = rtree::elements(n);
48 ++nodes; // count node
50 size_t const level_backup = level;
53 levels += level++ > levels ? 1 : 0; // count level (root already counted)
55 for (typename elements_type::const_iterator it = elements.begin();
56 it != elements.end(); ++it)
58 rtree::apply_visitor(*this, *it->second);
64 inline void operator()(leaf const& n)
66 typedef typename rtree::elements_type<leaf>::type elements_type;
67 elements_type const& elements = rtree::elements(n);
69 ++leaves; // count leaves
71 std::size_t const v = elements.size();
72 // count values spread per node and total
73 values_min = (std::min)(values_min == 0 ? v : values_min, v);
74 values_max = (std::max)(values_max, v);
83 std::size_t values_min;
84 std::size_t values_max;
87 } // namespace visitors
89 template <typename Rtree> inline
90 std::tuple<std::size_t, std::size_t, std::size_t, std::size_t, std::size_t, std::size_t>
91 statistics(Rtree const& tree)
93 typedef utilities::view<Rtree> RTV;
97 typename RTV::members_holder
100 rtv.apply_visitor(stats_v);
102 return std::make_tuple(stats_v.levels, stats_v.nodes, stats_v.leaves, stats_v.values, stats_v.values_min, stats_v.values_max);
105 }}}}}} // namespace boost::geometry::index::detail::rtree::utilities
107 #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_STATISTICS_HPP