Chris@102: // Boost.Geometry (aka GGL, Generic Geometry Library) Chris@102: Chris@102: // Copyright (c) 2014-2015, Oracle and/or its affiliates. Chris@102: Chris@102: // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle Chris@102: Chris@102: // Licensed under the Boost Software License version 1.0. Chris@102: // http://www.boost.org/users/license.html Chris@102: Chris@102: #ifndef BOOST_GEOMETRY_STRATEGIES_COMPARABLE_DISTANCE_RESULT_HPP Chris@102: #define BOOST_GEOMETRY_STRATEGIES_COMPARABLE_DISTANCE_RESULT_HPP Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: Chris@102: namespace boost { namespace geometry Chris@102: { Chris@102: Chris@102: namespace resolve_strategy Chris@102: { Chris@102: Chris@102: template Chris@102: struct comparable_distance_result Chris@102: : strategy::distance::services::return_type Chris@102: < Chris@102: typename strategy::distance::services::comparable_type Chris@102: < Chris@102: Strategy Chris@102: >::type, Chris@102: typename point_type::type, Chris@102: typename point_type::type Chris@102: > Chris@102: {}; Chris@102: Chris@102: template Chris@102: struct comparable_distance_result Chris@102: : comparable_distance_result Chris@102: < Chris@102: Geometry1, Chris@102: Geometry2, Chris@102: typename detail::distance::default_strategy Chris@102: < Chris@102: Geometry1, Geometry2 Chris@102: >::type Chris@102: > Chris@102: {}; Chris@102: Chris@102: } // namespace resolve_strategy Chris@102: Chris@102: Chris@102: namespace resolve_variant Chris@102: { Chris@102: Chris@102: template Chris@102: struct comparable_distance_result Chris@102: : resolve_strategy::comparable_distance_result Chris@102: < Chris@102: Geometry1, Chris@102: Geometry2, Chris@102: Strategy Chris@102: > Chris@102: {}; Chris@102: Chris@102: Chris@102: template Chris@102: < Chris@102: typename Geometry1, Chris@102: BOOST_VARIANT_ENUM_PARAMS(typename T), Chris@102: typename Strategy Chris@102: > Chris@102: struct comparable_distance_result Chris@102: < Chris@102: Geometry1, boost::variant, Strategy Chris@102: > Chris@102: { Chris@102: // A set of all variant type combinations that are compatible and Chris@102: // implemented Chris@102: typedef typename util::combine_if< Chris@102: typename boost::mpl::vector1, Chris@102: typename boost::variant::types, Chris@102: boost::mpl::always Chris@102: >::type possible_input_types; Chris@102: Chris@102: // The (possibly variant) result type resulting from these combinations Chris@102: typedef typename compress_variant< Chris@102: typename transform_variant< Chris@102: possible_input_types, Chris@102: resolve_strategy::comparable_distance_result< Chris@102: boost::mpl::first, Chris@102: boost::mpl::second, Chris@102: Strategy Chris@102: >, Chris@102: boost::mpl::back_inserter > Chris@102: >::type Chris@102: >::type type; Chris@102: }; Chris@102: Chris@102: Chris@102: // Distance arguments are commutative Chris@102: template Chris@102: < Chris@102: BOOST_VARIANT_ENUM_PARAMS(typename T), Chris@102: typename Geometry2, Chris@102: typename Strategy Chris@102: > Chris@102: struct comparable_distance_result Chris@102: < Chris@102: boost::variant, Chris@102: Geometry2, Chris@102: Strategy Chris@102: > : public comparable_distance_result Chris@102: < Chris@102: Geometry2, boost::variant, Strategy Chris@102: > Chris@102: {}; Chris@102: Chris@102: Chris@102: template Chris@102: struct comparable_distance_result Chris@102: < Chris@102: boost::variant, Chris@102: boost::variant, Chris@102: Strategy Chris@102: > Chris@102: { Chris@102: // A set of all variant type combinations that are compatible and Chris@102: // implemented Chris@102: typedef typename util::combine_if Chris@102: < Chris@102: typename boost::variant::types, Chris@102: typename boost::variant::types, Chris@102: boost::mpl::always Chris@102: >::type possible_input_types; Chris@102: Chris@102: // The (possibly variant) result type resulting from these combinations Chris@102: typedef typename compress_variant< Chris@102: typename transform_variant< Chris@102: possible_input_types, Chris@102: resolve_strategy::comparable_distance_result< Chris@102: boost::mpl::first, Chris@102: boost::mpl::second, Chris@102: Strategy Chris@102: >, Chris@102: boost::mpl::back_inserter > Chris@102: >::type Chris@102: >::type type; Chris@102: }; Chris@102: Chris@102: } // namespace resolve_variant Chris@102: Chris@102: Chris@102: Chris@102: Chris@102: Chris@102: /*! Chris@102: \brief Meta-function defining return type of comparable_distance function Chris@102: \ingroup distance Chris@102: */ Chris@102: template Chris@102: < Chris@102: typename Geometry1, Chris@102: typename Geometry2 = Geometry1, Chris@102: typename Strategy = void Chris@102: > Chris@102: struct comparable_distance_result Chris@102: : resolve_variant::comparable_distance_result Chris@102: < Chris@102: Geometry1, Geometry2, Strategy Chris@102: > Chris@102: {}; Chris@102: Chris@102: template Chris@102: struct comparable_distance_result Chris@102: : comparable_distance_result Chris@102: {}; Chris@102: Chris@102: Chris@102: }} // namespace boost::geometry Chris@102: Chris@102: Chris@102: #endif // BOOST_GEOMETRY_STRATEGIES_COMPARABLE_DISTANCE_RESULT_HPP