00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "SundanceBinaryExpr.hpp"
00032 #include "SundanceExpr.hpp"
00033
00034 using namespace Sundance;
00035 using namespace Sundance;
00036
00037 using namespace Sundance;
00038 using namespace Teuchos;
00039
00040
00041 BinaryExpr::BinaryExpr(const RCP<ScalarExpr>& left,
00042 const RCP<ScalarExpr>& right, int sign)
00043 : ExprWithChildren(tuple(left, right)),
00044 sign_(sign)
00045 {}
00046
00047
00048 bool BinaryExpr::lessThan(const ScalarExpr* other) const
00049 {
00050 const BinaryExpr* b = dynamic_cast<const BinaryExpr*>(other);
00051 TEUCHOS_TEST_FOR_EXCEPTION(b==0, std::logic_error, "cast should never fail at this point");
00052
00053 if (sign_ < b->sign_) return true;
00054 if (sign_ > b->sign_) return false;
00055 return ExprWithChildren::lessThan(other);
00056 }
00057
00058 std::ostream& BinaryExpr:: toText(std::ostream& os, bool paren) const
00059 {
00060 if (Expr::showAllParens() || (paren && parenthesizeSelf())) os << "(";
00061 leftScalar()->toText(os, parenthesizeOperands()) ;
00062 os << opChar();
00063 if (leftScalar()->isHungryDiffOp())
00064 {
00065 rightScalar()->toText(os, true);
00066 }
00067 else
00068 {
00069 rightScalar()->toText(os, parenthesizeOperands() || opChar() == "-");
00070 }
00071 if (Expr::showAllParens() || (paren && parenthesizeSelf())) os << ")";
00072
00073 return os;
00074 }
00075
00076
00077 XMLObject BinaryExpr::toXML() const
00078 {
00079 XMLObject rtn(xmlTag());
00080 rtn.addChild(left().toXML());
00081 rtn.addChild(right().toXML());
00082
00083 return rtn;
00084 }
00085
00086