SNodeArray &StmtList::removeUnusedAssignments() { DISABLEDEBUGSTRING(*this); bool stable; do { stable = true; const size_t childCount = size(), stmtCount = childCount-1; for(size_t i = 0; i < stmtCount; i++) { SNode assign = (*this)[i]; SNode expr = assign.right(); if(expr.isName()) { getTree().unmarkAll(); assign.left().mark(); getTree().traverseTree(NameSubstituter(assign.left().getName(), expr.getName())); getTree().unmarkAll(); remove(i); stable = false; break; } } } while(!stable); for(int i = (int)size()-1; i--;) { // Remove unused assignments const SNode &stmt = (*this)[i]; const String &varName = stmt.left().getName(); bool isUsed = false; for(size_t j = i+1; j < size(); j++) { if((*this)[j].dependsOn(varName)) { isUsed = true; break; } } if(!isUsed) { remove(i); } } ENABLEDEBUGSTRING(*this); return *this; }
SNode SNode::multiplyFactorSum(SNode factor, SNode sum) const { ENTERMETHOD2(factor,sum); CHECKNODETYPE(factor,NT_POWER); CHECKNODETYPE(sum ,NT_SUM ); if((factor.base().getSymbol() == SUM) && factor.exponent().isOne()) { RETURNNODE(multiplySumSum(factor.base(),sum)); } else { const AddentArray &sa = sum.getAddentArray(); AddentArray tmp(sa.getTree(),sa.size()); for(size_t i = 0; i < sa.size(); i++) { SNode e = sa[i]; tmp.add(addentExp(factor * e.left(),e.isPositive())); } RETURNNODE( sumExp(tmp) ); } }