clang  6.0.0svn
ASTUnresolvedSet.h
Go to the documentation of this file.
1 //===-- ASTUnresolvedSet.h - Unresolved sets of declarations ---*- C++ -*-===//
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 an UnresolvedSet-like class, whose contents are
11 // allocated using the allocator associated with an ASTContext.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_CLANG_AST_ASTUNRESOLVEDSET_H
16 #define LLVM_CLANG_AST_ASTUNRESOLVEDSET_H
17 
18 #include "clang/AST/ASTVector.h"
20 
21 namespace clang {
22 
23 /// \brief An UnresolvedSet-like class which uses the ASTContext's allocator.
25  struct DeclsTy : ASTVector<DeclAccessPair> {
26  DeclsTy() {}
27  DeclsTy(ASTContext &C, unsigned N) : ASTVector<DeclAccessPair>(C, N) {}
28 
29  bool isLazy() const { return getTag(); }
30  void setLazy(bool Lazy) { setTag(Lazy); }
31  };
32 
33  DeclsTy Decls;
34 
35  friend class LazyASTUnresolvedSet;
36 
37 public:
39  ASTUnresolvedSet(ASTContext &C, unsigned N) : Decls(C, N) {}
40 
43 
44  iterator begin() { return iterator(Decls.begin()); }
45  iterator end() { return iterator(Decls.end()); }
46 
47  const_iterator begin() const { return const_iterator(Decls.begin()); }
48  const_iterator end() const { return const_iterator(Decls.end()); }
49 
51  Decls.push_back(DeclAccessPair::make(D, AS), C);
52  }
53 
54  /// Replaces the given declaration with the new one, once.
55  ///
56  /// \return true if the set changed
57  bool replace(const NamedDecl *Old, NamedDecl *New, AccessSpecifier AS) {
58  for (DeclsTy::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
59  if (I->getDecl() == Old) {
60  I->set(New, AS);
61  return true;
62  }
63  }
64  return false;
65  }
66 
67  void erase(unsigned I) { Decls[I] = Decls.pop_back_val(); }
68 
69  void clear() { Decls.clear(); }
70 
71  bool empty() const { return Decls.empty(); }
72  unsigned size() const { return Decls.size(); }
73 
74  void reserve(ASTContext &C, unsigned N) {
75  Decls.reserve(C, N);
76  }
77 
78  void append(ASTContext &C, iterator I, iterator E) {
79  Decls.append(C, I.I, E.I);
80  }
81 
82  DeclAccessPair &operator[](unsigned I) { return Decls[I]; }
83  const DeclAccessPair &operator[](unsigned I) const { return Decls[I]; }
84 };
85 
86 /// \brief An UnresolvedSet-like class that might not have been loaded from the
87 /// external AST source yet.
89  mutable ASTUnresolvedSet Impl;
90 
91  void getFromExternalSource(ASTContext &C) const;
92 
93 public:
94  ASTUnresolvedSet &get(ASTContext &C) const {
95  if (Impl.Decls.isLazy())
96  getFromExternalSource(C);
97  return Impl;
98  }
99 
100  void reserve(ASTContext &C, unsigned N) { Impl.reserve(C, N); }
102  assert(Impl.empty() || Impl.Decls.isLazy());
103  Impl.Decls.setLazy(true);
104  Impl.addDecl(C, reinterpret_cast<NamedDecl*>(ID << 2), AS);
105  }
106 };
107 
108 } // namespace clang
109 
110 #endif
UnresolvedSetIterator iterator
bool replace(const NamedDecl *Old, NamedDecl *New, AccessSpecifier AS)
Replaces the given declaration with the new one, once.
void erase(unsigned I)
void append(ASTContext &C, iterator I, iterator E)
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition: Specifiers.h:95
An UnresolvedSet-like class that might not have been loaded from the external AST source yet...
void addLazyDecl(ASTContext &C, uintptr_t ID, AccessSpecifier AS)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:128
const_iterator begin() const
The iterator over UnresolvedSets.
Definition: UnresolvedSet.h:27
void addDecl(ASTContext &C, NamedDecl *D, AccessSpecifier AS)
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
void reserve(ASTContext &C, unsigned N)
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
Definition: opencl-c.h:82
const_iterator end() const
ASTUnresolvedSet(ASTContext &C, unsigned N)
A POD class for pairing a NamedDecl* with an access specifier.
Dataflow Directional Tag Classes.
void reserve(ASTContext &C, unsigned N)
An UnresolvedSet-like class which uses the ASTContext&#39;s allocator.
DeclAccessPair & operator[](unsigned I)
const DeclAccessPair & operator[](unsigned I) const
NamedDecl - This represents a decl with a name.
Definition: Decl.h:213
UnresolvedSetIterator const_iterator