xref: /openbsd-src/gnu/llvm/clang/include/clang/AST/DeclAccessPair.h (revision e5dd70708596ae51455a0ffa086a00c5b29f8583)
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