• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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"
19 #include "clang/AST/UnresolvedSet.h"
20 
21 namespace clang {
22 
23 /// \brief An UnresolvedSet-like class which uses the ASTContext's allocator.
24 class ASTUnresolvedSet {
25   typedef ASTVector<DeclAccessPair> DeclsTy;
26   DeclsTy Decls;
27 
28   ASTUnresolvedSet(const ASTUnresolvedSet &) LLVM_DELETED_FUNCTION;
29   void operator=(const ASTUnresolvedSet &) LLVM_DELETED_FUNCTION;
30 
31 public:
ASTUnresolvedSet()32   ASTUnresolvedSet() {}
ASTUnresolvedSet(ASTContext & C,unsigned N)33   ASTUnresolvedSet(ASTContext &C, unsigned N) : Decls(C, N) {}
34 
35   typedef UnresolvedSetIterator iterator;
36   typedef UnresolvedSetIterator const_iterator;
37 
begin()38   iterator begin() { return iterator(Decls.begin()); }
end()39   iterator end() { return iterator(Decls.end()); }
40 
begin()41   const_iterator begin() const { return const_iterator(Decls.begin()); }
end()42   const_iterator end() const { return const_iterator(Decls.end()); }
43 
addDecl(ASTContext & C,NamedDecl * D,AccessSpecifier AS)44   void addDecl(ASTContext &C, NamedDecl *D, AccessSpecifier AS) {
45     Decls.push_back(DeclAccessPair::make(D, AS), C);
46   }
47 
48   /// Replaces the given declaration with the new one, once.
49   ///
50   /// \return true if the set changed
replace(const NamedDecl * Old,NamedDecl * New,AccessSpecifier AS)51   bool replace(const NamedDecl* Old, NamedDecl *New, AccessSpecifier AS) {
52     for (DeclsTy::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
53       if (I->getDecl() == Old) {
54         I->set(New, AS);
55         return true;
56       }
57     }
58     return false;
59   }
60 
erase(unsigned I)61   void erase(unsigned I) {
62     Decls[I] = Decls.back();
63     Decls.pop_back();
64   }
65 
clear()66   void clear() { Decls.clear(); }
67 
empty()68   bool empty() const { return Decls.empty(); }
size()69   unsigned size() const { return Decls.size(); }
70 
reserve(ASTContext & C,unsigned N)71   void reserve(ASTContext &C, unsigned N) {
72     Decls.reserve(C, N);
73   }
74 
append(ASTContext & C,iterator I,iterator E)75   void append(ASTContext &C, iterator I, iterator E) {
76     Decls.append(C, I.ir, E.ir);
77   }
78 
79   DeclAccessPair &operator[](unsigned I) { return Decls[I]; }
80   const DeclAccessPair &operator[](unsigned I) const { return Decls[I]; }
81 };
82 
83 } // namespace clang
84 
85 #endif
86