Chris@16: // Boost.Geometry Index Chris@16: // Chris@16: // Spatial query predicates definition and checks. Chris@16: // Chris@101: // Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland. Chris@16: // Chris@16: // Use, modification and distribution is subject to the Boost Software License, Chris@16: // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_GEOMETRY_INDEX_DETAIL_PREDICATES_HPP Chris@16: #define BOOST_GEOMETRY_INDEX_DETAIL_PREDICATES_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace geometry { namespace index { namespace detail { Chris@16: Chris@101: namespace predicates { Chris@101: Chris@16: // ------------------------------------------------------------------ // Chris@16: // predicates Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: template Chris@16: struct satisfies_impl Chris@16: { Chris@16: satisfies_impl(Fun f) : fun(f) {} Chris@16: Fun * fun; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct satisfies_impl Chris@16: { Chris@16: satisfies_impl(Fun const& f) : fun(f) {} Chris@16: Fun fun; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct satisfies Chris@16: : satisfies_impl::value> Chris@16: { Chris@16: typedef satisfies_impl::value> base; Chris@16: Chris@16: satisfies(Fun const& f) : base(f) {} Chris@16: satisfies(base const& b) : base(b) {} Chris@16: }; Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: struct contains_tag {}; Chris@16: struct covered_by_tag {}; Chris@16: struct covers_tag {}; Chris@16: struct disjoint_tag {}; Chris@16: struct intersects_tag {}; Chris@16: struct overlaps_tag {}; Chris@16: struct touches_tag {}; Chris@16: struct within_tag {}; Chris@16: Chris@16: template Chris@16: struct spatial_predicate Chris@16: { Chris@16: spatial_predicate(Geometry const& g) : geometry(g) {} Chris@16: Geometry geometry; Chris@16: }; Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@101: // CONSIDER: separated nearest<> and path<> may be replaced by Chris@101: // nearest_predicate Chris@101: // where Tag = point_tag | path_tag Chris@101: // IMPROVEMENT: user-defined nearest predicate allowing to define Chris@101: // all or only geometrical aspects of the search Chris@16: Chris@16: template Chris@16: struct nearest Chris@16: { Chris@16: nearest(PointOrRelation const& por, unsigned k) Chris@16: : point_or_relation(por) Chris@16: , count(k) Chris@16: {} Chris@16: PointOrRelation point_or_relation; Chris@16: unsigned count; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct path Chris@16: { Chris@16: path(SegmentOrLinestring const& g, unsigned k) Chris@16: : geometry(g) Chris@16: , count(k) Chris@16: {} Chris@16: SegmentOrLinestring geometry; Chris@16: unsigned count; Chris@16: }; Chris@16: Chris@101: } // namespace predicates Chris@101: Chris@16: // ------------------------------------------------------------------ // Chris@16: // predicate_check Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: template Chris@16: struct predicate_check Chris@16: { Chris@16: BOOST_MPL_ASSERT_MSG( Chris@16: (false), Chris@16: NOT_IMPLEMENTED_FOR_THIS_PREDICATE_OR_TAG, Chris@16: (predicate_check)); Chris@16: }; Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: template Chris@101: struct predicate_check, value_tag> Chris@16: { Chris@16: template Chris@101: static inline bool apply(predicates::satisfies const& p, Value const& v, Indexable const&) Chris@16: { Chris@16: return p.fun(v); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@101: struct predicate_check, value_tag> Chris@16: { Chris@16: template Chris@101: static inline bool apply(predicates::satisfies const& p, Value const& v, Indexable const&) Chris@16: { Chris@16: return !p.fun(v); Chris@16: } Chris@16: }; Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: template Chris@16: struct spatial_predicate_call Chris@16: { Chris@16: BOOST_MPL_ASSERT_MSG(false, NOT_IMPLEMENTED_FOR_THIS_TAG, (Tag)); Chris@16: }; Chris@16: Chris@16: template <> Chris@101: struct spatial_predicate_call Chris@16: { Chris@16: template Chris@16: static inline bool apply(G1 const& g1, G2 const& g2) Chris@16: { Chris@16: return geometry::within(g2, g1); Chris@16: } Chris@16: }; Chris@16: Chris@16: template <> Chris@101: struct spatial_predicate_call Chris@16: { Chris@16: template Chris@16: static inline bool apply(G1 const& g1, G2 const& g2) Chris@16: { Chris@16: return geometry::covered_by(g1, g2); Chris@16: } Chris@16: }; Chris@16: Chris@16: template <> Chris@101: struct spatial_predicate_call Chris@16: { Chris@16: template Chris@16: static inline bool apply(G1 const& g1, G2 const& g2) Chris@16: { Chris@16: return geometry::covered_by(g2, g1); Chris@16: } Chris@16: }; Chris@16: Chris@16: template <> Chris@101: struct spatial_predicate_call Chris@16: { Chris@16: template Chris@16: static inline bool apply(G1 const& g1, G2 const& g2) Chris@16: { Chris@16: return geometry::disjoint(g1, g2); Chris@16: } Chris@16: }; Chris@16: Chris@16: template <> Chris@101: struct spatial_predicate_call Chris@16: { Chris@16: template Chris@16: static inline bool apply(G1 const& g1, G2 const& g2) Chris@16: { Chris@16: return geometry::intersects(g1, g2); Chris@16: } Chris@16: }; Chris@16: Chris@16: template <> Chris@101: struct spatial_predicate_call Chris@16: { Chris@16: template Chris@16: static inline bool apply(G1 const& g1, G2 const& g2) Chris@16: { Chris@16: return geometry::overlaps(g1, g2); Chris@16: } Chris@16: }; Chris@16: Chris@16: template <> Chris@101: struct spatial_predicate_call Chris@16: { Chris@16: template Chris@16: static inline bool apply(G1 const& g1, G2 const& g2) Chris@16: { Chris@16: return geometry::touches(g1, g2); Chris@16: } Chris@16: }; Chris@16: Chris@16: template <> Chris@101: struct spatial_predicate_call Chris@16: { Chris@16: template Chris@16: static inline bool apply(G1 const& g1, G2 const& g2) Chris@16: { Chris@16: return geometry::within(g1, g2); Chris@16: } Chris@16: }; Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: // spatial predicate Chris@16: template Chris@101: struct predicate_check, value_tag> Chris@16: { Chris@101: typedef predicates::spatial_predicate Pred; Chris@16: Chris@16: template Chris@16: static inline bool apply(Pred const& p, Value const&, Indexable const& i) Chris@16: { Chris@16: return spatial_predicate_call::apply(i, p.geometry); Chris@16: } Chris@16: }; Chris@16: Chris@16: // negated spatial predicate Chris@16: template Chris@101: struct predicate_check, value_tag> Chris@16: { Chris@101: typedef predicates::spatial_predicate Pred; Chris@16: Chris@16: template Chris@16: static inline bool apply(Pred const& p, Value const&, Indexable const& i) Chris@16: { Chris@16: return !spatial_predicate_call::apply(i, p.geometry); Chris@16: } Chris@16: }; Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: template Chris@101: struct predicate_check, value_tag> Chris@16: { Chris@16: template Chris@101: static inline bool apply(predicates::nearest const&, Value const&, Box const&) Chris@16: { Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@101: struct predicate_check, value_tag> Chris@16: { Chris@16: template Chris@101: static inline bool apply(predicates::path const&, Value const&, Box const&) Chris@16: { Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: // predicates_check for bounds Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: template Chris@101: struct predicate_check, bounds_tag> Chris@16: { Chris@16: template Chris@101: static bool apply(predicates::satisfies const&, Value const&, Box const&) Chris@16: { Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: // NOT NEGATED Chris@16: // value_tag bounds_tag Chris@16: // --------------------------- Chris@16: // contains(I,G) contains(I,G) Chris@16: // covered_by(I,G) intersects(I,G) Chris@16: // covers(I,G) covers(I,G) Chris@16: // disjoint(I,G) !covered_by(I,G) Chris@16: // intersects(I,G) intersects(I,G) Chris@16: // overlaps(I,G) intersects(I,G) - possibly change to the version without border case, e.g. intersects_without_border(0,0x1,1, 1,1x2,2) should give false Chris@16: // touches(I,G) intersects(I,G) Chris@16: // within(I,G) intersects(I,G) - possibly change to the version without border case, e.g. intersects_without_border(0,0x1,1, 1,1x2,2) should give false Chris@16: Chris@16: // spatial predicate - default Chris@16: template Chris@101: struct predicate_check, bounds_tag> Chris@16: { Chris@101: typedef predicates::spatial_predicate Pred; Chris@16: Chris@16: template Chris@16: static inline bool apply(Pred const& p, Value const&, Indexable const& i) Chris@16: { Chris@101: return spatial_predicate_call::apply(i, p.geometry); Chris@16: } Chris@16: }; Chris@16: Chris@16: // spatial predicate - contains Chris@16: template Chris@101: struct predicate_check, bounds_tag> Chris@16: { Chris@101: typedef predicates::spatial_predicate Pred; Chris@16: Chris@16: template Chris@16: static inline bool apply(Pred const& p, Value const&, Indexable const& i) Chris@16: { Chris@101: return spatial_predicate_call::apply(i, p.geometry); Chris@16: } Chris@16: }; Chris@16: Chris@16: // spatial predicate - covers Chris@16: template Chris@101: struct predicate_check, bounds_tag> Chris@16: { Chris@101: typedef predicates::spatial_predicate Pred; Chris@16: Chris@16: template Chris@16: static inline bool apply(Pred const& p, Value const&, Indexable const& i) Chris@16: { Chris@101: return spatial_predicate_call::apply(i, p.geometry); Chris@16: } Chris@16: }; Chris@16: Chris@16: // spatial predicate - disjoint Chris@16: template Chris@101: struct predicate_check, bounds_tag> Chris@16: { Chris@101: typedef predicates::spatial_predicate Pred; Chris@16: Chris@16: template Chris@16: static inline bool apply(Pred const& p, Value const&, Indexable const& i) Chris@16: { Chris@101: return !spatial_predicate_call::apply(i, p.geometry); Chris@16: } Chris@16: }; Chris@16: Chris@16: // NEGATED Chris@16: // value_tag bounds_tag Chris@16: // --------------------------- Chris@16: // !contains(I,G) TRUE Chris@16: // !covered_by(I,G) !covered_by(I,G) Chris@16: // !covers(I,G) TRUE Chris@16: // !disjoint(I,G) !disjoint(I,G) Chris@16: // !intersects(I,G) !covered_by(I,G) Chris@16: // !overlaps(I,G) TRUE Chris@16: // !touches(I,G) !intersects(I,G) Chris@16: // !within(I,G) !within(I,G) Chris@16: Chris@16: // negated spatial predicate - default Chris@16: template Chris@101: struct predicate_check, bounds_tag> Chris@16: { Chris@101: typedef predicates::spatial_predicate Pred; Chris@16: Chris@16: template Chris@16: static inline bool apply(Pred const& p, Value const&, Indexable const& i) Chris@16: { Chris@16: return !spatial_predicate_call::apply(i, p.geometry); Chris@16: } Chris@16: }; Chris@16: Chris@16: // negated spatial predicate - contains Chris@16: template Chris@101: struct predicate_check, bounds_tag> Chris@16: { Chris@101: typedef predicates::spatial_predicate Pred; Chris@16: Chris@16: template Chris@16: static inline bool apply(Pred const& , Value const&, Indexable const& ) Chris@16: { Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: // negated spatial predicate - covers Chris@16: template Chris@101: struct predicate_check, bounds_tag> Chris@16: { Chris@101: typedef predicates::spatial_predicate Pred; Chris@16: Chris@16: template Chris@16: static inline bool apply(Pred const& , Value const&, Indexable const& ) Chris@16: { Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: // negated spatial predicate - intersects Chris@16: template Chris@101: struct predicate_check, bounds_tag> Chris@16: { Chris@101: typedef predicates::spatial_predicate Pred; Chris@16: Chris@16: template Chris@16: static inline bool apply(Pred const& p, Value const&, Indexable const& i) Chris@16: { Chris@101: return !spatial_predicate_call::apply(i, p.geometry); Chris@16: } Chris@16: }; Chris@16: Chris@16: // negated spatial predicate - overlaps Chris@16: template Chris@101: struct predicate_check, bounds_tag> Chris@16: { Chris@101: typedef predicates::spatial_predicate Pred; Chris@16: Chris@16: template Chris@16: static inline bool apply(Pred const& , Value const&, Indexable const& ) Chris@16: { Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: // negated spatial predicate - touches Chris@16: template Chris@101: struct predicate_check, bounds_tag> Chris@16: { Chris@101: typedef predicates::spatial_predicate Pred; Chris@16: Chris@16: template Chris@16: static inline bool apply(Pred const& p, Value const&, Indexable const& i) Chris@16: { Chris@101: return !spatial_predicate_call::apply(i, p.geometry); Chris@16: } Chris@16: }; Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: template Chris@101: struct predicate_check, bounds_tag> Chris@16: { Chris@16: template Chris@101: static inline bool apply(predicates::nearest const&, Value const&, Box const&) Chris@16: { Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@101: struct predicate_check, bounds_tag> Chris@16: { Chris@16: template Chris@101: static inline bool apply(predicates::path const&, Value const&, Box const&) Chris@16: { Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: // predicates_length Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: template Chris@16: struct predicates_length Chris@16: { Chris@16: static const unsigned value = 1; Chris@16: }; Chris@16: Chris@16: //template Chris@16: //struct predicates_length< std::pair > Chris@16: //{ Chris@16: // static const unsigned value = 2; Chris@16: //}; Chris@16: Chris@16: //template Chris@16: //struct predicates_length< boost::tuple > Chris@16: //{ Chris@16: // static const unsigned value = boost::tuples::length< boost::tuple >::value; Chris@16: //}; Chris@16: Chris@16: template Chris@16: struct predicates_length< boost::tuples::cons > Chris@16: { Chris@16: static const unsigned value = boost::tuples::length< boost::tuples::cons >::value; Chris@16: }; Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: // predicates_element Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: template Chris@16: struct predicates_element Chris@16: { Chris@16: BOOST_MPL_ASSERT_MSG((I < 1), INVALID_INDEX, (predicates_element)); Chris@16: typedef T type; Chris@16: static type const& get(T const& p) { return p; } Chris@16: }; Chris@16: Chris@16: //template Chris@16: //struct predicates_element< I, std::pair > Chris@16: //{ Chris@16: // BOOST_MPL_ASSERT_MSG((I < 2), INVALID_INDEX, (predicates_element)); Chris@16: // Chris@16: // typedef F type; Chris@16: // static type const& get(std::pair const& p) { return p.first; } Chris@16: //}; Chris@16: // Chris@16: //template Chris@16: //struct predicates_element< 1, std::pair > Chris@16: //{ Chris@16: // typedef S type; Chris@16: // static type const& get(std::pair const& p) { return p.second; } Chris@16: //}; Chris@16: // Chris@16: //template Chris@16: //struct predicates_element< I, boost::tuple > Chris@16: //{ Chris@16: // typedef boost::tuple predicate_type; Chris@16: // Chris@16: // typedef typename boost::tuples::element::type type; Chris@16: // static type const& get(predicate_type const& p) { return boost::get(p); } Chris@16: //}; Chris@16: Chris@16: template Chris@16: struct predicates_element< I, boost::tuples::cons > Chris@16: { Chris@16: typedef boost::tuples::cons predicate_type; Chris@16: Chris@16: typedef typename boost::tuples::element::type type; Chris@16: static type const& get(predicate_type const& p) { return boost::get(p); } Chris@16: }; Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: // predicates_check Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: //template Chris@16: //struct predicates_check_pair {}; Chris@16: // Chris@16: //template Chris@16: //struct predicates_check_pair Chris@16: //{ Chris@16: // template Chris@16: // static inline bool apply(PairPredicates const& , Value const& , Indexable const& ) Chris@16: // { Chris@16: // return true; Chris@16: // } Chris@16: //}; Chris@16: // Chris@16: //template Chris@16: //struct predicates_check_pair Chris@16: //{ Chris@16: // template Chris@16: // static inline bool apply(PairPredicates const& p, Value const& v, Indexable const& i) Chris@16: // { Chris@16: // return predicate_check::apply(p.first, v, i); Chris@16: // } Chris@16: //}; Chris@16: // Chris@16: //template Chris@16: //struct predicates_check_pair Chris@16: //{ Chris@16: // template Chris@16: // static inline bool apply(PairPredicates const& p, Value const& v, Indexable const& i) Chris@16: // { Chris@16: // return predicate_check::apply(p.second, v, i); Chris@16: // } Chris@16: //}; Chris@16: // Chris@16: //template Chris@16: //struct predicates_check_pair Chris@16: //{ Chris@16: // template Chris@16: // static inline bool apply(PairPredicates const& p, Value const& v, Indexable const& i) Chris@16: // { Chris@16: // return predicate_check::apply(p.first, v, i) Chris@16: // && predicate_check::apply(p.second, v, i); Chris@16: // } Chris@16: //}; Chris@16: Chris@16: template Chris@16: struct predicates_check_tuple Chris@16: { Chris@16: template Chris@16: static inline bool apply(TuplePredicates const& p, Value const& v, Indexable const& i) Chris@16: { Chris@16: return Chris@16: predicate_check< Chris@16: typename boost::tuples::element::type, Chris@16: Tag Chris@16: >::apply(boost::get(p), v, i) && Chris@16: predicates_check_tuple::apply(p, v, i); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct predicates_check_tuple Chris@16: { Chris@16: template Chris@16: static inline bool apply(TuplePredicates const& , Value const& , Indexable const& ) Chris@16: { Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct predicates_check_impl Chris@16: { Chris@16: static const bool check = First < 1 && Last <= 1 && First <= Last; Chris@16: BOOST_MPL_ASSERT_MSG((check), INVALID_INDEXES, (predicates_check_impl)); Chris@16: Chris@16: template Chris@16: static inline bool apply(Predicate const& p, Value const& v, Indexable const& i) Chris@16: { Chris@16: return predicate_check::apply(p, v, i); Chris@16: } Chris@16: }; Chris@16: Chris@16: //template Chris@16: //struct predicates_check_impl, Tag, First, Last> Chris@16: //{ Chris@16: // BOOST_MPL_ASSERT_MSG((First < 2 && Last <= 2 && First <= Last), INVALID_INDEXES, (predicates_check_impl)); Chris@16: // Chris@16: // template Chris@16: // static inline bool apply(std::pair const& p, Value const& v, Indexable const& i) Chris@16: // { Chris@16: // return predicate_check::apply(p.first, v, i) Chris@16: // && predicate_check::apply(p.second, v, i); Chris@16: // } Chris@16: //}; Chris@16: // Chris@16: //template < Chris@16: // typename T0, typename T1, typename T2, typename T3, typename T4, Chris@16: // typename T5, typename T6, typename T7, typename T8, typename T9, Chris@16: // typename Tag, unsigned First, unsigned Last Chris@16: //> Chris@16: //struct predicates_check_impl< Chris@16: // boost::tuple, Chris@16: // Tag, First, Last Chris@16: //> Chris@16: //{ Chris@16: // typedef boost::tuple predicates_type; Chris@16: // Chris@16: // static const unsigned pred_len = boost::tuples::length::value; Chris@16: // BOOST_MPL_ASSERT_MSG((First < pred_len && Last <= pred_len && First <= Last), INVALID_INDEXES, (predicates_check_impl)); Chris@16: // Chris@16: // template Chris@16: // static inline bool apply(predicates_type const& p, Value const& v, Indexable const& i) Chris@16: // { Chris@16: // return predicates_check_tuple< Chris@16: // predicates_type, Chris@16: // Tag, First, Last Chris@16: // >::apply(p, v, i); Chris@16: // } Chris@16: //}; Chris@16: Chris@16: template Chris@16: struct predicates_check_impl< Chris@16: boost::tuples::cons, Chris@16: Tag, First, Last Chris@16: > Chris@16: { Chris@16: typedef boost::tuples::cons predicates_type; Chris@16: Chris@16: static const unsigned pred_len = boost::tuples::length::value; Chris@16: static const bool check = First < pred_len && Last <= pred_len && First <= Last; Chris@16: BOOST_MPL_ASSERT_MSG((check), INVALID_INDEXES, (predicates_check_impl)); Chris@16: Chris@16: template Chris@16: static inline bool apply(predicates_type const& p, Value const& v, Indexable const& i) Chris@16: { Chris@16: return predicates_check_tuple< Chris@16: predicates_type, Chris@16: Tag, First, Last Chris@16: >::apply(p, v, i); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: inline bool predicates_check(Predicates const& p, Value const& v, Indexable const& i) Chris@16: { Chris@16: return detail::predicates_check_impl Chris@16: ::apply(p, v, i); Chris@16: } Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: // nearest predicate helpers Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: // predicates_is_nearest Chris@16: Chris@16: template Chris@16: struct predicates_is_distance Chris@16: { Chris@16: static const unsigned value = 0; Chris@16: }; Chris@16: Chris@16: template Chris@101: struct predicates_is_distance< predicates::nearest > Chris@16: { Chris@16: static const unsigned value = 1; Chris@16: }; Chris@16: Chris@16: template Chris@101: struct predicates_is_distance< predicates::path > Chris@16: { Chris@16: static const unsigned value = 1; Chris@16: }; Chris@16: Chris@16: // predicates_count_nearest Chris@16: Chris@16: template Chris@16: struct predicates_count_distance Chris@16: { Chris@16: static const unsigned value = predicates_is_distance::value; Chris@16: }; Chris@16: Chris@16: //template Chris@16: //struct predicates_count_distance< std::pair > Chris@16: //{ Chris@16: // static const unsigned value = predicates_is_distance::value Chris@16: // + predicates_is_distance::value; Chris@16: //}; Chris@16: Chris@16: template Chris@16: struct predicates_count_distance_tuple Chris@16: { Chris@16: static const unsigned value = Chris@16: predicates_is_distance::type>::value Chris@16: + predicates_count_distance_tuple::value; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct predicates_count_distance_tuple Chris@16: { Chris@16: static const unsigned value = Chris@16: predicates_is_distance::type>::value; Chris@16: }; Chris@16: Chris@16: //template Chris@16: //struct predicates_count_distance< boost::tuple > Chris@16: //{ Chris@16: // static const unsigned value = predicates_count_distance_tuple< Chris@16: // boost::tuple, Chris@16: // boost::tuples::length< boost::tuple >::value Chris@16: // >::value; Chris@16: //}; Chris@16: Chris@16: template Chris@16: struct predicates_count_distance< boost::tuples::cons > Chris@16: { Chris@16: static const unsigned value = predicates_count_distance_tuple< Chris@16: boost::tuples::cons, Chris@16: boost::tuples::length< boost::tuples::cons >::value Chris@16: >::value; Chris@16: }; Chris@16: Chris@16: // predicates_find_nearest Chris@16: Chris@16: template Chris@16: struct predicates_find_distance Chris@16: { Chris@16: static const unsigned value = predicates_is_distance::value ? 0 : 1; Chris@16: }; Chris@16: Chris@16: //template Chris@16: //struct predicates_find_distance< std::pair > Chris@16: //{ Chris@16: // static const unsigned value = predicates_is_distance::value ? 0 : Chris@16: // (predicates_is_distance::value ? 1 : 2); Chris@16: //}; Chris@16: Chris@16: template Chris@16: struct predicates_find_distance_tuple Chris@16: { Chris@16: static const bool is_found = predicates_find_distance_tuple::is_found Chris@16: || predicates_is_distance::type>::value; Chris@16: Chris@16: static const unsigned value = predicates_find_distance_tuple::is_found ? Chris@16: predicates_find_distance_tuple::value : Chris@16: (predicates_is_distance::type>::value ? Chris@16: N-1 : boost::tuples::length::value); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct predicates_find_distance_tuple Chris@16: { Chris@16: static const bool is_found = predicates_is_distance::type>::value; Chris@16: static const unsigned value = is_found ? 0 : boost::tuples::length::value; Chris@16: }; Chris@16: Chris@16: //template Chris@16: //struct predicates_find_distance< boost::tuple > Chris@16: //{ Chris@16: // static const unsigned value = predicates_find_distance_tuple< Chris@16: // boost::tuple, Chris@16: // boost::tuples::length< boost::tuple >::value Chris@16: // >::value; Chris@16: //}; Chris@16: Chris@16: template Chris@16: struct predicates_find_distance< boost::tuples::cons > Chris@16: { Chris@16: static const unsigned value = predicates_find_distance_tuple< Chris@16: boost::tuples::cons, Chris@16: boost::tuples::length< boost::tuples::cons >::value Chris@16: >::value; Chris@16: }; Chris@16: Chris@16: }}}} // namespace boost::geometry::index::detail Chris@16: Chris@16: #endif // BOOST_GEOMETRY_INDEX_DETAIL_PREDICATES_HPP