ExpressionNode::ExpressionNode(const ExpressionNode & other): //copy constructor type(other.getType()), operation(other.getOperation()), activechildren(other.getOperation()->getArity()), right(0), firstChild(0), variable(other.getVariable()), value(other.getValue()) { setRight(other.getRight()); setFirstChild(other.getFirstChild()); // automatically also sets other children }
void ExpressionNode::replace(const ExpressionNode &newNode) { std::clog << "...<replacing> " << *this << " with " << newNode << std::endl; //ExpressionNode *curOld; //ExpressionNode *curNew; setType(newNode.getType()); setOperation(newNode.getOperation()); // setRight(newNode.getRight()); setFirstChild(newNode.getFirstChild()); // automatically also sets other children //curOld = firstChild; //curNew = newNode.getFirstChild(); //while (curNew != 0) //{ //curOld->setRight(curNew->getRight()); //curOld = curOld->getRight(); //curNew = curNew->getRight(); //} setVariable(newNode.getVariable()); setValue(newNode.getValue()); std::clog << "...</replacing>" << std::endl; }
bool Multiplication::isCompatible(const ExpressionNode& left, const ExpressionNode& right) { if (left.getType() == NUMBER && right.getType() == NUMBER) { return true; } else if (left.getType() == VARIABLE && right.getType() == VARIABLE) { if (left.getVariable() == right.getVariable()) { return true; } } else if (left.getType() == OPERATION) { if (left.getOperation() == &ADDITION || left.getOperation() == &SUM) { return true; } else if (left.getOperation() == &MULTIPLICATION || left.getOperation() == &PRODUCT) { return true; } } else if (right.getType() == OPERATION) { if (right.getOperation() == &ADDITION || right.getOperation() == &SUM) { return true; } else if (right.getOperation() == &MULTIPLICATION || right.getOperation() == &PRODUCT) { return true; } } return false; }
bool ExpressionNode::operator== (const ExpressionNode& other) const { ExpressionNode *selfptr; ExpressionNode *otherptr; if (getType() == other.getType() && getOperation() == other.getOperation() && getVariable() == other.getVariable() && getValue() == other.getValue() ) { selfptr = firstChild; otherptr = other.getFirstChild(); while (selfptr != 0 && otherptr != 0) { if (*selfptr == *otherptr) { selfptr = selfptr->getRight(); otherptr = otherptr->getRight(); } else { return false; } } if (selfptr == 0 && otherptr == 0) { return true; } else { assert(selfptr != otherptr); return false; } } else { return false; } }