1111#include " utils_libs.hpp"
1212
1313namespace mstd {
14- template <class T >
15- void hash_combine (size_t & seed, const T& value) {
16- seed ^= std::hash<T>()(value) + 0x9e3779b9
17- + (seed << 6 ) + (seed >> 2 );
14+ template <class T , class ... Ts>
15+ void hash_append (size_t & hash_value, const T& value, const Ts&... values) {
16+ hash_value ^= std::hash<T>()(value) + 0x9e3779b9 + (hash_value << 6 ) + (hash_value >> 2 );
17+
18+ if constexpr (sizeof ...(Ts) != 0 ) {
19+ hash_append (hash_value, values...);
20+ }
1821 }
1922
20- template <class ... Ts>
21- void hash_combine (size_t & seed, const Ts&... values) {
22- (hash_combine (seed, values), ...);
23+ template <class T0 , class T1 , class ... Ts>
24+ size_t hash_combine (const T0& value0, const T1& value1, const Ts&... values) {
25+ size_t hash_value = 0 ;
26+ hash_append (hash_value, value0, value1, values...);
27+ return hash_value;
2328 }
2429
2530 template <class Iter >
26- void hash_combine (size_t & seed, const Iter& begin, const Iter& end) {
27- for (const Iter& i = begin; i != end; ++i) {
28- hash_combine (seed, *i);
31+ void hash_range (size_t & seed, const Iter& begin, const Iter& end) {
32+ for (Iter i = begin; i != end; ++i) {
33+ hash_append (seed, *i);
2934 }
3035 }
3136}
0 commit comments