1*e5dd7070Spatrick //===--- DeclAccessPair.h - A decl bundled with its path access -*- C++ -*-===// 2*e5dd7070Spatrick // 3*e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information. 5*e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*e5dd7070Spatrick // 7*e5dd7070Spatrick //===----------------------------------------------------------------------===// 8*e5dd7070Spatrick // 9*e5dd7070Spatrick // This file defines the DeclAccessPair class, which provides an 10*e5dd7070Spatrick // efficient representation of a pair of a NamedDecl* and an 11*e5dd7070Spatrick // AccessSpecifier. Generally the access specifier gives the 12*e5dd7070Spatrick // natural access of a declaration when named in a class, as 13*e5dd7070Spatrick // defined in C++ [class.access.base]p1. 14*e5dd7070Spatrick // 15*e5dd7070Spatrick //===----------------------------------------------------------------------===// 16*e5dd7070Spatrick 17*e5dd7070Spatrick #ifndef LLVM_CLANG_AST_DECLACCESSPAIR_H 18*e5dd7070Spatrick #define LLVM_CLANG_AST_DECLACCESSPAIR_H 19*e5dd7070Spatrick 20*e5dd7070Spatrick #include "clang/Basic/Specifiers.h" 21*e5dd7070Spatrick #include "llvm/Support/DataTypes.h" 22*e5dd7070Spatrick 23*e5dd7070Spatrick namespace clang { 24*e5dd7070Spatrick 25*e5dd7070Spatrick class NamedDecl; 26*e5dd7070Spatrick 27*e5dd7070Spatrick /// A POD class for pairing a NamedDecl* with an access specifier. 28*e5dd7070Spatrick /// Can be put into unions. 29*e5dd7070Spatrick class DeclAccessPair { 30*e5dd7070Spatrick uintptr_t Ptr; // we'd use llvm::PointerUnion, but it isn't trivial 31*e5dd7070Spatrick 32*e5dd7070Spatrick enum { Mask = 0x3 }; 33*e5dd7070Spatrick 34*e5dd7070Spatrick public: make(NamedDecl * D,AccessSpecifier AS)35*e5dd7070Spatrick static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS) { 36*e5dd7070Spatrick DeclAccessPair p; 37*e5dd7070Spatrick p.set(D, AS); 38*e5dd7070Spatrick return p; 39*e5dd7070Spatrick } 40*e5dd7070Spatrick getDecl()41*e5dd7070Spatrick NamedDecl *getDecl() const { 42*e5dd7070Spatrick return reinterpret_cast<NamedDecl*>(~Mask & Ptr); 43*e5dd7070Spatrick } getAccess()44*e5dd7070Spatrick AccessSpecifier getAccess() const { 45*e5dd7070Spatrick return AccessSpecifier(Mask & Ptr); 46*e5dd7070Spatrick } 47*e5dd7070Spatrick setDecl(NamedDecl * D)48*e5dd7070Spatrick void setDecl(NamedDecl *D) { 49*e5dd7070Spatrick set(D, getAccess()); 50*e5dd7070Spatrick } setAccess(AccessSpecifier AS)51*e5dd7070Spatrick void setAccess(AccessSpecifier AS) { 52*e5dd7070Spatrick set(getDecl(), AS); 53*e5dd7070Spatrick } set(NamedDecl * D,AccessSpecifier AS)54*e5dd7070Spatrick void set(NamedDecl *D, AccessSpecifier AS) { 55*e5dd7070Spatrick Ptr = uintptr_t(AS) | reinterpret_cast<uintptr_t>(D); 56*e5dd7070Spatrick } 57*e5dd7070Spatrick 58*e5dd7070Spatrick operator NamedDecl*() const { return getDecl(); } 59*e5dd7070Spatrick NamedDecl *operator->() const { return getDecl(); } 60*e5dd7070Spatrick }; 61*e5dd7070Spatrick } 62*e5dd7070Spatrick 63*e5dd7070Spatrick #endif 64