diff --git a/EqSat/include/Luau/Language.h b/EqSat/include/Luau/Language.h index 12f36c92..9e180383 100644 --- a/EqSat/include/Luau/Language.h +++ b/EqSat/include/Luau/Language.h @@ -2,6 +2,7 @@ #pragma once #include "Luau/Id.h" +#include "Luau/LanguageHash.h" #include "Luau/Slice.h" #include @@ -45,22 +46,6 @@ namespace Luau::EqSat { -template -struct LanguageHash -{ - size_t operator()(const T&) const - { - // See available specializations at the bottom of this file. - static_assert(false, "missing languageHash specialization"); - } -}; - -template -std::size_t languageHash(const T& lang) -{ - return LanguageHash{}(lang); -} - template struct Atom { @@ -401,44 +386,4 @@ public: }; }; -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{}(std::declval()))>> -{ - size_t operator()(const T& t) const - { - return std::hash{}(t); - } -}; - -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 diff --git a/EqSat/include/Luau/LanguageHash.h b/EqSat/include/Luau/LanguageHash.h new file mode 100644 index 00000000..80bf8922 --- /dev/null +++ b/EqSat/include/Luau/LanguageHash.h @@ -0,0 +1,55 @@ +// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details +#pragma once + +#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 diff --git a/Sources.cmake b/Sources.cmake index 902002f2..dee795f1 100644 --- a/Sources.cmake +++ b/Sources.cmake @@ -300,6 +300,7 @@ target_sources(Luau.EqSat PRIVATE EqSat/include/Luau/EGraph.h EqSat/include/Luau/Id.h EqSat/include/Luau/Language.h + EqSat/include/Luau/LanguageHash.h EqSat/include/Luau/Slice.h EqSat/include/Luau/UnionFind.h