From 0b641d38d50bd6dc7b54cac5136b77827a71264e Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Mon, 16 Nov 2009 18:00:20 +0100
Subject: [PATCH] Use a map for the memoization.

---
 src/shared/cplusplus/Parser.cpp | 16 +++++++++-------
 src/shared/cplusplus/Parser.h   |  3 ++-
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index ca26cb629e3..bad5233f029 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -441,6 +441,8 @@ bool Parser::parseTranslationUnit(TranslationUnitAST *&node)
             rewind(start_declaration + 1);
             skipUntilDeclaration();
         }
+
+        _templateArgumentList.clear();
     }
 
     node = ast;
@@ -568,6 +570,8 @@ bool Parser::parseLinkageBody(DeclarationAST *&node)
                 rewind(start_declaration + 1);
                 skipUntilDeclaration();
             }
+
+            _templateArgumentList.clear();
         }
         match(T_RBRACE, &ast->rbrace_token);
         node = ast;
@@ -692,11 +696,9 @@ bool Parser::parseOperatorFunctionId(NameAST *&node)
 
 Parser::TemplateArgumentListEntry *Parser::templateArgumentListEntry(unsigned tokenIndex)
 {
-    for (unsigned i = 0; i < _templateArgumentList.size(); ++i) {
-        TemplateArgumentListEntry *entry = &_templateArgumentList[i];
-        if (entry->index == tokenIndex)
-            return entry;
-    }
+    std::map<unsigned, TemplateArgumentListEntry>::iterator it =_templateArgumentList.find(tokenIndex);
+    if (it != _templateArgumentList.end())
+        return &it->second;
 
     return 0;
 }
@@ -729,11 +731,11 @@ bool Parser::parseTemplateArgumentList(TemplateArgumentListAST *&node)
             }
         }
 
-        _templateArgumentList.push_back(TemplateArgumentListEntry(start, cursor(), node));
+        _templateArgumentList.insert(std::make_pair(cursor(), TemplateArgumentListEntry(start, cursor(), node)));
         return true;
     }
 
-    _templateArgumentList.push_back(TemplateArgumentListEntry(start, cursor(), 0));
+    _templateArgumentList.insert(std::make_pair(cursor(), TemplateArgumentListEntry(start, cursor(), 0)));
 
     return false;
 }
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index d9ccf6ab490..555e58c2703 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -53,6 +53,7 @@
 #include "ASTfwd.h"
 #include "Token.h"
 #include "TranslationUnit.h"
+#include <map>
 
 namespace CPlusPlus {
 
@@ -308,7 +309,7 @@ private:
     bool _inFunctionBody: 1;
     bool _inObjCImplementationContext: 1;
 
-    Array<TemplateArgumentListEntry> _templateArgumentList;
+    std::map<unsigned, TemplateArgumentListEntry> _templateArgumentList;
 
     class Rewind;
     friend class Rewind;
-- 
GitLab