diff --git a/include/boost/geometry/strategies/comparable_distance_result.hpp b/include/boost/geometry/strategies/comparable_distance_result.hpp index 117f59a2f..a258ddb9b 100644 --- a/include/boost/geometry/strategies/comparable_distance_result.hpp +++ b/include/boost/geometry/strategies/comparable_distance_result.hpp @@ -10,10 +10,20 @@ #ifndef BOOST_GEOMETRY_STRATEGIES_COMPARABLE_DISTANCE_RESULT_HPP #define BOOST_GEOMETRY_STRATEGIES_COMPARABLE_DISTANCE_RESULT_HPP -#include +#include +#include +#include + +#include + +#include + #include #include -#include + +#include +#include +#include #include @@ -21,6 +31,141 @@ namespace boost { namespace geometry { +namespace resolve_strategy +{ + +template +struct comparable_distance_result + : strategy::distance::services::return_type + < + typename strategy::distance::services::comparable_type + < + Strategy + >::type, + typename point_type::type, + typename point_type::type + > +{}; + +template +struct comparable_distance_result + : comparable_distance_result + < + Geometry1, + Geometry2, + typename detail::distance::default_strategy + < + Geometry1, Geometry2 + >::type + > +{}; + +} // namespace resolve_strategy + + +namespace resolve_variant +{ + +template +struct comparable_distance_result + : resolve_strategy::comparable_distance_result + < + Geometry1, + Geometry2, + Strategy + > +{}; + + +template +< + typename Geometry1, + BOOST_VARIANT_ENUM_PARAMS(typename T), + typename Strategy +> +struct comparable_distance_result + < + Geometry1, boost::variant, Strategy + > +{ + // A set of all variant type combinations that are compatible and + // implemented + typedef typename util::combine_if< + typename mpl::vector1, + typename boost::variant::types, + mpl::always + >::type possible_input_types; + + // The (possibly variant) result type resulting from these combinations + typedef typename compress_variant< + typename transform_variant< + possible_input_types, + resolve_strategy::comparable_distance_result< + mpl::first, + mpl::second, + Strategy + >, + mpl::back_inserter > + >::type + >::type type; +}; + + +// Distance arguments are commutative +template +< + BOOST_VARIANT_ENUM_PARAMS(typename T), + typename Geometry2, + typename Strategy +> +struct comparable_distance_result + < + boost::variant, + Geometry2, + Strategy + > : public comparable_distance_result + < + Geometry2, boost::variant, Strategy + > +{}; + + +template +struct comparable_distance_result + < + boost::variant, + boost::variant, + Strategy + > +{ + // A set of all variant type combinations that are compatible and + // implemented + typedef typename util::combine_if + < + typename boost::variant::types, + typename boost::variant::types, + mpl::always + >::type possible_input_types; + + // The (possibly variant) result type resulting from these combinations + typedef typename compress_variant< + typename transform_variant< + possible_input_types, + resolve_strategy::comparable_distance_result< + mpl::first, + mpl::second, + Strategy + >, + mpl::back_inserter > + >::type + >::type type; +}; + +} // namespace resolve_variant + + + + /*! \brief Meta-function defining return type of comparable_distance function @@ -33,32 +178,15 @@ template typename Strategy = void > struct comparable_distance_result - : distance_result + : resolve_variant::comparable_distance_result < - Geometry1, - Geometry2, - typename strategy::distance::services::comparable_type - < - Strategy - >::type + Geometry1, Geometry2, Strategy > {}; -template -struct comparable_distance_result - : distance_result -{}; - -template -struct comparable_distance_result - < - Geometry1, Geometry2, default_comparable_strategy - > : distance_result -{}; - template struct comparable_distance_result - : distance_result + : comparable_distance_result {};