12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- // Copyright 2015-2019 Hans Dembinski
- //
- // Distributed under 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_HISTOGRAM_DETAIL_RELAXED_EQUAL_HPP
- #define BOOST_HISTOGRAM_DETAIL_RELAXED_EQUAL_HPP
- #include <boost/histogram/detail/priority.hpp>
- #include <type_traits>
- namespace boost {
- namespace histogram {
- namespace detail {
- struct relaxed_equal {
- template <class T, class U>
- constexpr auto impl(const T& t, const U& u, priority<1>) const noexcept
- -> decltype(t == u) const {
- return t == u;
- }
- // consider T and U not equal, if there is no operator== defined for them
- template <class T, class U>
- constexpr bool impl(const T&, const U&, priority<0>) const noexcept {
- return false;
- }
- // consider two T equal if they are stateless
- template <class T>
- constexpr bool impl(const T&, const T&, priority<0>) const noexcept {
- return std::is_empty<T>::value;
- }
- template <class T, class U>
- constexpr bool operator()(const T& t, const U& u) const noexcept {
- return impl(t, u, priority<1>{});
- }
- };
- } // namespace detail
- } // namespace histogram
- } // namespace boost
- #endif
|