* Implementation of GiNaC's ABC. */
/*
- * GiNaC Copyright (C) 1999-2015 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2018 Johannes Gutenberg University Mainz, Germany
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
}
if (copy) {
- copy->setflag(status_flags::dynallocated);
copy->clearflag(status_flags::hash_calculated | status_flags::expanded);
return *copy;
} else
pre_coeff = pre_coeff.coeff(li, cexp);
key *= pow(li, cexp);
}
- exmap::iterator ci = cmap.find(key);
+ auto ci = cmap.find(key);
if (ci != cmap.end())
ci->second += pre_coeff;
else
exvector resv;
for (auto & mi : cmap)
resv.push_back((mi.first)*(mi.second));
- return (new add(resv))->setflag(status_flags::dynallocated);
+ return dynallocate<add>(resv);
} else {
}
/** Perform automatic non-interruptive term rewriting rules. */
-ex basic::eval(int level) const
+ex basic::eval() const
{
// There is nothing to do for basic objects:
return hold();
/** Function object to be applied by basic::evalf(). */
struct evalf_map_function : public map_function {
- int level;
- evalf_map_function(int l) : level(l) {}
- ex operator()(const ex & e) override { return evalf(e, level); }
+ ex operator()(const ex & e) override { return evalf(e); }
};
/** Evaluate object numerically. */
-ex basic::evalf(int level) const
+ex basic::evalf() const
{
if (nops() == 0)
return *this;
else {
- if (level == 1)
- return *this;
- else if (level == -max_recursion_level)
- throw(std::runtime_error("max recursion level reached"));
- else {
- evalf_map_function map_evalf(level - 1);
- return map(map_evalf);
- }
+ evalf_map_function map_evalf;
+ return map(map_evalf);
}
}
ex basic::subs_one_level(const exmap & m, unsigned options) const
{
if (options & subs_options::no_pattern) {
- auto it = m.find(*this);
+ ex thisex = *this; // NB: *this may be deleted here.
+ auto it = m.find(thisex);
if (it != m.end())
return it->second;
- return *this;
+ return thisex;
} else {
for (auto & it : m) {
exmap repl_lst;
// Something changed, clone the object
basic *copy = duplicate();
- copy->setflag(status_flags::dynallocated);
copy->clearflag(status_flags::hash_calculated | status_flags::expanded);
// Substitute the changed operand
// global variables
//////////
-int max_recursion_level = 1024;
-
-
#ifdef GINAC_COMPARE_STATISTICS
compare_statistics_t::~compare_statistics_t()
{