@@ -402,9 +402,9 @@ void Token::replace(Token *replaceThis, Token *start, Token *end)
402402 delete replaceThis;
403403}
404404
405- const Token *Token::tokAt (int index) const
405+ template <class T , REQUIRES(" T must be a Token class" , std::is_convertible<T*, const Token*> )>
406+ static T *tokAtImpl (T *tok, int index)
406407{
407- const Token *tok = this ;
408408 while (index > 0 && tok) {
409409 tok = tok->next ();
410410 --index;
@@ -416,15 +416,36 @@ const Token *Token::tokAt(int index) const
416416 return tok;
417417}
418418
419- const Token *Token::linkAt (int index) const
419+ const Token *Token::tokAt (int index) const
420420{
421- const Token *tok = this ->tokAt (index);
421+ return tokAtImpl (this , index);
422+ }
423+
424+ Token *Token::tokAt (int index)
425+ {
426+ return tokAtImpl (this , index);
427+ }
428+
429+ template <class T , REQUIRES(" T must be a Token class" , std::is_convertible<T*, const Token*> )>
430+ static T *linkAtImpl (T *thisTok, int index)
431+ {
432+ T *tok = thisTok->tokAt (index);
422433 if (!tok) {
423- throw InternalError (this , " Internal error. Token::linkAt called with index outside the tokens range." );
434+ throw InternalError (thisTok , " Internal error. Token::linkAt called with index outside the tokens range." );
424435 }
425436 return tok->link ();
426437}
427438
439+ const Token *Token::linkAt (int index) const
440+ {
441+ return linkAtImpl (this , index);
442+ }
443+
444+ Token *Token::linkAt (int index)
445+ {
446+ return linkAtImpl (this , index);
447+ }
448+
428449const std::string &Token::strAt (int index) const
429450{
430451 const Token *tok = this ->tokAt (index);
@@ -857,9 +878,10 @@ void Token::move(Token *srcStart, Token *srcEnd, Token *newLocation)
857878 tok->mImpl ->mProgressValue = newLocation->mImpl ->mProgressValue ;
858879}
859880
860- const Token* Token::nextArgument () const
881+ template <class T , REQUIRES(" T must be a Token class" , std::is_convertible<T*, const Token*> )>
882+ static T* nextArgumentImpl (T *thisTok)
861883{
862- for (const Token * tok = this ; tok; tok = tok->next ()) {
884+ for (T * tok = thisTok ; tok; tok = tok->next ()) {
863885 if (tok->str () == " ," )
864886 return tok->next ();
865887 if (tok->link () && Token::Match (tok, " (|{|[|<" ))
@@ -870,6 +892,16 @@ const Token* Token::nextArgument() const
870892 return nullptr ;
871893}
872894
895+ const Token* Token::nextArgument () const
896+ {
897+ return nextArgumentImpl (this );
898+ }
899+
900+ Token *Token::nextArgument ()
901+ {
902+ return nextArgumentImpl (this );
903+ }
904+
873905const Token* Token::nextArgumentBeforeCreateLinks2 () const
874906{
875907 for (const Token* tok = this ; tok; tok = tok->next ()) {
@@ -1007,42 +1039,83 @@ Token * Token::findOpeningBracket()
10071039
10081040// ---------------------------------------------------------------------------
10091041
1010- const Token *Token::findsimplematch (const Token * const startTok, const char pattern[], size_t pattern_len)
1042+ template <class T , REQUIRES(" T must be a Token class" , std::is_convertible<T*, const Token*> )>
1043+ static T *findsimplematchImpl (T * const startTok, const char pattern[], size_t pattern_len)
10111044{
1012- for (const Token * tok = startTok; tok; tok = tok->next ()) {
1045+ for (T * tok = startTok; tok; tok = tok->next ()) {
10131046 if (Token::simpleMatch (tok, pattern, pattern_len))
10141047 return tok;
10151048 }
10161049 return nullptr ;
10171050}
10181051
1019- const Token *Token::findsimplematch (const Token * const startTok, const char pattern[], size_t pattern_len, const Token * const end)
1052+ const Token *Token::findsimplematch (const Token * const startTok, const char pattern[], size_t pattern_len)
1053+ {
1054+ return findsimplematchImpl (startTok, pattern, pattern_len);
1055+ }
1056+
1057+ Token *Token::findsimplematch (Token * const startTok, const char pattern[], size_t pattern_len)
1058+ {
1059+ return findsimplematchImpl (startTok, pattern, pattern_len);
1060+ }
1061+
1062+ template <class T , REQUIRES(" T must be a Token class" , std::is_convertible<T*, const Token*> )>
1063+ static T *findsimplematchImpl (T * const startTok, const char pattern[], size_t pattern_len, const Token * const end)
10201064{
1021- for (const Token * tok = startTok; tok && tok != end; tok = tok->next ()) {
1065+ for (T * tok = startTok; tok && tok != end; tok = tok->next ()) {
10221066 if (Token::simpleMatch (tok, pattern, pattern_len))
10231067 return tok;
10241068 }
10251069 return nullptr ;
10261070}
10271071
1028- const Token *Token::findmatch (const Token * const startTok, const char pattern[], const nonneg int varId)
1072+ const Token *Token::findsimplematch (const Token * const startTok, const char pattern[], size_t pattern_len, const Token * const end)
1073+ {
1074+ return findsimplematchImpl (startTok, pattern, pattern_len, end);
1075+ }
1076+
1077+ Token *Token::findsimplematch (Token * const startTok, const char pattern[], size_t pattern_len, const Token * const end) {
1078+ return findsimplematchImpl (startTok, pattern, pattern_len, end);
1079+ }
1080+
1081+ template <class T , REQUIRES(" T must be a Token class" , std::is_convertible<T*, const Token*> )>
1082+ static T *findmatchImpl (T * const startTok, const char pattern[], const nonneg int varId)
10291083{
1030- for (const Token * tok = startTok; tok; tok = tok->next ()) {
1084+ for (T * tok = startTok; tok; tok = tok->next ()) {
10311085 if (Token::Match (tok, pattern, varId))
10321086 return tok;
10331087 }
10341088 return nullptr ;
10351089}
10361090
1037- const Token *Token::findmatch (const Token * const startTok, const char pattern[], const Token * const end, const nonneg int varId)
1091+ const Token *Token::findmatch (const Token * const startTok, const char pattern[], const nonneg int varId)
1092+ {
1093+ return findmatchImpl (startTok, pattern, varId);
1094+ }
1095+
1096+ Token *Token::findmatch (Token * const startTok, const char pattern[], const nonneg int varId) {
1097+ return findmatchImpl (startTok, pattern, varId);
1098+ }
1099+
1100+ template <class T , REQUIRES(" T must be a Token class" , std::is_convertible<T*, const Token*> )>
1101+ static T *findmatchImpl (T * const startTok, const char pattern[], const Token * const end, const nonneg int varId)
10381102{
1039- for (const Token * tok = startTok; tok && tok != end; tok = tok->next ()) {
1103+ for (T * tok = startTok; tok && tok != end; tok = tok->next ()) {
10401104 if (Token::Match (tok, pattern, varId))
10411105 return tok;
10421106 }
10431107 return nullptr ;
10441108}
10451109
1110+ const Token *Token::findmatch (const Token * const startTok, const char pattern[], const Token * const end, const nonneg int varId)
1111+ {
1112+ return findmatchImpl (startTok, pattern, end, varId);
1113+ }
1114+
1115+ Token *Token::findmatch (Token * const startTok, const char pattern[], const Token * const end, const nonneg int varId) {
1116+ return findmatchImpl (startTok, pattern, end, varId);
1117+ }
1118+
10461119void Token::function (const Function *f)
10471120{
10481121 mImpl ->mFunction = f;
0 commit comments