X-Git-Url: https://ginac.de/ginac.git//ginac.git?a=blobdiff_plain;f=ginac%2Fbasic.cpp;h=59e7dbd97be7447cf2a3c4b1c020adc3fb4de6b5;hb=d38e670373b3df4e7ff5835ac4f67743f1351e95;hp=a2be1ca51ce4c0922ef3a361bd5fdab0dcbbb360;hpb=6c946d4c762f5a0d6a3b742f03556dd018d63886;p=ginac.git diff --git a/ginac/basic.cpp b/ginac/basic.cpp index a2be1ca5..59e7dbd9 100644 --- a/ginac/basic.cpp +++ b/ginac/basic.cpp @@ -3,7 +3,7 @@ * Implementation of GiNaC's ABC. */ /* - * GiNaC Copyright (C) 1999-2015 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2016 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 @@ -373,7 +373,7 @@ ex basic::collect(const ex & s, bool distributed) const 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 @@ -418,25 +418,17 @@ ex basic::eval() const /** 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); } } @@ -593,10 +585,11 @@ bool basic::match(const ex & pattern, exmap& repl_lst) const 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; @@ -909,9 +902,6 @@ void basic::ensure_if_modifiable() const // global variables ////////// -int max_recursion_level = 1024; - - #ifdef GINAC_COMPARE_STATISTICS compare_statistics_t::~compare_statistics_t() {