]> www.ginac.de Git - ginac.git/commitdiff
Add trivial shortcuts in expair plumbing of class add.
authorRichard Kreckel <kreckel@ginac.de>
Sat, 7 Nov 2015 00:50:00 +0000 (01:50 +0100)
committerRichard Kreckel <kreckel@ginac.de>
Sat, 7 Nov 2015 00:56:12 +0000 (01:56 +0100)
These little shortcuts in add::split_ex_to_pair(ex) and in
add::combine_ex_with_coeff_to_pair(ex, ex) avoid the creation of
new ex objects. These pieces of code are executed so often that this
patch speeds up GiNaC by 5-10%, depending on test.

ginac/add.cpp

index d66133ebdbfc4eacd83ee8365e94cdad9fe1a686..ccd49240d3ba9e3713479d3baa6f8d446a6182b8 100644 (file)
@@ -564,6 +564,8 @@ expair add::split_ex_to_pair(const ex & e) const
        if (is_exactly_a<mul>(e)) {
                const mul &mulref(ex_to<mul>(e));
                const ex &numfactor = mulref.overall_coeff;
        if (is_exactly_a<mul>(e)) {
                const mul &mulref(ex_to<mul>(e));
                const ex &numfactor = mulref.overall_coeff;
+               if (numfactor.is_equal(_ex1))
+                       return expair(e, _ex1);
                mul *mulcopyp = new mul(mulref);
                mulcopyp->overall_coeff = _ex1;
                mulcopyp->clearflag(status_flags::evaluated);
                mul *mulcopyp = new mul(mulref);
                mulcopyp->overall_coeff = _ex1;
                mulcopyp->clearflag(status_flags::evaluated);
@@ -581,6 +583,8 @@ expair add::combine_ex_with_coeff_to_pair(const ex & e,
        if (is_exactly_a<mul>(e)) {
                const mul &mulref(ex_to<mul>(e));
                const ex &numfactor = mulref.overall_coeff;
        if (is_exactly_a<mul>(e)) {
                const mul &mulref(ex_to<mul>(e));
                const ex &numfactor = mulref.overall_coeff;
+               if (numfactor.is_equal(_ex1))
+                       return expair(e, c);
                mul *mulcopyp = new mul(mulref);
                mulcopyp->overall_coeff = _ex1;
                mulcopyp->clearflag(status_flags::evaluated);
                mul *mulcopyp = new mul(mulref);
                mulcopyp->overall_coeff = _ex1;
                mulcopyp->clearflag(status_flags::evaluated);
@@ -588,13 +592,13 @@ expair add::combine_ex_with_coeff_to_pair(const ex & e,
                mulcopyp->setflag(status_flags::dynallocated);
                if (c.is_equal(_ex1))
                        return expair(*mulcopyp, numfactor);
                mulcopyp->setflag(status_flags::dynallocated);
                if (c.is_equal(_ex1))
                        return expair(*mulcopyp, numfactor);
-               else if (numfactor.is_equal(_ex1))
-                       return expair(*mulcopyp, c);
                else
                        return expair(*mulcopyp, ex_to<numeric>(numfactor).mul_dyn(ex_to<numeric>(c)));
        } else if (is_exactly_a<numeric>(e)) {
                if (c.is_equal(_ex1))
                        return expair(e, _ex1);
                else
                        return expair(*mulcopyp, ex_to<numeric>(numfactor).mul_dyn(ex_to<numeric>(c)));
        } else if (is_exactly_a<numeric>(e)) {
                if (c.is_equal(_ex1))
                        return expair(e, _ex1);
+               if (e.is_equal(_ex1))
+                       return expair(c, _ex1);
                return expair(ex_to<numeric>(e).mul_dyn(ex_to<numeric>(c)), _ex1);
        }
        return expair(e, c);
                return expair(ex_to<numeric>(e).mul_dyn(ex_to<numeric>(c)), _ex1);
        }
        return expair(e, c);