]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/llvm/tools/clang/include/clang/AST/ASTUnresolvedSet.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / llvm / tools / clang / include / clang / AST / ASTUnresolvedSet.h
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:
32   ASTUnresolvedSet() {}
33   ASTUnresolvedSet(ASTContext &C, unsigned N) : Decls(C, N) {}
34
35   typedef UnresolvedSetIterator iterator;
36   typedef UnresolvedSetIterator const_iterator;
37
38   iterator begin() { return iterator(Decls.begin()); }
39   iterator end() { return iterator(Decls.end()); }
40
41   const_iterator begin() const { return const_iterator(Decls.begin()); }
42   const_iterator end() const { return const_iterator(Decls.end()); }
43
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
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
61   void erase(unsigned I) {
62     Decls[I] = Decls.back();
63     Decls.pop_back();
64   }
65
66   void clear() { Decls.clear(); }
67
68   bool empty() const { return Decls.empty(); }
69   unsigned size() const { return Decls.size(); }
70
71   void reserve(ASTContext &C, unsigned N) {
72     Decls.reserve(C, N);
73   }
74
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