blob: af3acccff5296a47b32a3a5eeaba3019fbdf19f5 [file] [log] [blame]
//===--- IndexRecordHasher.h - Index record hashing -----------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_LIB_INDEX_INDEXRECORDHASHER_H
#define LLVM_CLANG_LIB_INDEX_INDEXRECORDHASHER_H
#include "clang/Basic/LLVM.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/Hashing.h"
namespace clang {
class ASTContext;
class Decl;
class DeclarationName;
class NestedNameSpecifier;
class QualType;
class Type;
template <typename> class CanQual;
typedef CanQual<Type> CanQualType;
namespace index {
class FileIndexRecord;
class IndexRecordHasher {
ASTContext &Ctx;
llvm::DenseMap<const void *, llvm::hash_code> HashByPtr;
public:
explicit IndexRecordHasher(ASTContext &Ctx) : Ctx(Ctx) {}
ASTContext &getASTContext() { return Ctx; }
llvm::hash_code hashRecord(const FileIndexRecord &Record);
llvm::hash_code hash(const Decl *D);
llvm::hash_code hash(QualType Ty);
llvm::hash_code hash(CanQualType Ty);
llvm::hash_code hash(DeclarationName Name);
llvm::hash_code hash(const NestedNameSpecifier *NNS);
private:
template <typename T>
llvm::hash_code tryCache(const void *Ptr, T Obj);
llvm::hash_code hashImpl(const Decl *D);
llvm::hash_code hashImpl(CanQualType Ty);
llvm::hash_code hashImpl(DeclarationName Name);
llvm::hash_code hashImpl(const NestedNameSpecifier *NNS);
};
} // end namespace index
} // end namespace clang
#endif