src/util/CustomHashFunctions.cpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // Copyright (c) 2021-2026 ChilliBits. All rights reserved. | ||
| 2 | |||
| 3 | #include "CustomHashFunctions.h" | ||
| 4 | |||
| 5 | #include <numeric> | ||
| 6 | #include <string> | ||
| 7 | |||
| 8 | #include <symboltablebuilder/Type.h> | ||
| 9 | #include <symboltablebuilder/TypeChain.h> | ||
| 10 | |||
| 11 | namespace spice::compiler { | ||
| 12 | |||
| 13 | 76686881 | uint64_t hashMix(uint64_t hash) noexcept { | |
| 14 | 76686881 | hash += 0x9e3779b97f4a7c15ull; | |
| 15 | 76686881 | hash = (hash ^ (hash >> 30)) * 0xbf58476d1ce4e5b9ull; | |
| 16 | 76686881 | hash = (hash ^ (hash >> 27)) * 0x94d049bb133111ebull; | |
| 17 | 76686881 | hash ^= (hash >> 31); | |
| 18 | 76686881 | return hash; | |
| 19 | } | ||
| 20 | |||
| 21 | 59301837 | void hashCombine64(uint64_t &hash, uint64_t value) noexcept { | |
| 22 | 59301837 | hash ^= hashMix(value + 0x9e3779b97f4a7c15ull + (hash << 6) + (hash >> 2)); | |
| 23 | 59301837 | } | |
| 24 | |||
| 25 | } // namespace spice::compiler | ||
| 26 | |||
| 27 | namespace std { | ||
| 28 | |||
| 29 | 7942620 | size_t hash<spice::compiler::TypeChainElement>::operator()(const spice::compiler::TypeChainElement &tce) const noexcept { | |
| 30 | using namespace spice::compiler; | ||
| 31 | 7942620 | uint64_t hash = 0; | |
| 32 | |||
| 33 | 7942620 | hashCombine64(hash, tce.superType); | |
| 34 | 7942620 | hashCombine64(hash, std::hash<std::string>{}(tce.subType)); | |
| 35 | 7942620 | hashCombine64(hash, tce.typeId); | |
| 36 | |||
| 37 |
4/4✓ Branch 6 → 7 taken 985 times.
✓ Branch 6 → 9 taken 95742 times.
✓ Branch 6 → 14 taken 763744 times.
✓ Branch 6 → 17 taken 7082149 times.
|
7942620 | switch (tce.superType) { |
| 38 | 985 | case TY_ARRAY: | |
| 39 | 985 | hashCombine64(hash, tce.data.arraySize); | |
| 40 | 985 | break; | |
| 41 | 95742 | case TY_FUNCTION: | |
| 42 | case TY_PROCEDURE: | ||
| 43 |
2/2✓ Branch 9 → 10 taken 244 times.
✓ Branch 9 → 11 taken 95498 times.
|
95742 | hashCombine64(hash, tce.data.hasCaptures ? 0xF00D1234ULL : 0xBAD0C0DEULL); |
| 44 | 95742 | break; | |
| 45 | 763744 | case TY_STRUCT: | |
| 46 | case TY_INTERFACE: | ||
| 47 | case TY_ENUM: | ||
| 48 | // Stable hash based on pointer identity, but randomized for safety | ||
| 49 | 763744 | hashCombine64(hash, hashPointer(tce.data.bodyScope)); | |
| 50 | 763744 | break; | |
| 51 | 7082149 | default: | |
| 52 | 7082149 | break; | |
| 53 | } | ||
| 54 | |||
| 55 | 7942620 | hashCombine64(hash, hashVector(tce.templateTypes)); | |
| 56 | 7942620 | hashCombine64(hash, hashVector(tce.paramTypes)); | |
| 57 | |||
| 58 | 7942620 | return hashMix(hash); | |
| 59 | } | ||
| 60 | |||
| 61 | 7771854 | size_t hash<spice::compiler::Type>::operator()(const spice::compiler::Type &t) const noexcept { | |
| 62 | using namespace spice::compiler; | ||
| 63 | 7771854 | uint64_t hash = 0; | |
| 64 | 7771854 | hashCombine64(hash, hashVector(t.typeChain)); | |
| 65 | 7771854 | return hashMix(hash); | |
| 66 | } | ||
| 67 | |||
| 68 | 835285 | size_t hash<spice::compiler::TypeQualifiers>::operator()(const spice::compiler::TypeQualifiers &qualifiers) const noexcept { | |
| 69 | using namespace spice::compiler; | ||
| 70 | 835285 | const uint8_t bits = (qualifiers.isConst << 0) | (qualifiers.isSigned << 1) | (qualifiers.isUnsigned << 2) | | |
| 71 | 835285 | (qualifiers.isHeap << 3) | (qualifiers.isPublic << 4) | (qualifiers.isInline << 5) | | |
| 72 | 835285 | (qualifiers.isComposition << 6); | |
| 73 | 835285 | return hashMix(bits); | |
| 74 | } | ||
| 75 | |||
| 76 | 835285 | size_t hash<spice::compiler::QualType>::operator()(const spice::compiler::QualType &qualType) const noexcept { | |
| 77 | using namespace spice::compiler; | ||
| 78 | 835285 | uint64_t seed = 0; | |
| 79 | |||
| 80 | // Hash type pointer content if possible | ||
| 81 | 835285 | hashCombine64(seed, std::hash<Type>{}(*qualType.getType())); | |
| 82 | |||
| 83 | 835285 | TypeQualifiers qualifiers = qualType.getQualifiers(); | |
| 84 | 835285 | qualifiers.isPublic = false; // Ignore the public qualifier for hashing | |
| 85 | 835285 | hashCombine64(seed, std::hash<TypeQualifiers>{}(qualifiers)); | |
| 86 | 835285 | return hashMix(seed); | |
| 87 | } | ||
| 88 | |||
| 89 | } // namespace std | ||
| 90 |