MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / isTernaryAssignment

Function isTernaryAssignment

lib/checkstl.cpp:2836–2866  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2834}
2835
2836static bool isTernaryAssignment(const Token* assignTok, nonneg int loopVarId, nonneg int assignVarId, LoopType loopType, std::string& algo)
2837{
2838 if (!Token::simpleMatch(assignTok->astOperand2(), "?"))
2839 return false;
2840 const Token* condTok = assignTok->astOperand2()->astOperand1();
2841 if (!Token::Match(condTok, "<|<=|>=|>"))
2842 return false;
2843
2844 const Token* colon = assignTok->astOperand2()->astOperand2();
2845 if (loopType == LoopType::RANGE) {
2846 if (!(condTok->astOperand1()->varId() && condTok->astOperand2()->varId() && colon->astOperand1()->varId() && colon->astOperand2()->varId()))
2847 return false;
2848 }
2849 else if (loopType == LoopType::INDEX) {
2850 int nVar = 0, nCont = 0;
2851 for (const Token* tok : { condTok->astOperand1(), condTok->astOperand2(), colon->astOperand1(), colon->astOperand2() }) {
2852 if (tok->varId())
2853 ++nVar;
2854 else if (tok->str() == "[" && tok->astOperand1()->varId() && tok->astOperand1()->valueType() && tok->astOperand1()->valueType()->container &&
2855 tok->astOperand2()->varId() == loopVarId)
2856 ++nCont;
2857 }
2858 if (nVar != 2 || nCont != 2)
2859 return false;
2860 }
2861 else
2862 return false;
2863
2864 algo = minmaxCompare(condTok, loopVarId, assignVarId, loopType, colon->astOperand1()->varId() == assignVarId);
2865 return true;
2866}
2867
2868namespace {
2869 struct LoopAnalyzer {

Callers 1

useStlAlgorithmMethod · 0.85

Calls 5

minmaxCompareFunction · 0.85
astOperand2Method · 0.80
astOperand1Method · 0.80
simpleMatchFunction · 0.70
strMethod · 0.45

Tested by

no test coverage detected