Chris@16: // Boost.Geometry Index Chris@16: // Chris@16: // Spatial index distance predicates, calculators and checkers Chris@16: // used in nearest query - specialized for envelopes 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_DISTANCE_PREDICATES_HPP Chris@16: #define BOOST_GEOMETRY_INDEX_DETAIL_DISTANCE_PREDICATES_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { namespace geometry { namespace index { namespace detail { Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: // relations Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: template Chris@16: struct to_nearest Chris@16: { Chris@16: to_nearest(T const& v) : value(v) {} Chris@16: T value; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct to_centroid Chris@16: { Chris@16: to_centroid(T const& v) : value(v) {} Chris@16: T value; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct to_furthest Chris@16: { Chris@16: to_furthest(T const& v) : value(v) {} Chris@16: T value; Chris@16: }; Chris@16: Chris@16: // tags Chris@16: Chris@16: struct to_nearest_tag {}; Chris@16: struct to_centroid_tag {}; Chris@16: struct to_furthest_tag {}; Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: // relation traits and access Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: template Chris@16: struct relation Chris@16: { Chris@16: typedef T value_type; Chris@16: typedef to_nearest_tag tag; Chris@16: static inline T const& value(T const& v) { return v; } Chris@16: static inline T & value(T & v) { return v; } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct relation< to_nearest > Chris@16: { Chris@16: typedef T value_type; Chris@16: typedef to_nearest_tag tag; Chris@16: static inline T const& value(to_nearest const& r) { return r.value; } Chris@16: static inline T & value(to_nearest & r) { return r.value; } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct relation< to_centroid > Chris@16: { Chris@16: typedef T value_type; Chris@16: typedef to_centroid_tag tag; Chris@16: static inline T const& value(to_centroid const& r) { return r.value; } Chris@16: static inline T & value(to_centroid & r) { return r.value; } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct relation< to_furthest > Chris@16: { Chris@16: typedef T value_type; Chris@16: typedef to_furthest_tag tag; Chris@16: static inline T const& value(to_furthest const& r) { return r.value; } Chris@16: static inline T & value(to_furthest & r) { return r.value; } Chris@16: }; Chris@16: Chris@16: // ------------------------------------------------------------------ // Chris@16: // calculate_distance Chris@16: // ------------------------------------------------------------------ // Chris@16: Chris@16: template Chris@16: struct calculate_distance Chris@16: { Chris@16: BOOST_MPL_ASSERT_MSG((false), INVALID_PREDICATE_OR_TAG, (calculate_distance)); Chris@16: }; Chris@16: Chris@16: // this handles nearest() with default Point parameter, to_nearest() and bounds Chris@16: template Chris@101: struct calculate_distance< predicates::nearest, Indexable, Tag > Chris@16: { Chris@16: typedef detail::relation relation; Chris@16: typedef typename relation::value_type point_type; Chris@101: typedef typename geometry::default_comparable_distance_result::type result_type; Chris@16: Chris@101: static inline bool apply(predicates::nearest const& p, Indexable const& i, result_type & result) Chris@16: { Chris@101: result = geometry::comparable_distance(relation::value(p.point_or_relation), i); Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@101: struct calculate_distance< predicates::nearest< to_centroid >, Indexable, value_tag> Chris@16: { Chris@16: typedef Point point_type; Chris@101: typedef typename geometry::default_comparable_distance_result::type result_type; Chris@16: Chris@101: static inline bool apply(predicates::nearest< to_centroid > const& p, Indexable const& i, result_type & result) Chris@16: { Chris@16: result = index::detail::comparable_distance_centroid(p.point_or_relation.value, i); Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@101: struct calculate_distance< predicates::nearest< to_furthest >, Indexable, value_tag> Chris@16: { Chris@16: typedef Point point_type; Chris@101: typedef typename geometry::default_comparable_distance_result::type result_type; Chris@16: Chris@101: static inline bool apply(predicates::nearest< to_furthest > const& p, Indexable const& i, result_type & result) Chris@16: { Chris@16: result = index::detail::comparable_distance_far(p.point_or_relation.value, i); Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@101: struct calculate_distance< predicates::path, Indexable, Tag> Chris@16: { Chris@16: typedef typename index::detail::default_path_intersection_distance_type< Chris@16: Indexable, SegmentOrLinestring Chris@16: >::type result_type; Chris@16: Chris@101: static inline bool apply(predicates::path const& p, Indexable const& i, result_type & result) Chris@16: { Chris@16: return index::detail::path_intersection(i, p.geometry, result); Chris@16: } Chris@16: }; Chris@16: Chris@16: }}}} // namespace boost::geometry::index::detail Chris@16: Chris@16: #endif // BOOST_GEOMETRY_INDEX_RTREE_DISTANCE_PREDICATES_HPP