#pragma once #include "Struct.h" #include "llvm/Support/HashBuilder.h" namespace clice::refl { template struct Hash { static llvm::hash_code hash(const auto& value) { return llvm::hash_value(value); } }; template llvm::hash_code hash(const Value& value) { return Hash::hash(value); } template struct Hash> { static llvm::hash_code hash(const std::vector& value) { llvm::SmallVector 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 struct Hash { static llvm::hash_code hash(const T& value) { llvm::SmallVector 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