// Boost.Geometry Index // // R-tree count visitor implementation // // Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland. // // 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) { return geometry::equals(i, tr(v)); } }; 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) { return tr.equals(v1, v2); } }; template struct count : public rtree::visitor::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, Translator const& t) : value_or_indexable(vori), 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 ( geometry::covered_by( return_ref_or_bounds( count_help::indexable(value_or_indexable, tr)), it->first) ) { 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) ) { ++found_count; } } } ValueOrIndexable const& value_or_indexable; 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