diff --git a/include/boost/geometry/strategies/distance_result.hpp b/include/boost/geometry/strategies/distance_result.hpp new file mode 100644 index 000000000..7630e45bc --- /dev/null +++ b/include/boost/geometry/strategies/distance_result.hpp @@ -0,0 +1,189 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands. +// Copyright (c) 2008-2014 Bruno Lalande, Paris, France. +// Copyright (c) 2009-2014 Mateusz Loskot, London, UK. +// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland. +// Copyright (c) 2014 Samuel Debionne, Grenoble, France. + +// This file was modified by Oracle on 2014. +// Modifications copyright (c) 2014, Oracle and/or its affiliates. + +// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle + +// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library +// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. + +// 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_STRATEGIES_DISTANCE_RESULT_HPP +#define BOOST_GEOMETRY_STRATEGIES_DISTANCE_RESULT_HPP + +#include +#include +#include + +#include + +#include + +#include +#include + +#include +#include +#include + +#include + + +namespace boost { namespace geometry +{ + + +namespace resolve_strategy { namespace result_of +{ + +template +struct distance + : strategy::distance::services::return_type + < + Strategy, + typename point_type::type, + typename point_type::type + > +{}; + +template +struct distance + : distance + < + Geometry1, + Geometry2, + typename detail::distance::default_strategy + < + Geometry1, Geometry2 + >::type + > +{}; + +}} // namespace resolve_strategy::result_of + + +namespace resolve_variant { namespace result_of +{ + +template +struct distance + : resolve_strategy::result_of::distance + < + Geometry1, + Geometry2, + Strategy + > +{}; + + +template +struct distance, Strategy> +{ + // A set of all variant type combinations that are compatible and implemented + typedef typename util::combine_if< + typename mpl::vector1, + typename variant::types, + // Here we want should remove most of the combinations that are not valid + // mostly to limit the size of the resulting MPL set. + // But is_implementedn is not ready for prime time + // + // util::is_implemented2 > + 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::result_of::distance< + point_type >, + point_type >, + Strategy + >, + mpl::back_inserter > + >::type + >::type type; +}; + + +// Distance arguments are commutative +template +struct distance, Geometry2, Strategy> + : public distance, Strategy> +{}; + + +template +struct distance, variant, Strategy> +{ + // A set of all variant type combinations that are compatible and implemented + typedef typename util::combine_if + < + typename variant::types, + typename variant::types, + // Here we want to try to remove most of the combinations that are not valid + // mostly to limit the size of the resulting MPL vector. + // But is_implementedn is not ready for prime time + // + // util::is_implemented2 > + 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::result_of::distance< + point_type >, + point_type >, + Strategy + >, + mpl::back_inserter > + >::type + >::type type; +}; + +}} // namespace resolve_variant::result_of + + +/*! +\brief Meta-function defining return type of distance function +\ingroup distance +\note The strategy defines the return-type (so this situation is different + from length, where distance is sqr/sqrt, but length always squared) + */ +template +< + typename Geometry1, + typename Geometry2 = Geometry1, + typename Strategy = void +> +struct distance_result +{ + typedef typename resolve_variant::result_of::distance + < + Geometry1, Geometry2, Strategy + >::type type; +}; + + +template +struct distance_result + : distance_result +{}; + + +}} // namespace boost::geometry + + +#endif // BOOST_GEOMETRY_STRATEGIES_DISTANCE_RESULT_HPP