Chris@16: // Boost.Geometry Index Chris@16: // Chris@16: // Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland. Chris@16: // Chris@16: // Use, modification and distribution is subject to the Boost Software License, Chris@16: // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_GEOMETRY_INDEX_EQUAL_TO_HPP Chris@16: #define BOOST_GEOMETRY_INDEX_EQUAL_TO_HPP Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { namespace geometry { namespace index { Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: template Chris@16: struct equals Chris@16: { Chris@16: static bool apply(Geometry const& g1, Geometry const& g2) Chris@16: { Chris@16: return geometry::equals(g1, g2); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct equals Chris@16: { Chris@16: static bool apply(T const& v1, T const& v2) Chris@16: { Chris@16: return v1 == v2; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct tuple_equals Chris@16: { Chris@16: inline static bool apply(Tuple const& t1, Tuple const& t2) Chris@16: { Chris@16: typedef typename boost::tuples::element::type T; Chris@16: return Chris@16: equals< Chris@16: T, typename geometry::traits::tag::type Chris@16: >::apply(boost::get(t1), boost::get(t2)) Chris@16: && Chris@16: tuple_equals::apply(t1, t2); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct tuple_equals Chris@16: { Chris@16: inline static bool apply(Tuple const&, Tuple const&) Chris@16: { Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: /*! Chris@16: \brief The function object comparing Values. Chris@16: Chris@16: It compares Geometries using geometry::equals() function. Other types are compared using operator==. Chris@16: The default version handles Values which are Indexables. Chris@16: This template is also specialized for std::pair and boost::tuple<...>. Chris@16: Chris@16: \tparam Value The type of objects which are compared by this function object. Chris@16: */ Chris@16: template Chris@16: struct equal_to Chris@16: { Chris@16: /*! \brief The type of result returned by function object. */ Chris@16: typedef bool result_type; Chris@16: Chris@16: /*! Chris@16: \brief Compare values. If Value is a Geometry geometry::equals() function is used. Chris@16: Chris@16: \param l First value. Chris@16: \param r Second value. Chris@16: \return true if values are equal. Chris@16: */ Chris@16: bool operator()(Value const& l, Value const& r) const Chris@16: { Chris@16: return detail::equals::type>::apply(l ,r); Chris@16: } Chris@16: }; Chris@16: Chris@16: /*! Chris@16: \brief The function object comparing Values. Chris@16: Chris@16: This specialization compares values of type std::pair. Chris@16: It compares pairs' first values, then second values. Chris@16: Chris@16: \tparam T1 The first type. Chris@16: \tparam T2 The second type. Chris@16: */ Chris@16: template Chris@16: struct equal_to< std::pair > Chris@16: { Chris@16: /*! \brief The type of result returned by function object. */ Chris@16: typedef bool result_type; Chris@16: Chris@16: /*! Chris@16: \brief Compare values. If pair<> Value member is a Geometry geometry::equals() function is used. Chris@16: Chris@16: \param l First value. Chris@16: \param r Second value. Chris@16: \return true if values are equal. Chris@16: */ Chris@16: bool operator()(std::pair const& l, std::pair const& r) const Chris@16: { Chris@16: typedef detail::equals::type> equals1; Chris@16: typedef detail::equals::type> equals2; Chris@16: Chris@16: return equals1::apply(l.first, r.first) && equals2::apply(l.second, r.second); Chris@16: } Chris@16: }; Chris@16: Chris@16: /*! Chris@16: \brief The function object comparing Values. Chris@16: Chris@16: This specialization compares values of type boost::tuple<...>. Chris@16: It compares all members of the tuple from the first one to the last one. Chris@16: */ Chris@16: template Chris@16: struct equal_to< boost::tuple > Chris@16: { Chris@16: typedef boost::tuple value_type; Chris@16: Chris@16: /*! \brief The type of result returned by function object. */ Chris@16: typedef bool result_type; Chris@16: Chris@16: /*! Chris@16: \brief Compare values. If tuple<> Value member is a Geometry geometry::equals() function is used. Chris@16: Chris@16: \param l First value. Chris@16: \param r Second value. Chris@16: \return true if values are equal. Chris@16: */ Chris@16: bool operator()(value_type const& l, value_type const& r) const Chris@16: { Chris@16: return detail::tuple_equals< Chris@16: value_type, 0, boost::tuples::length::value Chris@16: >::apply(l ,r); Chris@16: } Chris@16: }; Chris@16: Chris@16: }}} // namespace boost::geometry::index Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_HDR_TUPLE) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { namespace geometry { namespace index { Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: template Chris@16: struct std_tuple_equals Chris@16: { Chris@16: inline static bool apply(Tuple const& t1, Tuple const& t2) Chris@16: { Chris@16: typedef typename std::tuple_element::type T; Chris@16: return Chris@16: equals< Chris@16: T, typename geometry::traits::tag::type Chris@16: >::apply(std::get(t1), std::get(t2)) Chris@16: && Chris@16: std_tuple_equals::apply(t1, t2); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct std_tuple_equals Chris@16: { Chris@16: inline static bool apply(Tuple const&, Tuple const&) Chris@16: { Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: /*! Chris@16: \brief The function object comparing Values. Chris@16: Chris@16: This specialization compares values of type std::tuple. Chris@16: It's defined if the compiler supports tuples and variadic templates. Chris@16: It compares all members of the tuple from the first one to the last one. Chris@16: */ Chris@16: template Chris@16: struct equal_to< std::tuple > Chris@16: { Chris@16: typedef std::tuple value_type; Chris@16: Chris@16: /*! \brief The type of result returned by function object. */ Chris@16: typedef bool result_type; Chris@16: Chris@16: /*! Chris@16: \brief Compare values. If tuple<> Value member is a Geometry geometry::equals() function is used. Chris@16: Chris@16: \param l First value. Chris@16: \param r Second value. Chris@16: \return true if values are equal. Chris@16: */ Chris@16: bool operator()(value_type const& l, value_type const& r) const Chris@16: { Chris@16: return detail::std_tuple_equals< Chris@16: value_type, 0, std::tuple_size::value Chris@16: >::apply(l ,r); Chris@16: } Chris@16: }; Chris@16: Chris@16: }}} // namespace boost::geometry::index Chris@16: Chris@16: #endif // !defined(BOOST_NO_CXX11_HDR_TUPLE) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) Chris@16: Chris@16: #endif // BOOST_GEOMETRY_INDEX_EQUAL_TO_HPP