1 //===--- BaseSubobject.h - BaseSubobject class ----------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file provides a definition of the BaseSubobject class. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_AST_BASESUBOBJECT_H 15 #define LLVM_CLANG_AST_BASESUBOBJECT_H 16 17 #include "clang/AST/CharUnits.h" 18 #include "clang/AST/DeclCXX.h" 19 #include "llvm/ADT/DenseMap.h" 20 #include "llvm/Support/DataTypes.h" 21 #include "llvm/Support/type_traits.h" 22 23 namespace clang { 24 // BaseSubobject - Uniquely identifies a direct or indirect base class. 25 // Stores both the base class decl and the offset from the most derived class to 26 // the base class. Used for vtable and VTT generation. 27 class BaseSubobject { 28 /// Base - The base class declaration. 29 const CXXRecordDecl *Base; 30 31 /// BaseOffset - The offset from the most derived class to the base class. 32 CharUnits BaseOffset; 33 34 public: BaseSubobject()35 BaseSubobject() { } BaseSubobject(const CXXRecordDecl * Base,CharUnits BaseOffset)36 BaseSubobject(const CXXRecordDecl *Base, CharUnits BaseOffset) 37 : Base(Base), BaseOffset(BaseOffset) { } 38 39 /// getBase - Returns the base class declaration. getBase()40 const CXXRecordDecl *getBase() const { return Base; } 41 42 /// getBaseOffset - Returns the base class offset. getBaseOffset()43 CharUnits getBaseOffset() const { return BaseOffset; } 44 45 friend bool operator==(const BaseSubobject &LHS, const BaseSubobject &RHS) { 46 return LHS.Base == RHS.Base && LHS.BaseOffset == RHS.BaseOffset; 47 } 48 }; 49 50 } // end namespace clang 51 52 namespace llvm { 53 54 template<> struct DenseMapInfo<clang::BaseSubobject> { 55 static clang::BaseSubobject getEmptyKey() { 56 return clang::BaseSubobject( 57 DenseMapInfo<const clang::CXXRecordDecl *>::getEmptyKey(), 58 clang::CharUnits::fromQuantity(DenseMapInfo<int64_t>::getEmptyKey())); 59 } 60 61 static clang::BaseSubobject getTombstoneKey() { 62 return clang::BaseSubobject( 63 DenseMapInfo<const clang::CXXRecordDecl *>::getTombstoneKey(), 64 clang::CharUnits::fromQuantity(DenseMapInfo<int64_t>::getTombstoneKey())); 65 } 66 67 static unsigned getHashValue(const clang::BaseSubobject &Base) { 68 typedef std::pair<const clang::CXXRecordDecl *, clang::CharUnits> PairTy; 69 return DenseMapInfo<PairTy>::getHashValue(PairTy(Base.getBase(), 70 Base.getBaseOffset())); 71 } 72 73 static bool isEqual(const clang::BaseSubobject &LHS, 74 const clang::BaseSubobject &RHS) { 75 return LHS == RHS; 76 } 77 }; 78 79 // It's OK to treat BaseSubobject as a POD type. 80 template <> struct isPodLike<clang::BaseSubobject> { 81 static const bool value = true; 82 }; 83 84 } 85 86 #endif 87