18 inline void hash_combine(std::size_t& seed,
const T& v)
21 seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
29 template<
typename T1,
typename T2>
30 struct std::hash<std::pair<T1, T2>> {
31 std::size_t operator()(
const std::pair<T1, T2> &p)
const
34 hash_combine(hash, std::hash<T1>{}(p.first));
35 hash_combine(hash, std::hash<T2>{}(p.second));
44 struct std::hash<std::vector<T>> {
45 std::size_t operator()(
const std::vector<T> &v)
const
48 for (
const auto &elem : v) {
49 hash_combine(hash, std::hash<T>{}(elem));
58 template<
typename... Ts>
59 class std::hash<std::tuple<Ts...>> {
61 template <
size_t I,
size_t N>
62 static std::size_t Hash(
const std::tuple<Ts...> &t)
64 if constexpr (I < N) {
65 auto Elem = std::get<I>(t);
67 hash_combine(hash, std::hash<decltype(Elem)>()(Elem));
68 hash_combine(hash, Hash<I + 1, N>(t));
71 return std::size_t(0);
76 std::size_t operator()(
const std::tuple<Ts...> &t)
const
78 return Hash<0, std::tuple_size<std::tuple<Ts...>>::value>(t);