From d6f0b4e97e681ea5d165125960f34b3b8c19e1dc Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Mon, 2 Feb 2009 17:56:05 +0000 Subject: [PATCH] Slim down the specific_decl_iterator, since NULL denotes the end of the range. Good eyes, Chris git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63528 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Decl.h | 8 ++++---- include/clang/AST/DeclBase.h | 25 +++++++++++-------------- include/clang/AST/DeclObjC.h | 20 ++++++++------------ 3 files changed, 23 insertions(+), 30 deletions(-) diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index 18d1c05467..23f06f14f5 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -927,11 +927,11 @@ public: typedef specific_decl_iterator enumerator_iterator; enumerator_iterator enumerator_begin() const { - return enumerator_iterator(this->decls_begin(), this->decls_end()); + return enumerator_iterator(this->decls_begin()); } enumerator_iterator enumerator_end() const { - return enumerator_iterator(this->decls_end(), this->decls_end()); + return enumerator_iterator(this->decls_end()); } /// getIntegerType - Return the integer type this enum decl corresponds to. @@ -1022,10 +1022,10 @@ public: typedef specific_decl_iterator field_iterator; field_iterator field_begin() const { - return field_iterator(decls_begin(), decls_end()); + return field_iterator(decls_begin()); } field_iterator field_end() const { - return field_iterator(decls_end(), decls_end()); + return field_iterator(decls_end()); } // field_empty - Whether there are any fields (non-static data diff --git a/include/clang/AST/DeclBase.h b/include/clang/AST/DeclBase.h index 8d203cc2c2..2c15c870c3 100644 --- a/include/clang/AST/DeclBase.h +++ b/include/clang/AST/DeclBase.h @@ -640,13 +640,10 @@ public: template class specific_decl_iterator { /// Current - The current, underlying declaration iterator, which - /// will either be the same as End or will point to a declaration of + /// will either be NULL or will point to a declaration of /// type SpecificDecl. DeclContext::decl_iterator Current; - /// End - One past the last declaration within the DeclContext. - DeclContext::decl_iterator End; - /// Acceptable - If non-NULL, points to a member function that /// will determine if a particular declaration of type /// SpecificDecl should be visited by the iteration. @@ -656,7 +653,7 @@ public: /// declaration of type SpecificDecl that also meets the criteria /// required by Acceptable. void SkipToNextDecl() { - while (Current != End && + while (*Current && (!isa(*Current) || (Acceptable && !(cast(*Current)->*Acceptable)()))) ++Current; @@ -670,19 +667,19 @@ public: difference_type; typedef std::forward_iterator_tag iterator_category; - specific_decl_iterator() : Current(), End(), Acceptable(0) { } + specific_decl_iterator() : Current(), Acceptable(0) { } /// specific_decl_iterator - Construct a new iterator over a - /// subset of the declarations in [C, E). If A is non-NULL, it is - /// a pointer to a member function of SpecificDecl that should - /// return true for all of the SpecificDecl instances that will be - /// in the subset of iterators. For example, if you want - /// Objective-C instance methods, SpecificDecl will be - /// ObjCMethodDecl and A will be &ObjCMethodDecl::isInstanceMethod. + /// subset of the declarations the range [C, + /// end-of-declarations). If A is non-NULL, it is a pointer to a + /// member function of SpecificDecl that should return true for + /// all of the SpecificDecl instances that will be in the subset + /// of iterators. For example, if you want Objective-C instance + /// methods, SpecificDecl will be ObjCMethodDecl and A will be + /// &ObjCMethodDecl::isInstanceMethod. specific_decl_iterator(DeclContext::decl_iterator C, - DeclContext::decl_iterator E, bool (SpecificDecl::*A)() const = 0) - : Current(C), End(E), Acceptable(A) { + : Current(C), Acceptable(A) { SkipToNextDecl(); } diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index fcf6e5864e..cda9bddbcc 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -264,39 +264,35 @@ public: // Iterator access to properties. typedef specific_decl_iterator prop_iterator; prop_iterator prop_begin() const { - return prop_iterator(decls_begin(), decls_end()); + return prop_iterator(decls_begin()); } prop_iterator prop_end() const { - return prop_iterator(decls_end(), decls_end()); + return prop_iterator(decls_end()); } // Iterator access to instance/class methods. typedef specific_decl_iterator method_iterator; method_iterator meth_begin() const { - return method_iterator(decls_begin(), decls_end()); + return method_iterator(decls_begin()); } method_iterator meth_end() const { - return method_iterator(decls_end(), decls_end()); + return method_iterator(decls_end()); } typedef method_iterator instmeth_iterator; instmeth_iterator instmeth_begin() const { - return instmeth_iterator(decls_begin(), decls_end(), - &ObjCMethodDecl::isInstanceMethod); + return instmeth_iterator(decls_begin(), &ObjCMethodDecl::isInstanceMethod); } instmeth_iterator instmeth_end() const { - return instmeth_iterator(decls_end(), decls_end(), - &ObjCMethodDecl::isInstanceMethod); + return instmeth_iterator(decls_end(), &ObjCMethodDecl::isInstanceMethod); } typedef method_iterator classmeth_iterator; classmeth_iterator classmeth_begin() const { - return classmeth_iterator(decls_begin(), decls_end(), - &ObjCMethodDecl::isClassMethod); + return classmeth_iterator(decls_begin(), &ObjCMethodDecl::isClassMethod); } classmeth_iterator classmeth_end() const { - return classmeth_iterator(decls_end(), decls_end(), - &ObjCMethodDecl::isClassMethod); + return classmeth_iterator(decls_end(), &ObjCMethodDecl::isClassMethod); } // Get the local instance/class method declared in this interface.