]> www.ginac.de Git - ginac.git/blobdiff - ginac/normal.cpp
Remove dependence on depreacted std::auto_ptr<T>.
[ginac.git] / ginac / normal.cpp
index 109f0572493b225e83cf5ca8dce95cec859abfb1..18b4637c4cbee1b3d51dcdd25732b70ea6d58a1d 100644 (file)
@@ -6,7 +6,7 @@
  *  computation, square-free factorization and rational function normalization. */
 
 /*
- *  GiNaC Copyright (C) 1999-2010 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2015 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
@@ -1535,7 +1535,7 @@ ex gcd(const ex &a, const ex &b, ex *ca, ex *cb, bool check_args, unsigned optio
                if (ca)
                        *ca = ex_to<numeric>(aex)/g;
                if (cb)
-                       *cb = bex/g;
+                       *cb = bex/g;
                return g;
        }
 
@@ -1912,7 +1912,7 @@ ex sqrfree(const ex &a, const lst &l)
        else
                result *= quo(tmp, result, x);
 
-       // Put in the reational overall factor again and return
+       // Put in the rational overall factor again and return
        return result * lcm.inverse();
 }
 
@@ -2006,16 +2006,18 @@ ex sqrfree_parfrac(const ex & a, const symbol & x)
  *  @see ex::normal */
 static ex replace_with_symbol(const ex & e, exmap & repl, exmap & rev_lookup)
 {
+       // Since the repl contains replaced expressions we should search for them
+       ex e_replaced = e.subs(repl, subs_options::no_pattern);
+
        // Expression already replaced? Then return the assigned symbol
-       exmap::const_iterator it = rev_lookup.find(e);
+       exmap::const_iterator it = rev_lookup.find(e_replaced);
        if (it != rev_lookup.end())
                return it->second;
-       
+
        // Otherwise create new symbol and add to list, taking care that the
        // replacement expression doesn't itself contain symbols from repl,
        // because subs() is not recursive
        ex es = (new symbol)->setflag(status_flags::dynallocated);
-       ex e_replaced = e.subs(repl, subs_options::no_pattern);
        repl.insert(std::make_pair(es, e_replaced));
        rev_lookup.insert(std::make_pair(e_replaced, es));
        return es;
@@ -2028,16 +2030,18 @@ static ex replace_with_symbol(const ex & e, exmap & repl, exmap & rev_lookup)
  *  @see basic::to_polynomial */
 static ex replace_with_symbol(const ex & e, exmap & repl)
 {
+       // Since the repl contains replaced expressions we should search for them
+       ex e_replaced = e.subs(repl, subs_options::no_pattern);
+
        // Expression already replaced? Then return the assigned symbol
        for (exmap::const_iterator it = repl.begin(); it != repl.end(); ++it)
-               if (it->second.is_equal(e))
+               if (it->second.is_equal(e_replaced))
                        return it->first;
-       
+
        // Otherwise create new symbol and add to list, taking care that the
        // replacement expression doesn't itself contain symbols from repl,
        // because subs() is not recursive
        ex es = (new symbol)->setflag(status_flags::dynallocated);
-       ex e_replaced = e.subs(repl, subs_options::no_pattern);
        repl.insert(std::make_pair(es, e_replaced));
        return es;
 }
@@ -2208,7 +2212,7 @@ ex add::normal(exmap & repl, exmap & rev_lookup, int level) const
                        num_it++; den_it++;
                }
 
-               // Additiion of two fractions, taking advantage of the fact that
+               // Addition of two fractions, taking advantage of the fact that
                // the heuristic GCD algorithm computes the cofactors at no extra cost
                ex co_den1, co_den2;
                ex g = gcd(den, next_den, &co_den1, &co_den2, false);
@@ -2394,7 +2398,7 @@ ex ex::denom() const
                return e.op(1).subs(repl, subs_options::no_pattern);
 }
 
-/** Get numerator and denominator of an expression. If the expresison is not
+/** Get numerator and denominator of an expression. If the expression is not
  *  of the normal form "numerator/denominator", it is first converted to this
  *  form and then a list [numerator, denominator] is returned.
  *
@@ -2583,10 +2587,10 @@ ex expairseq::to_rational(exmap & repl) const
        }
        ex oc = overall_coeff.to_rational(repl);
        if (oc.info(info_flags::numeric))
-               return thisexpairseq(s, overall_coeff);
+               return thisexpairseq(std::move(s), overall_coeff);
        else
                s.push_back(combine_ex_with_coeff_to_pair(oc, _ex1));
-       return thisexpairseq(s, default_overall_coeff());
+       return thisexpairseq(std::move(s), default_overall_coeff());
 }
 
 /** Implementation of ex::to_polynomial() for expairseqs. */
@@ -2601,10 +2605,10 @@ ex expairseq::to_polynomial(exmap & repl) const
        }
        ex oc = overall_coeff.to_polynomial(repl);
        if (oc.info(info_flags::numeric))
-               return thisexpairseq(s, overall_coeff);
+               return thisexpairseq(std::move(s), overall_coeff);
        else
                s.push_back(combine_ex_with_coeff_to_pair(oc, _ex1));
-       return thisexpairseq(s, default_overall_coeff());
+       return thisexpairseq(std::move(s), default_overall_coeff());
 }