Files
clice/include/Support/Hash.h
2025-01-16 22:48:35 +08:00

42 lines
1.1 KiB
C++

#pragma once
#include "Struct.h"
#include "llvm/Support/HashBuilder.h"
namespace clice::refl {
template <typename T>
struct Hash {
static llvm::hash_code hash(const auto& value) {
return llvm::hash_value(value);
}
};
template <typename Value>
llvm::hash_code hash(const Value& value) {
return Hash<Value>::hash(value);
}
template <typename T>
struct Hash<std::vector<T>> {
static llvm::hash_code hash(const std::vector<T>& value) {
llvm::SmallVector<llvm::hash_code, 8> hashes;
hashes.reserve(value.size());
for(const auto& element: value) {
hashes.emplace_back(refl::hash(element));
}
return llvm::hash_combine_range(hashes.begin(), hashes.end());
};
};
template <reflectable_struct T>
struct Hash<T> {
static llvm::hash_code hash(const T& value) {
llvm::SmallVector<llvm::hash_code, 8> hashes;
foreach(value, [&](auto, const auto& member) { hashes.emplace_back(refl::hash(member)); });
return llvm::hash_combine_range(hashes.begin(), hashes.end());
}
};
} // namespace clice::refl