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