diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2010-07-30 17:09:04 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2010-07-30 17:09:04 +0000 |
commit | 4048590d5774fd4b08661b5cf59b6f90b62f283a (patch) | |
tree | f40270339cbc49921ffe78a645fca7f40af11b8b /lib/AST/DeclTemplate.cpp | |
parent | 44dd0b440efdb37ff4c6e49f243faa3b0580b120 (diff) |
Refactor find*Specialization functions using SpecEntryTraits
This patch reimplements the find*Specialization family of member
functions of {Class,Function}TemplateDecl in terms of a common
implementation that uses SpecEntryTraits to obtain the most recent
declaration.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109869 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/DeclTemplate.cpp')
-rw-r--r-- | lib/AST/DeclTemplate.cpp | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/lib/AST/DeclTemplate.cpp b/lib/AST/DeclTemplate.cpp index 25df086e73..e69338a773 100644 --- a/lib/AST/DeclTemplate.cpp +++ b/lib/AST/DeclTemplate.cpp @@ -126,6 +126,19 @@ RedeclarableTemplateDecl *RedeclarableTemplateDecl::getNextRedeclaration() { return Common ? Common->Latest : this; } +template <class EntryType> +typename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType* +RedeclarableTemplateDecl::findSpecializationImpl( + llvm::FoldingSet<EntryType> &Specs, + const TemplateArgument *Args, unsigned NumArgs, + void *&InsertPos) { + typedef SpecEntryTraits<EntryType> SETraits; + llvm::FoldingSetNodeID ID; + EntryType::Profile(ID,Args,NumArgs, getASTContext()); + EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos); + return Entry ? SETraits::getMostRecentDeclaration(Entry) : 0; +} + //===----------------------------------------------------------------------===// // FunctionTemplateDecl Implementation //===----------------------------------------------------------------------===// @@ -152,11 +165,7 @@ RedeclarableTemplateDecl::CommonBase *FunctionTemplateDecl::newCommon() { FunctionDecl * FunctionTemplateDecl::findSpecialization(const TemplateArgument *Args, unsigned NumArgs, void *&InsertPos) { - llvm::FoldingSetNodeID ID; - FunctionTemplateSpecializationInfo::Profile(ID,Args,NumArgs, getASTContext()); - FunctionTemplateSpecializationInfo *Info - = getSpecializations().FindNodeOrInsertPos(ID, InsertPos); - return Info ? Info->Function->getMostRecentDeclaration() : 0; + return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); } //===----------------------------------------------------------------------===// @@ -188,23 +197,15 @@ RedeclarableTemplateDecl::CommonBase *ClassTemplateDecl::newCommon() { ClassTemplateSpecializationDecl * ClassTemplateDecl::findSpecialization(const TemplateArgument *Args, unsigned NumArgs, void *&InsertPos) { - llvm::FoldingSetNodeID ID; - ClassTemplateSpecializationDecl::Profile(ID, Args, NumArgs, getASTContext()); - ClassTemplateSpecializationDecl *D - = getSpecializations().FindNodeOrInsertPos(ID, InsertPos); - return D ? D->getMostRecentDeclaration() : 0; + return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); } ClassTemplatePartialSpecializationDecl * ClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args, unsigned NumArgs, void *&InsertPos) { - llvm::FoldingSetNodeID ID; - ClassTemplatePartialSpecializationDecl::Profile(ID, Args, NumArgs, - getASTContext()); - ClassTemplatePartialSpecializationDecl *D - = getPartialSpecializations().FindNodeOrInsertPos(ID, InsertPos); - return D ? D->getMostRecentDeclaration() : 0; + return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs, + InsertPos); } void ClassTemplateDecl::getPartialSpecializations( |