Home | History | Annotate | Line # | Download | only in AST
      1 //===- BaseSubobject.h - BaseSubobject class --------------------*- C++ -*-===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 // This file provides a definition of the BaseSubobject class.
     10 //
     11 //===----------------------------------------------------------------------===//
     12 
     13 #ifndef LLVM_CLANG_AST_BASESUBOBJECT_H
     14 #define LLVM_CLANG_AST_BASESUBOBJECT_H
     15 
     16 #include "clang/AST/CharUnits.h"
     17 #include "clang/AST/DeclCXX.h"
     18 #include "llvm/ADT/DenseMapInfo.h"
     19 #include "llvm/Support/type_traits.h"
     20 #include <cstdint>
     21 #include <utility>
     22 
     23 namespace clang {
     24 
     25 class CXXRecordDecl;
     26 
     27 // BaseSubobject - Uniquely identifies a direct or indirect base class.
     28 // Stores both the base class decl and the offset from the most derived class to
     29 // the base class. Used for vtable and VTT generation.
     30 class BaseSubobject {
     31   /// Base - The base class declaration.
     32   const CXXRecordDecl *Base;
     33 
     34   /// BaseOffset - The offset from the most derived class to the base class.
     35   CharUnits BaseOffset;
     36 
     37 public:
     38   BaseSubobject() = default;
     39   BaseSubobject(const CXXRecordDecl *Base, CharUnits BaseOffset)
     40       : Base(Base), BaseOffset(BaseOffset) {}
     41 
     42   /// getBase - Returns the base class declaration.
     43   const CXXRecordDecl *getBase() const { return Base; }
     44 
     45   /// getBaseOffset - Returns the base class offset.
     46   CharUnits getBaseOffset() const { return BaseOffset; }
     47 
     48   friend bool operator==(const BaseSubobject &LHS, const BaseSubobject &RHS) {
     49     return LHS.Base == RHS.Base && LHS.BaseOffset == RHS.BaseOffset;
     50  }
     51 };
     52 
     53 } // namespace clang
     54 
     55 namespace llvm {
     56 
     57 template<> struct DenseMapInfo<clang::BaseSubobject> {
     58   static clang::BaseSubobject getEmptyKey() {
     59     return clang::BaseSubobject(
     60       DenseMapInfo<const clang::CXXRecordDecl *>::getEmptyKey(),
     61       clang::CharUnits::fromQuantity(DenseMapInfo<int64_t>::getEmptyKey()));
     62   }
     63 
     64   static clang::BaseSubobject getTombstoneKey() {
     65     return clang::BaseSubobject(
     66       DenseMapInfo<const clang::CXXRecordDecl *>::getTombstoneKey(),
     67       clang::CharUnits::fromQuantity(DenseMapInfo<int64_t>::getTombstoneKey()));
     68   }
     69 
     70   static unsigned getHashValue(const clang::BaseSubobject &Base) {
     71     using PairTy = std::pair<const clang::CXXRecordDecl *, clang::CharUnits>;
     72 
     73     return DenseMapInfo<PairTy>::getHashValue(PairTy(Base.getBase(),
     74                                                      Base.getBaseOffset()));
     75   }
     76 
     77   static bool isEqual(const clang::BaseSubobject &LHS,
     78                       const clang::BaseSubobject &RHS) {
     79     return LHS == RHS;
     80   }
     81 };
     82 
     83 } // namespace llvm
     84 
     85 #endif // LLVM_CLANG_AST_BASESUBOBJECT_H
     86