// Copyright 2005-2009 Daniel James. // Copyright 2021 Peter Dimov. // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #ifndef BOOST_HASH_DETAIL_HASH_TUPLE_LIKE_HPP #define BOOST_HASH_DETAIL_HASH_TUPLE_LIKE_HPP #include #include #include #include #include #include #if defined(BOOST_NO_CXX11_HDR_TUPLE) // no support for tuple-likes #else #include namespace boost { namespace hash_detail { template inline typename boost::enable_if_<(I == std::tuple_size::value), void>::type hash_combine_tuple_like( std::size_t&, T const& ) { } template inline typename boost::enable_if_<(I < std::tuple_size::value), void>::type hash_combine_tuple_like( std::size_t& seed, T const& v ) { using std::get; boost::hash_combine( seed, get( v ) ); boost::hash_detail::hash_combine_tuple_like( seed, v ); } template inline std::size_t hash_tuple_like( T const& v ) { std::size_t seed = 0; boost::hash_detail::hash_combine_tuple_like<0>( seed, v ); return seed; } } // namespace hash_detail #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1800) template inline typename boost::enable_if_< container_hash::is_tuple_like::value && !container_hash::is_range::value, std::size_t>::type hash_value( T const& v ) { return boost::hash_detail::hash_tuple_like( v ); } #else template inline std::size_t hash_value( std::tuple const& v ) { return boost::hash_detail::hash_tuple_like( v ); } #endif #else inline std::size_t hash_value( std::tuple<> const& v ) { return boost::hash_detail::hash_tuple_like( v ); } template inline std::size_t hash_value( std::tuple const& v ) { return boost::hash_detail::hash_tuple_like( v ); } template inline std::size_t hash_value( std::tuple const& v ) { return boost::hash_detail::hash_tuple_like( v ); } template inline std::size_t hash_value( std::tuple const& v ) { return boost::hash_detail::hash_tuple_like( v ); } template inline std::size_t hash_value( std::tuple const& v ) { return boost::hash_detail::hash_tuple_like( v ); } template inline std::size_t hash_value( std::tuple const& v ) { return boost::hash_detail::hash_tuple_like( v ); } template inline std::size_t hash_value( std::tuple const& v ) { return boost::hash_detail::hash_tuple_like( v ); } template inline std::size_t hash_value( std::tuple const& v ) { return boost::hash_detail::hash_tuple_like( v ); } template inline std::size_t hash_value( std::tuple const& v ) { return boost::hash_detail::hash_tuple_like( v ); } template inline std::size_t hash_value( std::tuple const& v ) { return boost::hash_detail::hash_tuple_like( v ); } template inline std::size_t hash_value( std::tuple const& v ) { return boost::hash_detail::hash_tuple_like( v ); } #endif // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) } // namespace boost #endif // #if defined(BOOST_NO_CXX11_HDR_TUPLE) #endif // #ifndef BOOST_HASH_DETAIL_HASH_TUPLE_LIKE_HPP