// protected
-#if 0
-void basic::copy(const basic & other)
-{
- flags=other.flags & ~ status_flags::dynallocated;
- hashvalue=other.hashvalue;
- tinfo_key=other.tinfo_key;
-}
-#endif
+// none (all inlined)
//////////
// other constructors
debugmsg("basic constructor from archive_node", LOGLEVEL_CONSTRUCT);
// Reconstruct tinfo_key from class name
- string class_name;
+ std::string class_name;
if (n.find_string("class", class_name))
tinfo_key = find_tinfo_key(class_name);
else
// public
/** Output to stream formatted to be useful as ginsh input. */
-void basic::print(ostream & os, unsigned upper_precedence) const
+void basic::print(std::ostream & os, unsigned upper_precedence) const
{
debugmsg("basic print",LOGLEVEL_PRINT);
os << "[basic object]";
/** Output to stream in ugly raw format, so brave developers can have a look
* at the underlying structure. */
-void basic::printraw(ostream & os) const
+void basic::printraw(std::ostream & os) const
{
debugmsg("basic printraw",LOGLEVEL_PRINT);
os << "[basic object]";
/** Output to stream formatted in tree- (indented-) form, so developers can
* have a look at the underlying structure. */
-void basic::printtree(ostream & os, unsigned indent) const
+void basic::printtree(std::ostream & os, unsigned indent) const
{
debugmsg("basic printtree",LOGLEVEL_PRINT);
- os << string(indent,' ') << "type=" << typeid(*this).name()
- << ", hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")"
+ os << std::string(indent,' ') << "type=" << typeid(*this).name()
+ << ", hash=" << hashvalue
+ << " (0x" << std::hex << hashvalue << std::dec << ")"
<< ", flags=" << flags
- << ", nops=" << nops() << endl;
+ << ", nops=" << nops() << std::endl;
for (unsigned i=0; i<nops(); ++i) {
op(i).printtree(os,indent+delta_indent);
}
* @param type variable type (one of the csrc_types)
* @param upper_precedence operator precedence of caller
* @see ex::printcsrc */
-void basic::printcsrc(ostream & os, unsigned type, unsigned upper_precedence) const
+void basic::printcsrc(std::ostream & os, unsigned type, unsigned upper_precedence) const
{
debugmsg("basic print csrc", LOGLEVEL_PRINT);
}
/** Little wrapper arount print to be called within a debugger. */
void basic::dbgprint(void) const
{
- print(cerr);
- cerr << endl;
+ print(std::cerr);
+ std::cerr << std::endl;
}
/** Little wrapper arount printtree to be called within a debugger. */
void basic::dbgprinttree(void) const
{
- printtree(cerr,0);
+ printtree(std::cerr,0);
}
basic * basic::duplicate() const
/** Number of operands/members. */
unsigned basic::nops() const
{
+ // iterating from 0 to nops() on atomic objects should be an empty loop,
+ // and accessing their elements is a range error. Container objects should
+ // override this.
return 0;
}
return false;
}
+/** Return degree of highest power in symbol s. */
int basic::degree(const symbol & s) const
{
return 0;
}
+/** Return degree of lowest power in symbol s. */
int basic::ldegree(const symbol & s) const
{
return 0;
}
+/** Return coefficient of degree n in symbol s. */
ex basic::coeff(const symbol & s, int n) const
{
return n==0 ? *this : _ex0();
}
+/** Sort expression in terms of powers of some symbol.
+ * @param s symbol to sort in. */
ex basic::collect(const symbol & s) const
{
ex x;
- int ldeg=ldegree(s);
- int deg=degree(s);
+ int ldeg = this->ldegree(s);
+ int deg = this->degree(s);
for (int n=ldeg; n<=deg; n++) {
- x += coeff(s,n)*power(s,n);
+ x += this->coeff(s,n)*power(s,n);
}
return x;
}
+/* Perform automatic symbolic evaluations on expression. */
ex basic::eval(int level) const
{
+ // There is nothing to do for basic objects:
return this->hold();
}
/** Evaluate object numerically. */
ex basic::evalf(int level) const
{
+ // There is nothing to do for basic objects:
return *this;
}
+/* Substitute a set of symbols. */
ex basic::subs(const lst & ls, const lst & lr) const
{
return *this;
ex basic::diff(const symbol & s, unsigned nth) const
{
// trivial: zeroth derivative
- if (!nth)
+ if (nth==0)
return ex(*this);
- // evaluate unevalueted *this before differentiating
+ // evaluate unevaluated *this before differentiating
if (!(flags & status_flags::evaluated))
return ex(*this).diff(s, nth);
- ex ndiff = derivative(s);
+ ex ndiff = this->derivative(s);
while (!ndiff.is_zero() && // stop differentiating zeros
nth>1) {
ndiff = ndiff.diff(s);
throw(std::logic_error("differentiation not supported by this type"));
}
+/** Returns order relation between two objects of same type. Needs to be
+ * implemented by each class. */
int basic::compare_same_type(const basic & other) const
{
return compare_pointers(this, &other);
}
+/** Returns true if two objects of same type are equal. Normally needs
+ * not be reimplemented as long as it wasn't overwritten by some parent
+ * class, since it just calls complare_same_type(). */
bool basic::is_equal_same_type(const basic & other) const
{
return compare_same_type(other)==0;
return v;
}
+/** Expand expression, i.e. multiply it out and return the result as a new
+ * expression. */
ex basic::expand(unsigned options) const
{
return this->setflag(status_flags::expanded);
// public
+/** Substitute symbols in expression and return the result as a new expression.
+ * There are two valid types of replacement arguments: 1) a relational like
+ * symbol==ex and 2) a list of relationals lst(symbol1==ex1,symbol2==ex2,...),
+ * which is converted to subs(lst(symbol1,symbol2,...),lst(ex1,ex2,...)).
+ * In addition, an object of class idx can be used instead of a symbol. */
ex basic::subs(const ex & e) const
{
- // accept 2 types of replacement expressions:
- // - symbol==ex
- // - lst(symbol1==ex1,symbol2==ex2,...)
- // convert to subs(lst(symbol1,symbol2,...),lst(ex1,ex2,...))
- // additionally, idx can be used instead of symbol
if (e.info(info_flags::relation_equal)) {
return subs(lst(e));
}
return cmpval;
}
+/** Test for equality. */
bool basic::is_equal(const basic & other) const
{
unsigned hash_this = gethash();
// protected
+/** Stop further evaluation.
+ * @see basic::eval */
const basic & basic::hold(void) const
{
return setflag(status_flags::evaluated);
// protected
-unsigned basic::precedence=70;
-unsigned basic::delta_indent=4;
+unsigned basic::precedence = 70;
+unsigned basic::delta_indent = 4;
//////////
// global constants