| 2834 | } |
| 2835 | |
| 2836 | static 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 | |
| 2868 | namespace { |
| 2869 | struct LoopAnalyzer { |
no test coverage detected