luau/EqSat/include/Luau/LanguageHash.h
Hunter Goldstein c799a548e4 Sync to version/652
> What's new?

* Fragment Autocomplete: a new API allows for type checking a small
  fragment of code against an existing file, significantly speeding up
  autocomplete performance in large files.

> New Solver

* E-Graphs have landed: this is an ongoing approach to make the new type solver
  simplify types in a more consistent and principled manner, based on
  similar work (e.g.: https://egraphs-good.github.io/).
* Adds support for exported / local user type functions.
* Fixes a set of bugs in which the new solver will fail to complete
  inference for simple expressions with just literals and operators.

> General

* It is now an explicit runtime error to `require` a path with a ".lua" or
  ".luau" extension, and the error message will suggest removing the extension.
  ```
  require("path/to/mymodule.lua")
  ```
* Fixes a bug in which whether two `Symbol`s are equal depends on
  whether the new solver is enabled.
2024-11-08 11:01:20 -08:00

58 lines
1.3 KiB
C++

// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
#pragma once
#include <cstddef>
#include <functional>
#include <unordered_set>
#include <vector>
namespace Luau::EqSat
{
template<typename T>
struct LanguageHash
{
size_t operator()(const T& t, decltype(std::hash<T>{}(std::declval<T>()))* = 0) const
{
return std::hash<T>{}(t);
}
};
template<typename T>
size_t languageHash(const T& lang)
{
return LanguageHash<T>{}(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<typename T, size_t I>
struct LanguageHash<std::array<T, I>>
{
size_t operator()(const std::array<T, I>& array) const
{
size_t seed = 0;
for (const T& t : array)
hashCombine(seed, languageHash(t));
return seed;
}
};
template<typename T>
struct LanguageHash<std::vector<T>>
{
size_t operator()(const std::vector<T>& vector) const
{
size_t seed = 0;
for (const T& t : vector)
hashCombine(seed, languageHash(t));
return seed;
}
};
} // namespace Luau::EqSat