ex add::eval(int level) const
{
std::auto_ptr<epvector> evaled_seqp = evalchildren(level);
- if (evaled_seqp.get()) {
+ if (unlikely(evaled_seqp.get() != 0)) {
// do more evaluation later
return (new add(evaled_seqp, overall_coeff))->
setflag(status_flags::dynallocated);
#include "utils.h"
#include "hash_seed.h"
#include "indexed.h"
+#include "compiler.h"
#include <algorithm>
#if EXPAIRSEQ_USE_HASHTAB
// returns a pointer to a newly created epvector otherwise
// (which has to be deleted somewhere else)
- if (level==1)
+ if (likely(level==1))
return std::auto_ptr<epvector>(0);
if (level == -max_recursion_level)
ex mul::eval(int level) const
{
std::auto_ptr<epvector> evaled_seqp = evalchildren(level);
- if (evaled_seqp.get()) {
+ if (unlikely(evaled_seqp.get() != 0)) {
// do more evaluation later
return (new mul(evaled_seqp, overall_coeff))->
setflag(status_flags::dynallocated);
numeric factor = coeff;
for (unsigned i = 0; i < exponent.size(); ++i) {
const ex & r = a.seq[i].rest;
- const ex & c = a.seq[i].coeff;
GINAC_ASSERT(!is_exactly_a<add>(r));
GINAC_ASSERT(!is_exactly_a<power>(r) ||
!is_exactly_a<numeric>(ex_to<power>(r).exponent) ||
!is_exactly_a<add>(ex_to<power>(r).basis) ||
!is_exactly_a<mul>(ex_to<power>(r).basis) ||
!is_exactly_a<power>(ex_to<power>(r).basis));
+ GINAC_ASSERT(is_exactly_a<numeric>(a.seq[i].coeff));
+ const numeric & c = ex_to<numeric>(a.seq[i].coeff);
if (exponent[i] == 0) {
// optimize away
} else if (exponent[i] == 1) {
// optimized
term.push_back(r);
- factor = factor.mul(ex_to<numeric>(c));
+ if (c != *_num1_p)
+ factor = factor.mul(c);
} else { // general case exponent[i] > 1
term.push_back((new power(r, exponent[i]))->setflag(status_flags::dynallocated));
- factor = factor.mul(ex_to<numeric>(c).power(exponent[i]));
+ if (c != *_num1_p)
+ factor = factor.mul(c.power(exponent[i]));
}
}
result.push_back(a.combine_ex_with_coeff_to_pair(mul(term).expand(options), factor));