#pragma once #if !defined(MIJIN_UTIL_HASH_HPP_INCLUDED) #define MIJIN_UTIL_HASH_HPP_INCLUDED 1 #include #include #include namespace mijin { template> inline void hashCombine(std::size_t& seed, const T& value, const THasher& hasher = {}) { seed ^= hasher(value) + 0x9e3779b9 + (seed << 6) + (seed >> 2); } } template struct std::hash> { std::size_t operator()(const std::tuple& tuple) const noexcept { return hashImpl(tuple, std::index_sequence_for()); } template std::size_t hashImpl(const std::tuple& tuple, std::index_sequence) const noexcept { std::size_t result = 0; (mijin::hashCombine(result, std::get(tuple)), ...); return result; } }; #endif // MIJIN_UTIL_HASH_HPP_INCLUDED