perf(templates): fix unclear overloading of HashCombine

This commit is contained in:
Redstone1024 2024-10-08 21:00:50 +08:00
parent 7a08385963
commit 3e93da7f44

View File

@ -22,10 +22,10 @@ FORCEINLINE constexpr size_t HashCombine(size_t A)
return A; return A;
} }
/** Combines two hash values to get a third. this function is not commutative. */ /** Combines more hash values to get a new value. this function is not commutative. */
FORCEINLINE constexpr size_t HashCombine(size_t A, size_t C) template <typename... Ts> requires (true && ... && CConvertibleTo<Ts, size_t>)
FORCEINLINE constexpr size_t HashCombine(size_t A, size_t C, Ts... InOther)
{ {
size_t B = static_cast<size_t>(0x9E3779B97F4A7C16); size_t B = static_cast<size_t>(0x9E3779B97F4A7C16);
A += B; A += B;
@ -40,15 +40,7 @@ FORCEINLINE constexpr size_t HashCombine(size_t A, size_t C)
B -= C; B -= A; B ^= (A << 10); B -= C; B -= A; B ^= (A << 10);
C -= A; C -= B; C ^= (B >> 15); C -= A; C -= B; C ^= (B >> 15);
return C; return HashCombine(C, InOther...);
}
/** Combines more hash values to get a new value. this function is not commutative. */
template <typename... Ts> requires (true && ... && CConvertibleTo<Ts, size_t>)
FORCEINLINE constexpr size_t HashCombine(size_t A, size_t C, Ts... InOther)
{
size_t B = HashCombine(A, C);
return HashCombine(B, InOther...);
} }
/** Overloads the GetTypeHash algorithm for CIntegral. */ /** Overloads the GetTypeHash algorithm for CIntegral. */