diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-02-02 21:35:47 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-02-02 21:35:47 +0000 |
commit | d863517ab7e936cbc3244a0fc431c8b672f5ece4 (patch) | |
tree | f31d615998370f7144daca39cc2d1e096d4ed6af /lib/Sema/SemaLookup.cpp | |
parent | 81922f01352aceeb923c0c3cc8c96b6527322384 (diff) |
Add iterators to LookupResult, allowing one to iterate over the
non-ambiguous name lookup results without allocating any memory, e.g.,
for sets of overloaded functions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63549 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaLookup.cpp')
-rw-r--r-- | lib/Sema/SemaLookup.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index abb265da49..da2deec02a 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -181,6 +181,66 @@ BasePaths *Sema::LookupResult::getBasePaths() const { return reinterpret_cast<BasePaths *>(First); } +Sema::LookupResult::iterator::reference +Sema::LookupResult::iterator::operator*() const { + switch (Result->StoredKind) { + case SingleDecl: + return reinterpret_cast<Decl*>(Current); + + case OverloadedDeclFromIdResolver: + return *IdentifierResolver::iterator::getFromOpaqueValue(Current); + + case OverloadedDeclFromDeclContext: + return *reinterpret_cast<DeclContext::lookup_iterator>(Current); + + case AmbiguousLookup: + assert(false && "Cannot look into ambiguous lookup results"); + break; + } + + return 0; +} + +Sema::LookupResult::iterator& Sema::LookupResult::iterator::operator++() { + switch (Result->StoredKind) { + case SingleDecl: + Current = reinterpret_cast<uintptr_t>((Decl*)0); + break; + + case OverloadedDeclFromIdResolver: { + IdentifierResolver::iterator I + = IdentifierResolver::iterator::getFromOpaqueValue(Current); + ++I; + Current = I.getAsOpaqueValue(); + break; + } + + case OverloadedDeclFromDeclContext: { + DeclContext::lookup_iterator I + = reinterpret_cast<DeclContext::lookup_iterator>(Current); + ++I; + Current = reinterpret_cast<uintptr_t>(I); + break; + } + + case AmbiguousLookup: + assert(false && "Cannot look into ambiguous lookup results"); + break; + } + + return *this; +} + +Sema::LookupResult::iterator Sema::LookupResult::begin() { + assert(StoredKind != AmbiguousLookup && "Lookup into an ambiguous result"); + return iterator(this, First); +} + +Sema::LookupResult::iterator Sema::LookupResult::end() { + assert(StoredKind != AmbiguousLookup && "Lookup into an ambiguous result"); + return iterator(this, Last); +} + // Retrieve the set of identifier namespaces that correspond to a // specific kind of name lookup. inline unsigned |