text: // Boost.Geometry (aka GGL, Generic Geometry Library)
  
  // Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
  
  // This file was modified by Oracle on 2014.
  // Modifications copyright (c) 2014, Oracle and/or its affiliates.
  
  // 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)
  
  // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
  
  #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_LESS_HPP
  #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_LESS_HPP
  
  namespace boost { namespace geometry
  {
  
  #ifndef DOXYGEN_NO_DISPATCH
  namespace detail_dispatch { namespace relate {
  
  // TODO: Integrate it with geometry::less?
  
  template <typename Point1,
            typename Point2,
            std::size_t I = 0,
            std::size_t D = geometry::dimension<Point1>::value>
  struct less
  {
      static inline bool apply(Point1 const& left, Point2 const& right)
      {
          typename geometry::coordinate_type<Point1>::type
              cleft = geometry::get<I>(left);
          typename geometry::coordinate_type<Point2>::type
              cright = geometry::get<I>(right);
  
          if ( geometry::math::equals(cleft, cright) )
          {
              return less<Point1, Point2, I + 1, D>::apply(left, right);
          }
          else
          {
              return cleft < cright;
          }
      }
  };
  
  template <typename Point1, typename Point2, std::size_t D>
  struct less<Point1, Point2, D, D>
  {
      static inline bool apply(Point1 const&, Point2 const&)
      {
          return false;
      }
  };
  
  }} // namespace detail_dispatch::relate
  
  #endif
  
  #ifndef DOXYGEN_NO_DETAIL
  namespace detail { namespace relate {
  
  struct less
  {
      template <typename Point1, typename Point2>
      inline bool operator()(Point1 const& point1, Point2 const& point2) const
      {
          return detail_dispatch::relate::less<Point1, Point2>::apply(point1, point2);
      }
  };
  
  }} // namespace detail::relate
  #endif // DOXYGEN_NO_DETAIL
  
  }} // namespace boost::geometry
  
  #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_LESS_HPP
  