void ExpressionNode::remove(ExpressionNode& target) { ExpressionNode * parent = findParentOf(target); if (this == &target) { throw EmptyTreeError(); } else { assert(parent!=0); if (parent->getOperation()->getArity() == 1) { remove(*parent); } else { target.replace(ExpressionNode(parent->getOperation()->getIdentity())); (*parent).simplify(); } } }
ExpressionNode Addition::addTerms(const ExpressionNode& term1, const ExpressionNode& term2) { std::clog << "checkpoint addTerms" << std::endl; Number coefficient1; Number coefficient2; const ExpressionNode * varpart1; const ExpressionNode * varpart2; ExpressionNode * left; ExpressionNode * right; ExpressionNode newRight; ExpressionNode newCoef; ExpressionNode newNode; if (term1.getType() == NUMBER) { coefficient1 = term1.getValue(); varpart1 = 0; } else if (term1.getType() == OPERATION) { if (term1.getOperation() == &MULTIPLICATION) { left = term1.getFirstChild(); right = left->getRight(); if (left->getType() == NUMBER) { coefficient1 = left->getValue(); varpart1 = right; } else if (right->getType() == NUMBER) { coefficient1 = right->getValue(); varpart1 = left; } else { coefficient1 = MULTIPLICATION.getIdentity(); varpart1 = &term1; } } else { coefficient1 = MULTIPLICATION.getIdentity(); varpart1 = &term1; } } else // VARIABLE { assert(term1.getType() == VARIABLE); coefficient1 = MULTIPLICATION.getIdentity(); varpart1 = &term1; } if (term2.getType() == NUMBER) { coefficient2 = term2.getValue(); varpart2 = 0; } else if (term2.getType() == OPERATION) { if (term2.getOperation() == &MULTIPLICATION) { left = term2.getFirstChild(); right = left->getRight(); if (left->getType() == NUMBER) { coefficient2 = left->getValue(); varpart2 = right; } else if (right->getType() == NUMBER) { coefficient2 = right->getValue(); varpart2 = left; } else { coefficient2 = MULTIPLICATION.getIdentity(); varpart2 = &term2; } } else { coefficient2 = MULTIPLICATION.getIdentity(); varpart2 = &term2; } } else // VARIABLE { assert(term2.getType() == VARIABLE); coefficient2 = MULTIPLICATION.getIdentity(); varpart2 = &term1; } if (varpart1 != 0 && varpart2 != 0) { if (*varpart1 == *varpart2) { std::clog << "addTerms simplify like terms" << std::endl << "coef1: " << coefficient1 << " var1: " << *varpart1 << std::endl << "coef2: " << coefficient2 << " var2: " << *varpart2 << std::endl; newCoef = ExpressionNode(coefficient1 + coefficient2); newRight.replace(*varpart1); newNode = ExpressionNode(&MULTIPLICATION); newNode.setFirstChild(&newCoef); newNode.getFirstChild()->setRight(&newRight); std::clog << "sum: " << newNode << std::endl; return newNode; } else { throw ExpressionNode::GenericError("adding unaddable terms"); } } else { if (varpart1 == 0 && varpart2 == 0) { std::clog << "sum: " << coefficient1 + coefficient2 << std::endl; return ExpressionNode(coefficient1 + coefficient2); } else { throw ExpressionNode::GenericError("adding unaddable terms"); } } throw ExpressionNode::GenericError("reached end of addTerms w/o returning."); //if (left.getNodeType() == NUMBER && right.getNodeType() == NUMBER) //{ //ExpressionNode newNode; //newNode.setNodeType(NUMBER); //newNode.setValue(Number(left.getValue().getInt() + right.getValue().getInt())); //return newNode; //} }