1 // Boost.Geometry Index
3 // R-tree nodes elements numbers validating visitor implementation
5 // Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland.
7 // This file was modified by Oracle on 2019.
8 // Modifications copyright (c) 2019 Oracle and/or its affiliates.
9 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
11 // Use, modification and distribution is subject to the Boost Software License,
12 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
13 // http://www.boost.org/LICENSE_1_0.txt)
15 #ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_ARE_COUNTS_OK_HPP
16 #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_ARE_COUNTS_OK_HPP
18 #include <boost/geometry/index/detail/rtree/node/node.hpp>
20 namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace utilities {
24 template <typename MembersHolder>
26 : public MembersHolder::visitor_const
28 typedef typename MembersHolder::parameters_type parameters_type;
30 typedef typename MembersHolder::internal_node internal_node;
31 typedef typename MembersHolder::leaf leaf;
34 inline are_counts_ok(parameters_type const& parameters, bool check_min = true)
37 , m_parameters(parameters)
38 , m_check_min(check_min)
41 inline void operator()(internal_node const& n)
43 typedef typename rtree::elements_type<internal_node>::type elements_type;
44 elements_type const& elements = rtree::elements(n);
46 // root internal node shouldn't contain 0 elements
47 if ( (elements.empty() && m_check_min)
48 || !check_count(elements) )
54 size_t current_level_backup = m_current_level;
57 for ( typename elements_type::const_iterator it = elements.begin();
58 it != elements.end() && result == true ;
61 rtree::apply_visitor(*this, *it->second);
64 m_current_level = current_level_backup;
67 inline void operator()(leaf const& n)
69 typedef typename rtree::elements_type<leaf>::type elements_type;
70 elements_type const& elements = rtree::elements(n);
72 // empty leaf in non-root node
73 if ( (m_current_level > 0 && elements.empty() && m_check_min)
74 || !check_count(elements) )
83 template <typename Elements>
84 bool check_count(Elements const& elements)
86 // root may contain count < min but should never contain count > max
87 return elements.size() <= m_parameters.get_max_elements()
88 && ( elements.size() >= m_parameters.get_min_elements()
89 || m_current_level == 0 || !m_check_min );
92 size_t m_current_level;
93 parameters_type const& m_parameters;
97 } // namespace visitors
99 template <typename Rtree> inline
100 bool are_counts_ok(Rtree const& tree, bool check_min = true)
102 typedef utilities::view<Rtree> RTV;
105 visitors::are_counts_ok<
106 typename RTV::members_holder
107 > v(tree.parameters(), check_min);
109 rtv.apply_visitor(v);
114 }}}}}} // namespace boost::geometry::index::detail::rtree::utilities
116 #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_ARE_COUNTS_OK_HPP