1 /*! 2 @file 3 Forward declares `boost::hana::comparing`. 4 5 @copyright Louis Dionne 2013-2017 6 Distributed under the Boost Software License, Version 1.0. 7 (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) 8 */ 9 10 #ifndef BOOST_HANA_FWD_COMPARING_HPP 11 #define BOOST_HANA_FWD_COMPARING_HPP 12 13 #include <boost/hana/config.hpp> 14 15 16 BOOST_HANA_NAMESPACE_BEGIN 17 //! Returns a function performing `equal` after applying a transformation 18 //! to both arguments. 19 //! @ingroup group-Comparable 20 //! 21 //! `comparing` creates an equivalence relation based on the result of 22 //! applying a function to some objects, which is especially useful in 23 //! conjunction with algorithms that accept a custom predicate that must 24 //! represent an equivalence relation. 25 //! 26 //! Specifically, `comparing` is such that 27 //! @code 28 //! comparing(f) == equal ^on^ f 29 //! @endcode 30 //! or, equivalently, 31 //! @code 32 //! comparing(f)(x, y) == equal(f(x), f(y)) 33 //! @endcode 34 //! 35 //! @note 36 //! This is not a tag-dispatched method (hence it can't be customized), 37 //! but just a convenience function provided with the `Comparable` concept. 38 //! 39 //! 40 //! Signature 41 //! --------- 42 //! Given a Logical `Bool` and a Comparable `B`, the signature is 43 //! @f$ \mathtt{comparing} : (A \to B) \to (A \times A \to Bool) @f$. 44 //! 45 //! 46 //! Example 47 //! ------- 48 //! @include example/comparing.cpp 49 #ifdef BOOST_HANA_DOXYGEN_INVOKED __anon44c63d120102(auto&& f) 50 constexpr auto comparing = [](auto&& f) { 51 return [perfect-capture](auto&& x, auto&& y) { 52 return equal(f(forwarded(x)), f(forwarded(y))); 53 }; 54 }; 55 #else 56 struct comparing_t { 57 template <typename F> 58 constexpr auto operator()(F&& f) const; 59 }; 60 61 constexpr comparing_t comparing{}; 62 #endif 63 BOOST_HANA_NAMESPACE_END 64 65 #endif // !BOOST_HANA_FWD_COMPARING_HPP 66