From c8f6a5d01fc0eafcc32d235e922b77e4aed42cfa Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Fri, 22 Jan 2021 20:52:30 +0100 Subject: Refactoring: template.cpp (part 4) --- src/template.cpp | 124 +++++++++++++++++++++---------------------------------- 1 file changed, 47 insertions(+), 77 deletions(-) diff --git a/src/template.cpp b/src/template.cpp index a624154..a7d9bbb 100644 --- a/src/template.cpp +++ b/src/template.cpp @@ -19,19 +19,10 @@ #include #include #include +#include -#include -#include - -#include -#include -#include -#include -#include -#include #include #include -#include #include #include "ftextstream.h" @@ -490,13 +481,14 @@ class TemplateBlockContext public: TemplateBlockContext(); TemplateNodeBlock *get(const QCString &name) const; - TemplateNodeBlock *pop(const QCString &name) const; + TemplateNodeBlock *pop(const QCString &name); void add(TemplateNodeBlock *block); void add(TemplateBlockContext *ctx); void push(TemplateNodeBlock *block); void clear(); + using NodeBlockList = std::deque; private: - QDict< QList > m_blocks; + std::map< std::string, NodeBlockList > m_blocks; }; /** @brief A container to store a key-value pair */ @@ -1718,7 +1710,7 @@ class TemplateParser TemplateParser(const TemplateEngine *engine, const QCString &templateName, TemplateTokenStream &tokens); - void parse(TemplateNode *parent,int line,const QStrList &stopAt, + void parse(TemplateNode *parent,int line,const StringVector &stopAt, TemplateNodeList &nodes); bool hasNextToken() const; TemplateTokenPtr takeNextToken(); @@ -2832,10 +2824,7 @@ class TemplateNodeIf : public TemplateNodeCreator { parser->warn(m_templateName,line,"missing argument for if tag"); } - QStrList stopAt; - stopAt.append("endif"); - stopAt.append("elif"); - stopAt.append("else"); + StringVector stopAt = { "endif", "elif", "else" }; // if 'nodes' { @@ -2864,8 +2853,8 @@ class TemplateNodeIf : public TemplateNodeCreator // else 'nodes' if (tok && tok->data=="else") { - stopAt.removeLast(); // remove "else" - stopAt.removeLast(); // remove "elif" + stopAt.pop_back(); // remove "else" + stopAt.pop_back(); // remove "elif" parser->parse(this,line,stopAt,m_falseNodes); parser->removeNextToken(); // skip over endif } @@ -2929,8 +2918,7 @@ class TemplateNodeRepeat : public TemplateNodeCreator TRACE(("{TemplateNodeRepeat(%s)\n",data.data())); ExpressionParser expParser(parser,line); m_expr = expParser.parse(data); - QStrList stopAt; - stopAt.append("endrepeat"); + StringVector stopAt = { "endrepeat" }; parser->parse(this,line,stopAt,m_repeatNodes); parser->removeNextToken(); // skip over endrepeat TRACE(("}TemplateNodeRepeat(%s)\n",data.data())); @@ -3039,8 +3027,7 @@ class TemplateNodeRange : public TemplateNodeCreator m_startExpr = expParser.parse(start); m_endExpr = expParser.parse(end); - QStrList stopAt; - stopAt.append("endrange"); + StringVector stopAt = { "endrange" }; parser->parse(this,line,stopAt,m_loopNodes); parser->removeNextToken(); // skip over endrange TRACE(("}TemplateNodeRange(%s)\n",data.data())); @@ -3193,14 +3180,12 @@ class TemplateNodeFor : public TemplateNodeCreator ExpressionParser expParser(parser,line); m_expr = expParser.parse(exprStr); - QStrList stopAt; - stopAt.append("endfor"); - stopAt.append("empty"); + StringVector stopAt = { "endfor", "empty" }; parser->parse(this,line,stopAt,m_loopNodes); auto tok = parser->takeNextToken(); if (tok && tok->data=="empty") { - stopAt.removeLast(); + stopAt.pop_back(); parser->parse(this,line,stopAt,m_emptyNodes); parser->removeNextToken(); // skip over endfor } @@ -3309,8 +3294,7 @@ class TemplateNodeMsg : public TemplateNodeCreator : TemplateNodeCreator(parser,parent,line) { TRACE(("{TemplateNodeMsg()\n")); - QStrList stopAt; - stopAt.append("endmsg"); + StringVector stopAt = { "endmsg" }; parser->parse(this,line,stopAt,m_nodes); parser->removeNextToken(); // skip over endmsg TRACE(("}TemplateNodeMsg()\n")); @@ -3350,8 +3334,7 @@ class TemplateNodeBlock : public TemplateNodeCreator { parser->warn(parser->templateName(),line,"block tag without name"); } - QStrList stopAt; - stopAt.append("endblock"); + StringVector stopAt = { "endblock" }; parser->parse(this,line,stopAt,m_nodes); parser->removeNextToken(); // skip over endblock TRACE(("}TemplateNodeBlock(%s)\n",data.data())); @@ -3429,7 +3412,7 @@ class TemplateNodeExtend : public TemplateNodeCreator parser->warn(m_templateName,line,"extend tag is missing template file argument"); } m_extendExpr = ep.parse(data); - QStrList stopAt; + StringVector stopAt; parser->parse(this,line,stopAt,m_nodes); TRACE(("}TemplateNodeExtend(%s)\n",data.data())); } @@ -3709,8 +3692,7 @@ class TemplateNodeTree : public TemplateNodeCreator parser->warn(m_templateName,line,"recursetree tag is missing data argument"); } m_treeExpr = ep.parse(data); - QStrList stopAt; - stopAt.append("endrecursetree"); + StringVector stopAt = { "endrecursetree" }; parser->parse(this,line,stopAt,m_treeNodes); parser->removeNextToken(); // skip over endrecursetree TRACE(("}TemplateNodeTree(%s)\n",data.data())); @@ -3979,8 +3961,7 @@ class TemplateNodeWith : public TemplateNodeCreator } ++it; } - QStrList stopAt; - stopAt.append("endwith"); + StringVector stopAt = { "endwith" }; parser->parse(this,line,stopAt,m_nodes); parser->removeNextToken(); // skip over endwith TRACE(("}TemplateNodeWith(%s)\n",data.data())); @@ -4135,8 +4116,7 @@ class TemplateNodeSpaceless : public TemplateNodeCreator : TemplateNodeCreator(parser,parent,line) { TRACE(("{TemplateNodeSpaceless()\n")); - QStrList stopAt; - stopAt.append("endspaceless"); + StringVector stopAt = { "endspaceless" }; parser->parse(this,line,stopAt,m_nodes); parser->removeNextToken(); // skip over endwith TRACE(("}TemplateNodeSpaceless()\n")); @@ -4178,8 +4158,7 @@ class TemplateNodeMarkers : public TemplateNodeCreator m_listExpr = expParser.parse(data.mid(i+4,w-i-4)); m_patternExpr = expParser.parse(data.right(data.length()-w-6)); } - QStrList stopAt; - stopAt.append("endmarkers"); + StringVector stopAt = { "endmarkers" }; parser->parse(this,line,stopAt,m_nodes); parser->removeNextToken(); // skip over endmarkers TRACE(("}TemplateNodeMarkers(%s)\n",data.data())); @@ -4284,8 +4263,7 @@ class TemplateNodeTabbing : public TemplateNodeCreator : TemplateNodeCreator(parser,parent,line) { TRACE(("{TemplateNodeTabbing()\n")); - QStrList stopAt; - stopAt.append("endtabbing"); + StringVector stopAt = { "endtabbing" }; parser->parse(this,line,stopAt,m_nodes); parser->removeNextToken(); // skip over endtabbing TRACE(("}TemplateNodeTabbing()\n")); @@ -4398,8 +4376,7 @@ class TemplateNodeEncoding : public TemplateNodeCreator { m_encExpr = ep.parse(data); } - QStrList stopAt; - stopAt.append("endencoding"); + StringVector stopAt = { "endencoding" }; parser->parse(this,line,stopAt,m_nodes); parser->removeNextToken(); // skip over endencoding TRACE(("}TemplateNodeEncoding(%s)\n",data.data())); @@ -4504,57 +4481,53 @@ static TemplateNodeFactory::AutoRegister autoRefClose //---------------------------------------------------------- -TemplateBlockContext::TemplateBlockContext() : m_blocks(257) +TemplateBlockContext::TemplateBlockContext() { - m_blocks.setAutoDelete(TRUE); } TemplateNodeBlock *TemplateBlockContext::get(const QCString &name) const { - QList *list = m_blocks.find(name); - if (list==0 || list->count()==0) + auto it = m_blocks.find(name.str()); + if (it==m_blocks.end() || it->second.empty()) { return 0; } else { - return list->getLast(); + return it->second.back(); } } -TemplateNodeBlock *TemplateBlockContext::pop(const QCString &name) const +TemplateNodeBlock *TemplateBlockContext::pop(const QCString &name) { - QList *list = m_blocks.find(name); - if (list==0 || list->count()==0) + auto it = m_blocks.find(name.str()); + if (it==m_blocks.end() || it->second.empty()) { return 0; } else { - return list->take(list->count()-1); + TemplateNodeBlock *bld = it->second.back(); + it->second.pop_back(); + return bld; } } void TemplateBlockContext::add(TemplateNodeBlock *block) { - QList *list = m_blocks.find(block->name()); - if (list==0) + auto it = m_blocks.find(block->name().str()); + if (it==m_blocks.end()) { - list = new QList; - m_blocks.insert(block->name(),list); + it = m_blocks.insert(std::make_pair(block->name().str(),NodeBlockList())).first; } - list->prepend(block); + it->second.push_front(block); } void TemplateBlockContext::add(TemplateBlockContext *ctx) { - QDictIterator< QList > di(ctx->m_blocks); - QList *list; - for (di.toFirst();(list=di.current());++di) + for (auto &kv : ctx->m_blocks) { - QListIterator li(*list); - TemplateNodeBlock *nb; - for (li.toFirst();(nb=li.current());++li) + for (auto &nb : kv.second) { add(nb); } @@ -4568,13 +4541,12 @@ void TemplateBlockContext::clear() void TemplateBlockContext::push(TemplateNodeBlock *block) { - QList *list = m_blocks.find(block->name()); - if (list==0) + auto it = m_blocks.find(block->name().str()); + if (it==m_blocks.end()) { - list = new QList; - m_blocks.insert(block->name(),list); + it = m_blocks.insert(std::make_pair(block->name().str(),NodeBlockList())).first; } - list->append(block); + it->second.push_back(block); } @@ -4835,7 +4807,7 @@ TemplateParser::TemplateParser(const TemplateEngine *engine, } void TemplateParser::parse( - TemplateNode *parent,int line,const QStrList &stopAt, + TemplateNode *parent,int line,const StringVector &stopAt, TemplateNodeList &nodes) { TRACE(("{TemplateParser::parse\n")); @@ -4862,7 +4834,7 @@ void TemplateParser::parse( command=command.left(sep); } TemplateToken *tok_ptr = tok.get(); - if (stopAt.contains(command)) + if (std::find(stopAt.begin(),stopAt.end(),command)!=stopAt.end()) { prependToken(std::move(tok)); TRACE(("}TemplateParser::parse: stop\n")); @@ -4898,15 +4870,13 @@ void TemplateParser::parse( break; } } - if (!stopAt.isEmpty()) + if (!stopAt.empty()) { - QStrListIterator it(stopAt); - const char *s; QCString options; - for (it.toFirst();(s=it.current());++it) + for (const auto &s : stopAt) { if (!options.isEmpty()) options+=", "; - options+=s; + options+=s.c_str(); } warn(m_templateName,line,"Unclosed tag in template, expected one of: %s", options.data()); @@ -4970,7 +4940,7 @@ TemplateImpl::TemplateImpl(TemplateEngine *engine,const QCString &name,const QCS TemplateTokenStream tokens; lexer.tokenize(tokens); TemplateParser parser(engine,name,tokens); - parser.parse(this,1,QStrList(),m_nodes); + parser.parse(this,1,StringVector(),m_nodes); } TemplateImpl::~TemplateImpl() -- cgit v0.12