File indexing completed on 2026-05-10 08:36:31
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #ifndef LLVM_CLANG_AST_DECLACCESSPAIR_H
0018 #define LLVM_CLANG_AST_DECLACCESSPAIR_H
0019
0020 #include "clang/Basic/Specifiers.h"
0021 #include "llvm/Support/DataTypes.h"
0022 #include "llvm/Support/Endian.h"
0023
0024 namespace clang {
0025
0026 class NamedDecl;
0027
0028
0029
0030 class DeclAccessPair {
0031
0032
0033
0034
0035 llvm::support::detail::packed_endian_specific_integral<
0036 uint64_t, llvm::endianness::native, alignof(void *)>
0037 Ptr;
0038
0039 enum { ASMask = 0x3, Mask = 0x7 };
0040
0041 bool isDeclID() const { return (Ptr >> 2) & 0x1; }
0042
0043 public:
0044 static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS) {
0045 DeclAccessPair p;
0046 p.set(D, AS);
0047 return p;
0048 }
0049
0050 static DeclAccessPair makeLazy(uint64_t ID, AccessSpecifier AS) {
0051 DeclAccessPair p;
0052 p.Ptr = (ID << 3) | (0x1 << 2) | uint64_t(AS);
0053 return p;
0054 }
0055
0056 uint64_t getDeclID() const {
0057 assert(isDeclID());
0058 return (~Mask & Ptr) >> 3;
0059 }
0060
0061 NamedDecl *getDecl() const {
0062 assert(!isDeclID());
0063 return reinterpret_cast<NamedDecl*>(~Mask & Ptr);
0064 }
0065 AccessSpecifier getAccess() const { return AccessSpecifier(ASMask & Ptr); }
0066
0067 void setDecl(NamedDecl *D) {
0068 set(D, getAccess());
0069 }
0070 void setAccess(AccessSpecifier AS) {
0071 set(getDecl(), AS);
0072 }
0073 void set(NamedDecl *D, AccessSpecifier AS) {
0074 Ptr = uint64_t(AS) | reinterpret_cast<uint64_t>(D);
0075 }
0076
0077 operator NamedDecl*() const { return getDecl(); }
0078 NamedDecl *operator->() const { return getDecl(); }
0079 };
0080
0081
0082 static_assert(alignof(DeclAccessPair) == alignof(void *));
0083
0084 static_assert(std::is_standard_layout_v<DeclAccessPair> &&
0085 std::is_trivial_v<DeclAccessPair>);
0086 }
0087
0088 #endif