// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. // Copyright (c) 2009-2012 Mateusz Loskot, London, UK. // 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_COMPARE_HPP #define BOOST_GEOMETRY_STRATEGIES_COMPARE_HPP #include #include #include #include #include #include namespace boost { namespace geometry { /*! \brief Traits class binding a comparing strategy to a coordinate system \ingroup util \tparam Tag tag of coordinate system of point-type \tparam Direction direction to compare on: 1 for less (-> ascending order) and -1 for greater (-> descending order) \tparam Point point-type \tparam CoordinateSystem coordinate sytem of point \tparam Dimension: the dimension to compare on */ template < typename Tag, int Direction, typename Point, typename CoordinateSystem, std::size_t Dimension > struct strategy_compare { typedef strategy::not_implemented type; }; #ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS // For compare we add defaults specializations, // because they defaultly redirect to std::less / greater / equal_to template < typename Tag, typename Point, typename CoordinateSystem, std::size_t Dimension > struct strategy_compare { typedef std::less::type> type; }; template < typename Tag, typename Point, typename CoordinateSystem, std::size_t Dimension > struct strategy_compare { typedef std::greater::type> type; }; template < typename Tag, typename Point, typename CoordinateSystem, std::size_t Dimension > struct strategy_compare { typedef std::equal_to::type> type; }; #endif namespace strategy { namespace compare { /*! \brief Default strategy, indicates the default strategy for comparisons \details The default strategy for comparisons defer in most cases to std::less (for ascending) and std::greater (for descending). However, if a spherical coordinate system is used, and comparison is done on longitude, it will take another strategy handling circular */ struct default_strategy {}; #ifndef DOXYGEN_NO_DETAIL namespace detail { template struct is_default : boost::false_type {}; template <> struct is_default : boost::true_type {}; /*! \brief Meta-function to select strategy \details If "default_strategy" is specified, it will take the traits-registered class for the specified coordinate system. If another strategy is explicitly specified, it takes that one. */ template < typename Strategy, int Direction, typename Point, std::size_t Dimension > struct select_strategy { typedef typename boost::mpl::if_ < is_default, typename strategy_compare < typename cs_tag::type, Direction, Point, typename coordinate_system::type, Dimension >::type, Strategy >::type type; }; } // namespace detail #endif // DOXYGEN_NO_DETAIL }} // namespace strategy::compare }} // namespace boost::geometry #endif // BOOST_GEOMETRY_STRATEGIES_COMPARE_HPP