// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details #pragma once #include #include #include namespace Luau::EqSat { template struct LanguageHash { size_t operator()(const T& t, decltype(std::hash{}(std::declval()))* = 0) const { return std::hash{}(t); } }; template size_t languageHash(const T& lang) { return LanguageHash{}(lang); } inline void hashCombine(size_t& seed, size_t hash) { // Golden Ratio constant used for better hash scattering // See https://softwareengineering.stackexchange.com/a/402543 seed ^= hash + 0x9e3779b9 + (seed << 6) + (seed >> 2); } template struct LanguageHash> { size_t operator()(const std::array& array) const { size_t seed = 0; for (const T& t : array) hashCombine(seed, languageHash(t)); return seed; } }; template struct LanguageHash> { size_t operator()(const std::vector& vector) const { size_t seed = 0; for (const T& t : vector) hashCombine(seed, languageHash(t)); return seed; } }; } // namespace Luau::EqSat