X-Git-Url: https://ginac.de/ginac.git//ginac.git?a=blobdiff_plain;f=ginac%2Fbasic.cpp;h=92bd16053d8e921d35b3b26ee323545bd100e7ae;hb=e99dbce56fa733fdba17c78aec312ffd44cb20bd;hp=eb8e8ca90605c12d7a84f0ed4608353293acfcb8;hpb=f1637dceefe0fbf79308958f8bc28dedd38aab85;p=ginac.git diff --git a/ginac/basic.cpp b/ginac/basic.cpp index eb8e8ca9..92bd1605 100644 --- a/ginac/basic.cpp +++ b/ginac/basic.cpp @@ -232,7 +232,7 @@ bool basic::has(const ex & other) const /** Construct new expression by applying the specified function to all * sub-expressions (one level only, not recursively). */ -ex basic::map(map_func f) const +ex basic::map(map_function & f) const { unsigned num = nops(); if (num == 0) @@ -363,13 +363,17 @@ ex basic::evalf(int level) const return *this; } -/** Evaluate sums and products of matrices. */ +/** Function object to be applied by basic::evalm(). */ +struct evalm_map_function : public map_function { + ex operator()(const ex & e) { return GiNaC::evalm(e); } +} fcn; +/** Evaluate sums, products and integer powers of matrices. */ ex basic::evalm(void) const { if (nops() == 0) return *this; else - return map(GiNaC::evalm); + return map(fcn); } /** Perform automatic symbolic evaluations on indexed expression that @@ -732,6 +736,7 @@ void basic::ensure_if_modifiable(void) const { if (this->refcount>1) throw(std::runtime_error("cannot modify multiply referenced object")); + clearflag(status_flags::hash_calculated); } //////////