} else if (is_of_type(c, print_csrc)) {
- if (precedence <= level)
+ if (precedence() <= level)
c.s << "(";
// Print arguments, separated by "+"
// If the coefficient is -1, it is replaced by a single minus sign
if (it->coeff.compare(_num1()) == 0) {
- it->rest.bp->print(c, precedence);
+ it->rest.bp->print(c, precedence());
} else if (it->coeff.compare(_num_1()) == 0) {
c.s << "-";
- it->rest.bp->print(c, precedence);
+ it->rest.bp->print(c, precedence());
} else if (ex_to_numeric(it->coeff).numer().compare(_num1()) == 0) {
- it->rest.bp->print(c, precedence);
+ it->rest.bp->print(c, precedence());
c.s << "/";
- ex_to_numeric(it->coeff).denom().print(c, precedence);
+ ex_to_numeric(it->coeff).denom().print(c, precedence());
} else if (ex_to_numeric(it->coeff).numer().compare(_num_1()) == 0) {
c.s << "-";
- it->rest.bp->print(c, precedence);
+ it->rest.bp->print(c, precedence());
c.s << "/";
- ex_to_numeric(it->coeff).denom().print(c, precedence);
+ ex_to_numeric(it->coeff).denom().print(c, precedence());
} else {
- it->coeff.bp->print(c, precedence);
+ it->coeff.bp->print(c, precedence());
c.s << "*";
- it->rest.bp->print(c, precedence);
+ it->rest.bp->print(c, precedence());
}
// Separator is "+", except if the following expression would have a leading minus sign
if (!overall_coeff.is_zero()) {
if (overall_coeff.info(info_flags::positive))
c.s << '+';
- overall_coeff.bp->print(c, precedence);
+ overall_coeff.bp->print(c, precedence());
}
- if (precedence <= level)
+ if (precedence() <= level)
c.s << ")";
} else {
- if (precedence <= level) {
+ if (precedence() <= level) {
if (is_of_type(c, print_latex))
c.s << "{(";
else
if (!is_of_type(c, print_tree))
overall_coeff.print(c, 0);
else
- overall_coeff.print(c, precedence);
+ overall_coeff.print(c, precedence());
first = false;
}
coeff.print(c);
} else {
if (coeff.csgn() == -1)
- (-coeff).print(c, precedence);
+ (-coeff).print(c, precedence());
else
- coeff.print(c, precedence);
+ coeff.print(c, precedence());
}
if (is_of_type(c, print_latex))
c.s << ' ';
else
c.s << '*';
}
- it->rest.print(c, precedence);
+ it->rest.print(c, precedence());
it++;
}
- if (precedence <= level) {
+ if (precedence() <= level) {
if (is_of_type(c, print_latex))
c.s << ")}";
else
return (new add(vp,overall_coeff))->setflag(status_flags::expanded | status_flags::dynallocated);
}
-//////////
-// static member variables
-//////////
-
-// protected
-
-unsigned add::precedence = 40;
-
} // namespace GiNaC
// functions overriding virtual functions from bases classes
public:
void print(const print_context & c, unsigned level = 0) const;
+ unsigned precedence(void) const {return 40;}
bool info(unsigned inf) const;
int degree(const ex & s) const;
int ldegree(const ex & s) const;
const ex & c) const;
ex recombine_pair_to_ex(const expair & p) const;
ex expand(unsigned options=0) const;
-
- // new virtual functions which can be overridden by derived classes
- // none
-
- // non-virtual functions in this class
- // none
-
-// member variables
-
-protected:
- static unsigned precedence;
};
// utility functions
this->print(print_tree(std::cerr));
}
+/** Return relative operator precedence (for parenthizing output). */
+unsigned basic::precedence(void) const
+{
+ return 70;
+}
+
/** Create a new copy of this on the heap. One can think of this as simulating
* a virtual copy constructor which is needed for instance by the refcounted
* construction of an ex from a basic. */
throw(std::runtime_error("cannot modify multiply referenced object"));
}
-//////////
-// static member variables
-//////////
-
-// protected
-
-unsigned basic::precedence = 70;
-
//////////
// global variables
//////////
virtual void print(const print_context & c, unsigned level = 0) const;
virtual void dbgprint(void) const;
virtual void dbgprinttree(void) const;
+ virtual unsigned precedence(void) const;
virtual bool info(unsigned inf) const;
virtual unsigned nops() const;
virtual ex op(int i) const;
unsigned tinfo_key; ///< typeinfo
mutable unsigned flags; ///< of type status_flags
mutable unsigned hashvalue; ///< hash value
- static unsigned precedence; ///< precedence for printing parens
private:
unsigned refcount; ///< Number of reference counts
};
public:
void print(const print_context & c, unsigned level = 0) const;
+ unsigned precedence(void) const {return 10;}
bool info(unsigned inf) const;
unsigned nops() const;
ex & let_op(int i);
protected:
${STLT} seq;
- static unsigned precedence;
};
// utility functions
} else {
// always print brackets around seq, ignore upper_precedence
- printseq(c, '${open_bracket}', ',', '${close_bracket}', precedence, precedence+1);
+ printseq(c, '${open_bracket}', ',', '${close_bracket}', precedence(), precedence()+1);
}
}
return 0; // nothing has changed
}
-//////////
-// static member variables
-//////////
-
-// protected
-
-unsigned ${CONTAINER}::precedence = 10;
-
} // namespace GiNaC
END_OF_IMPLEMENTATION
} else {
c.s << "[[";
- printseq(c, ',', precedence, level);
+ printseq(c, ',', precedence(), level);
c.s << "]]";
}
}
void expairseq::printpair(const print_context & c, const expair & p, unsigned upper_precedence) const
{
c.s << "[[";
- p.rest.bp->print(c, precedence);
+ p.rest.bp->print(c, precedence());
c.s << ",";
- p.coeff.bp->print(c, precedence);
+ p.coeff.bp->print(c, precedence());
c.s << "]]";
}
// static member variables
//////////
-// protected
-
-unsigned expairseq::precedence = 10;
-
#if EXPAIRSEQ_USE_HASHTAB
unsigned expairseq::maxhashtabsize = 0x4000000U;
unsigned expairseq::minhashtabsize = 0x1000U;
public:
basic * duplicate() const;
void print(const print_context & c, unsigned level = 0) const;
+ unsigned precedence(void) const {return 10;}
bool info(unsigned inf) const;
unsigned nops() const;
ex op(int i) const;
protected:
epvector seq;
ex overall_coeff;
- static unsigned precedence;
#if EXPAIRSEQ_USE_HASHTAB
epplistvector hashtab;
unsigned hashtabsize;
// functions overriding virtual functions from bases classes
public:
void print(const print_context & c, unsigned level = 0) const;
+ unsigned precedence(void) const {return 70;}
int degree(const ex & s) const;
int ldegree(const ex & s) const;
ex coeff(const ex & s, int n = 1) const;
} else if is_of_type(c, print_latex) {
c.s << registered_functions()[serial].TeX_name;
- printseq(c, '(', ',', ')', exprseq::precedence, function::precedence);
+ printseq(c, '(', ',', ')', exprseq::precedence(), function::precedence());
} else {
c.s << registered_functions()[serial].name;
- printseq(c, '(', ',', ')', exprseq::precedence, function::precedence);
+ printseq(c, '(', ',', ')', exprseq::precedence(), function::precedence());
}
}
} else if (is_of_type(c, print_csrc)) {
- if (precedence <= level)
+ if (precedence() <= level)
c.s << "(";
if (!overall_coeff.is_equal(_ex1())) {
- overall_coeff.bp->print(c, precedence);
+ overall_coeff.bp->print(c, precedence());
c.s << "*";
}
// If the exponent is 1 or -1, it is left out
if (it->coeff.compare(_ex1()) == 0 || it->coeff.compare(_num_1()) == 0)
- it->rest.print(c, precedence);
+ it->rest.print(c, precedence());
else {
// Outer parens around ex needed for broken gcc-2.95 parser:
(ex(power(it->rest, abs(ex_to_numeric(it->coeff))))).print(c, level);
}
}
- if (precedence <= level)
+ if (precedence() <= level)
c.s << ")";
} else {
- if (precedence <= level) {
+ if (precedence() <= level) {
if (is_of_type(c, print_latex))
c.s << "{(";
else
coeff.print(c);
} else {
if (coeff.csgn() == -1)
- (-coeff).print(c, precedence);
+ (-coeff).print(c, precedence());
else
- coeff.print(c, precedence);
+ coeff.print(c, precedence());
}
if (is_of_type(c, print_latex))
c.s << ' ';
} else {
first = false;
}
- recombine_pair_to_ex(*it).print(c, precedence);
+ recombine_pair_to_ex(*it).print(c, precedence());
it++;
}
- if (precedence <= level) {
+ if (precedence() <= level) {
if (is_of_type(c, print_latex))
c.s << ")}";
else
return 0; // nothing has changed
}
-//////////
-// static member variables
-//////////
-
-// protected
-
-unsigned mul::precedence = 50;
-
} // namespace GiNaC
// functions overriding virtual functions from bases classes
public:
void print(const print_context & c, unsigned level = 0) const;
+ unsigned precedence(void) const {return 50;}
bool info(unsigned inf) const;
int degree(const ex & s) const;
int ldegree(const ex & s) const;
// non-virtual functions in this class
protected:
epvector * expandchildren(unsigned options) const;
-
-// member variables
-
-protected:
- static unsigned precedence;
};
// utility functions
c.s << "ncmul(";
exvector::const_iterator it = seq.begin(), itend = seq.end()-1;
while (it != itend) {
- it->print(c, precedence);
+ it->print(c, precedence());
c.s << ",";
it++;
}
- it->print(c, precedence);
+ it->print(c, precedence());
c.s << ")";
} else
- printseq(c, '(', '*', ')', precedence, level);
+ printseq(c, '(', '*', ')', precedence(), level);
}
bool ncmul::info(unsigned inf) const
return seq;
}
-//////////
-// static member variables
-//////////
-
-// protected
-
-unsigned ncmul::precedence = 50;
-
//////////
// friend functions
//////////
// functions overriding virtual functions from bases classes
public:
void print(const print_context & c, unsigned level = 0) const;
+ unsigned precedence(void) const {return 50;}
bool info(unsigned inf) const;
int degree(const ex & s) const;
int ldegree(const ex & s) const;
exvector expandchildren(unsigned options) const;
public:
const exvector & get_factors(void) const;
-
-// member variables
-
-protected:
- static unsigned precedence;
};
// friend funtions
const cln::cl_R i = cln::imagpart(cln::the<cln::cl_N>(value));
if (cln::zerop(i)) {
// case 1, real: x or -x
- if ((precedence <= level) && (!this->is_nonneg_integer())) {
+ if ((precedence() <= level) && (!this->is_nonneg_integer())) {
c.s << par_open;
print_real_number(c.s, r);
c.s << par_close;
} else {
if (cln::zerop(r)) {
// case 2, imaginary: y*I or -y*I
- if ((precedence <= level) && (i < 0)) {
+ if ((precedence() <= level) && (i < 0)) {
if (i == -1) {
c.s << par_open+imag_sym+par_close;
} else {
}
} else {
// case 3, complex: x+y*I or x-y*I or -x+y*I or -x-y*I
- if (precedence <= level)
+ if (precedence() <= level)
c.s << par_open;
print_real_number(c.s, r);
if (i < 0) {
c.s << mul_sym+imag_sym;
}
}
- if (precedence <= level)
+ if (precedence() <= level)
c.s << par_close;
}
}
return 0;
}
-
-//////////
-// static member variables
-//////////
-
-// protected
-
-unsigned numeric::precedence = 30;
-
//////////
// global constants
//////////
// functions overriding virtual functions from bases classes
public:
void print(const print_context & c, unsigned level = 0) const;
+ unsigned precedence(void) const {return 30;}
bool info(unsigned inf) const;
bool has(const ex &other) const;
ex eval(int level = 0) const;
// member variables
protected:
- static unsigned precedence;
cln::cl_number value;
};
else
c.s << ")";
} else {
- if (precedence <= level) {
+ if (precedence() <= level) {
if (is_of_type(c, print_latex))
c.s << "{(";
else
c.s << "(";
}
- basis.print(c, precedence);
+ basis.print(c, precedence());
c.s << "^";
- exponent.print(c, precedence);
- if (precedence <= level) {
+ exponent.print(c, precedence());
+ if (precedence() <= level) {
if (is_of_type(c, print_latex))
c.s << ")}";
else
}
*/
-//////////
-// static member variables
-//////////
-
-// protected
-
-unsigned power::precedence = 60;
-
// helper function
ex sqrt(const ex & a)
// functions overriding virtual functions from bases classes
public:
void print(const print_context & c, unsigned level = 0) const;
+ unsigned precedence(void) const {return 60;}
bool info(unsigned inf) const;
unsigned nops() const;
ex & let_op(int i);
protected:
ex basis;
ex exponent;
- static unsigned precedence;
};
// utility functions
} else {
- if (precedence <= level)
+ if (precedence() <= level)
c.s << "(";
std::string par_open = is_of_type(c, print_latex) ? "{(" : "(";
Order(power(var-point,i->coeff)).print(c);
}
- if (precedence <= level)
+ if (precedence() <= level)
c.s << ")";
}
}
return e;
}
-//////////
-// static member variables
-//////////
-
-// protected
-
-unsigned pseries::precedence = 38; // for clarity just below add::precedence
-
} // namespace GiNaC
// functions overriding virtual functions from base classes
public:
void print(const print_context & c, unsigned level = 0) const;
+ unsigned precedence(void) const {return 38;} // for clarity just below add::precedence
unsigned nops(void) const;
ex op(int i) const;
ex &let_op(int i);
/** Expansion point */
ex point;
-
- static unsigned precedence;
};
/** Return a reference to the pseries object embedded in an expression.
classname(const classname & other); \
const classname & operator=(const classname & other); \
basic * duplicate() const; \
- unsigned get_precedence(void) const {return precedence;} \
protected: \
void copy(const classname & other); \
void destroy(bool call_parent); \
} else {
- if (precedence <= level)
+ if (precedence() <= level)
c.s << "(";
- lh.print(c, precedence);
+ lh.print(c, precedence());
switch (o) {
case equal:
c.s << "==";
default:
c.s << "(INVALID RELATIONAL OPERATOR)";
}
- rh.print(c, precedence);
- if (precedence <= level)
+ rh.print(c, precedence());
+ if (precedence() <= level)
c.s << ")";
}
}
}
}
-//////////
-// static member variables
-//////////
-
-// protected
-
-unsigned relational::precedence = 20;
-
} // namespace GiNaC
// functions overriding virtual functions from bases classes
public:
void print(const print_context & c, unsigned level = 0) const;
+ unsigned precedence(void) const {return 20;}
bool info(unsigned inf) const;
unsigned nops() const;
ex & let_op(int i);
ex lh;
ex rh;
operators o;
- static unsigned precedence;
};
// utility functions