37 template <
class T,
class U>
60 virtual void print(std::ostream& str,
int precedence = 99)
const;
78 template <
class T,
class U>
80 :
Scalar<
T>(rhs), fun(rhs.fun), lft(rhs.lft->clone()), rgt(rhs.rgt->clone()) {}
82 template <
class T,
class U>
85 : fun(function), lft(left), rgt(right) {}
87 template <
class T,
class U>
90 template <
class T,
class U>
95 template <
class T,
class U>
98 U op1 = lft->evaluate();
99 U op2 = rgt->evaluate();
100 T result = (*fun.function)(op1, op2);
109 if (result ==
T(0))
return result;
117 template <
class T,
class U>
122 bool isConst = left->isConstant() && right->isConstant();
136 template <
class T,
class U>
138 if (fun.precedence >= 0) {
140 if (fun.precedence <= precedence) os <<
"(";
141 lft->print(os, fun.precedence - 1);
143 rgt->print(os, fun.precedence);
144 if (fun.precedence <= precedence) os <<
")";
147 os << fun.name <<
'(';
A pointer to a scalar expression.
A scalar expression with two scalar operands.
static Scalar< T > * make(const TFunction2< T, U > &, PtrToScalar< U > left, PtrToScalar< U > right)
Make a new expression.
SBinary(const SBinary< T, U > &)
virtual void print(std::ostream &str, int precedence=99) const
Print expression.
void operator=(const SBinary &)
virtual Scalar< T > * clone() const
Make clone.
virtual T evaluate() const
Evaluate.
const TFunction2< T, U > & fun
A scalar constant expression.
Representation objects and parsers for attribute expressions.
A function of two U's returning a T.
int precedence
The operator precedence.