GCC Code Coverage Report


Directory: ../
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 100.0% 45 / 0 / 45
Functions: 100.0% 6 / 0 / 6
Branches: 100.0% 6 / 0 / 6

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