// 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 #include namespace boost { namespace histogram { namespace detail { struct relaxed_equal { template 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 constexpr bool impl(const T&, const U&, priority<0>) const noexcept { return false; } // consider two T equal if they are stateless template constexpr bool impl(const T&, const T&, priority<0>) const noexcept { return std::is_empty::value; } template constexpr bool operator()(const T& t, const U& u) const noexcept { return impl(t, u, priority<1>{}); } }; } // namespace detail } // namespace histogram } // namespace boost #endif