Chris@16: // Boost.Geometry Index Chris@16: // Chris@101: // Copyright (c) 2011-2014 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@101: #include Chris@16: Chris@101: namespace boost { namespace geometry { namespace index { namespace detail { Chris@16: Chris@101: template ::type> Chris@101: struct equals Chris@101: { Chris@101: inline static bool apply(Geometry const& g1, Geometry const& g2) Chris@101: { Chris@101: return geometry::equals(g1, g2); Chris@101: } Chris@101: }; Chris@16: Chris@16: template Chris@101: struct equals Chris@16: { Chris@101: inline static bool apply(const Geometry * g1, const Geometry * g2) Chris@16: { Chris@101: return g1 == g2; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct equals Chris@16: { Chris@101: inline 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@101: Chris@101: return equals::apply(boost::get(t1), boost::get(t2)) Chris@101: && 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@101: // TODO: Consider this: Since equal_to<> is using geometry::equals() it's possible that Chris@101: // two compared Indexables are not exactly the same! They will be spatially equal Chris@101: // but not strictly equal. Consider 2 Segments with reversed order of points. Chris@101: // Therefore it's possible that during the Value removal different value will be Chris@101: // removed than the one that was passed. 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@101: \tparam IsIndexable If true, Values are compared using boost::geometry::equals() functions. Chris@16: */ Chris@101: template ::value> 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@101: inline bool operator()(Value const& l, Value const& r) const Chris@16: { Chris@101: return detail::equals::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@101: struct equal_to, false> 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@101: inline bool operator()(std::pair const& l, std::pair const& r) const Chris@16: { Chris@101: return detail::equals::apply(l.first, r.first) Chris@101: && detail::equals::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@101: struct equal_to, false> 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@101: inline 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@101: }}}} // namespace boost::geometry::index::detail 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@101: namespace boost { namespace geometry { namespace index { 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@101: Chris@101: return equals::apply(std::get(t1), std::get(t2)) Chris@101: && 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: /*! 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@101: struct equal_to, false> 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@101: }}}} // namespace boost::geometry::index::detail Chris@16: Chris@16: #endif // !defined(BOOST_NO_CXX11_HDR_TUPLE) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) Chris@16: Chris@101: namespace boost { namespace geometry { namespace index { Chris@101: Chris@101: /*! Chris@101: \brief The function object comparing Values. Chris@101: Chris@101: The default version handles Values which are Indexables, std::pair, boost::tuple<...> Chris@101: and std::tuple<...> if STD tuples and variadic templates are supported. Chris@101: All members are compared from left to right, Geometries using boost::geometry::equals() function, Chris@101: other types using operator==. Chris@101: Chris@101: \tparam Value The type of objects which are compared by this function object. Chris@101: */ Chris@101: template Chris@101: struct equal_to Chris@101: : detail::equal_to Chris@101: { Chris@101: /*! \brief The type of result returned by function object. */ Chris@101: typedef typename detail::equal_to::result_type result_type; Chris@101: Chris@101: /*! Chris@101: \brief Compare Values. Chris@101: Chris@101: \param l First value. Chris@101: \param r Second value. Chris@101: \return true if Values are equal. Chris@101: */ Chris@101: inline bool operator()(Value const& l, Value const& r) const Chris@101: { Chris@101: return detail::equal_to::operator()(l ,r); Chris@101: } Chris@101: }; Chris@101: Chris@101: }}} // namespace boost::geometry::index Chris@101: Chris@16: #endif // BOOST_GEOMETRY_INDEX_EQUAL_TO_HPP