annotate DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/utilities/statistics.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 // Boost.Geometry Index
Chris@16 2 //
Chris@16 3 // R-tree visitor collecting basic statistics
Chris@16 4 //
Chris@16 5 // Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
Chris@16 6 // Copyright (c) 2013 Mateusz Loskot, London, UK.
Chris@16 7 //
Chris@16 8 // Use, modification and distribution is subject to the Boost Software License,
Chris@16 9 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 10 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 11
Chris@16 12 #ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_STATISTICS_HPP
Chris@16 13 #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_STATISTICS_HPP
Chris@16 14
Chris@16 15 #include <algorithm>
Chris@16 16 #include <boost/tuple/tuple.hpp>
Chris@16 17
Chris@16 18 namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace utilities {
Chris@16 19
Chris@16 20 namespace visitors {
Chris@16 21
Chris@16 22 template <typename Value, typename Options, typename Box, typename Allocators>
Chris@16 23 struct statistics : public rtree::visitor<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag, true>::type
Chris@16 24 {
Chris@16 25 typedef typename rtree::internal_node<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type internal_node;
Chris@16 26 typedef typename rtree::leaf<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type leaf;
Chris@16 27
Chris@16 28 inline statistics()
Chris@16 29 : level(0)
Chris@16 30 , levels(1) // count root
Chris@16 31 , nodes(0)
Chris@16 32 , leaves(0)
Chris@16 33 , values(0)
Chris@16 34 , values_min(0)
Chris@16 35 , values_max(0)
Chris@16 36 {}
Chris@16 37
Chris@16 38 inline void operator()(internal_node const& n)
Chris@16 39 {
Chris@16 40 typedef typename rtree::elements_type<internal_node>::type elements_type;
Chris@16 41 elements_type const& elements = rtree::elements(n);
Chris@16 42
Chris@16 43 ++nodes; // count node
Chris@16 44
Chris@16 45 size_t const level_backup = level;
Chris@16 46 ++level;
Chris@16 47
Chris@16 48 levels += level++ > levels ? 1 : 0; // count level (root already counted)
Chris@16 49
Chris@16 50 for (typename elements_type::const_iterator it = elements.begin();
Chris@16 51 it != elements.end(); ++it)
Chris@16 52 {
Chris@16 53 rtree::apply_visitor(*this, *it->second);
Chris@16 54 }
Chris@16 55
Chris@16 56 level = level_backup;
Chris@16 57 }
Chris@16 58
Chris@16 59 inline void operator()(leaf const& n)
Chris@16 60 {
Chris@16 61 typedef typename rtree::elements_type<leaf>::type elements_type;
Chris@16 62 elements_type const& elements = rtree::elements(n);
Chris@16 63
Chris@16 64 ++leaves; // count leaves
Chris@16 65
Chris@16 66 std::size_t const v = elements.size();
Chris@16 67 // count values spread per node and total
Chris@16 68 values_min = (std::min)(values_min == 0 ? v : values_min, v);
Chris@16 69 values_max = (std::max)(values_max, v);
Chris@16 70 values += v;
Chris@16 71 }
Chris@16 72
Chris@16 73 std::size_t level;
Chris@16 74 std::size_t levels;
Chris@16 75 std::size_t nodes;
Chris@16 76 std::size_t leaves;
Chris@16 77 std::size_t values;
Chris@16 78 std::size_t values_min;
Chris@16 79 std::size_t values_max;
Chris@16 80 };
Chris@16 81
Chris@16 82 } // namespace visitors
Chris@16 83
Chris@16 84 template <typename Rtree> inline
Chris@16 85 boost::tuple<std::size_t, std::size_t, std::size_t, std::size_t, std::size_t, std::size_t>
Chris@16 86 statistics(Rtree const& tree)
Chris@16 87 {
Chris@16 88 typedef utilities::view<Rtree> RTV;
Chris@16 89 RTV rtv(tree);
Chris@16 90
Chris@16 91 visitors::statistics<
Chris@16 92 typename RTV::value_type,
Chris@16 93 typename RTV::options_type,
Chris@16 94 typename RTV::box_type,
Chris@16 95 typename RTV::allocators_type
Chris@16 96 > stats_v;
Chris@16 97
Chris@16 98 rtv.apply_visitor(stats_v);
Chris@16 99
Chris@16 100 return boost::make_tuple(stats_v.levels, stats_v.nodes, stats_v.leaves, stats_v.values, stats_v.values_min, stats_v.values_max);
Chris@16 101 }
Chris@16 102
Chris@16 103 }}}}}} // namespace boost::geometry::index::detail::rtree::utilities
Chris@16 104
Chris@16 105 #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_STATISTICS_HPP