// Boost.Geometry Index // // R-tree count visitor implementation // // Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland. // // This file was modified by Oracle on 2019. // Modifications copyright (c) 2019 Oracle and/or its affiliates. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_VISITORS_COUNT_HPP #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_VISITORS_COUNT_HPP namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace visitors { template struct count_helper { template static inline typename Translator::result_type indexable(Indexable const& i, Translator const&) { return i; } template static inline bool equals(Indexable const& i, Value const& v, Translator const& tr, Strategy const& s) { return index::detail::equals::apply(i, tr(v), s); } }; template struct count_helper { template static inline typename Translator::result_type indexable(Value const& v, Translator const& tr) { return tr(v); } template static inline bool equals(Value const& v1, Value const& v2, Translator const& tr, Strategy const& s) { return tr.equals(v1, v2, s); } }; template struct count : public rtree::visitor::type { typedef typename Options::parameters_type parameters_type; typedef typename rtree::node::type node; typedef typename rtree::internal_node::type internal_node; typedef typename rtree::leaf::type leaf; typedef count_helper count_help; inline count(ValueOrIndexable const& vori, parameters_type const& parameters, Translator const& t) : value_or_indexable(vori), m_parameters(parameters), tr(t), found_count(0) {} inline void operator()(internal_node const& n) { typedef typename rtree::elements_type::type elements_type; elements_type const& elements = rtree::elements(n); // traverse nodes meeting predicates for (typename elements_type::const_iterator it = elements.begin(); it != elements.end(); ++it) { if ( index::detail::covered_by_bounds(count_help::indexable(value_or_indexable, tr), it->first, index::detail::get_strategy(m_parameters)) ) { rtree::apply_visitor(*this, *it->second); } } } inline void operator()(leaf const& n) { typedef typename rtree::elements_type::type elements_type; elements_type const& elements = rtree::elements(n); // get all values meeting predicates for (typename elements_type::const_iterator it = elements.begin(); it != elements.end(); ++it) { // if value meets predicates if ( count_help::equals(value_or_indexable, *it, tr, index::detail::get_strategy(m_parameters)) ) { ++found_count; } } } ValueOrIndexable const& value_or_indexable; parameters_type const& m_parameters; Translator const& tr; typename Allocators::size_type found_count; }; }}} // namespace detail::rtree::visitors }}} // namespace boost::geometry::index #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_VISITORS_COUNT_HPP