]> www.ginac.de Git - ginac.git/blobdiff - ginac/expairseq.cpp
- removed an unused statement in tensor.cpp
[ginac.git] / ginac / expairseq.cpp
index f0356536dd8da6c71abf87fc4593dfab7de9d822..3c5a656bd2d52d686eec3abcadbe8ff679d8c83d 100644 (file)
@@ -3,7 +3,7 @@
  *  Implementation of sequences of expression pairs. */
 
 /*
- *  GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2002 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
@@ -20,6 +20,7 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#include <iostream>
 #include <algorithm>
 #include <string>
 #include <stdexcept>
@@ -125,6 +126,7 @@ expairseq::expairseq(const exvector &v) : inherited(TINFO_expairseq)
 expairseq::expairseq(const epvector &v, const ex &oc)
   : inherited(TINFO_expairseq), overall_coeff(oc)
 {
+       GINAC_ASSERT(is_a<numeric>(oc));
        construct_from_epvector(v);
        GINAC_ASSERT(is_canonical());
 }
@@ -133,6 +135,7 @@ expairseq::expairseq(epvector *vp, const ex &oc)
   : inherited(TINFO_expairseq), overall_coeff(oc)
 {
        GINAC_ASSERT(vp!=0);
+       GINAC_ASSERT(is_a<numeric>(oc));
        construct_from_epvector(*vp);
        delete vp;
        GINAC_ASSERT(is_canonical());
@@ -401,7 +404,7 @@ ex expairseq::subs(const lst &ls, const lst &lr, bool no_pattern) const
 {
        epvector *vp = subschildren(ls, lr, no_pattern);
        if (vp)
-               return ex_to<basic>(thisexpairseq(vp, overall_coeff)).basic::subs(ls, lr, no_pattern);
+               return ex_to<basic>(thisexpairseq(vp, overall_coeff));
        else
                return basic::subs(ls, lr, no_pattern);
 }
@@ -1056,7 +1059,7 @@ void expairseq::make_flat(const epvector &v)
 /** Brings this expairseq into a sorted (canonical) form. */
 void expairseq::canonicalize(void)
 {
-       sort(seq.begin(), seq.end(), expair_is_less());
+       std::sort(seq.begin(), seq.end(), expair_rest_is_less());
 }
 
 
@@ -1065,42 +1068,43 @@ void expairseq::canonicalize(void)
  *  instance. */
 void expairseq::combine_same_terms_sorted_seq(void)
 {
+       if (seq.size()<2)
+               return;
+
        bool needs_further_processing = false;
-       
-       if (seq.size()>1) {
-               epvector::iterator itin1 = seq.begin();
-               epvector::iterator itin2 = itin1+1;
-               epvector::iterator itout = itin1;
-               epvector::iterator last = seq.end();
-               // must_copy will be set to true the first time some combination is 
-               // possible from then on the sequence has changed and must be compacted
-               bool must_copy = false;
-               while (itin2!=last) {
-                       if (itin1->rest.compare(itin2->rest)==0) {
-                               itin1->coeff = ex_to<numeric>(itin1->coeff).
-                                              add_dyn(ex_to<numeric>(itin2->coeff));
-                               if (expair_needs_further_processing(itin1))
-                                       needs_further_processing = true;
-                               must_copy = true;
-                       } else {
-                               if (!ex_to<numeric>(itin1->coeff).is_zero()) {
-                                       if (must_copy)
-                                               *itout = *itin1;
-                                       ++itout;
-                               }
-                               itin1 = itin2;
+
+       epvector::iterator itin1 = seq.begin();
+       epvector::iterator itin2 = itin1+1;
+       epvector::iterator itout = itin1;
+       epvector::iterator last = seq.end();
+       // must_copy will be set to true the first time some combination is 
+       // possible from then on the sequence has changed and must be compacted
+       bool must_copy = false;
+       while (itin2!=last) {
+               if (itin1->rest.compare(itin2->rest)==0) {
+                       itin1->coeff = ex_to<numeric>(itin1->coeff).
+                                      add_dyn(ex_to<numeric>(itin2->coeff));
+                       if (expair_needs_further_processing(itin1))
+                               needs_further_processing = true;
+                       must_copy = true;
+               } else {
+                       if (!ex_to<numeric>(itin1->coeff).is_zero()) {
+                               if (must_copy)
+                                       *itout = *itin1;
+                               ++itout;
                        }
-                       ++itin2;
-               }
-               if (!ex_to<numeric>(itin1->coeff).is_zero()) {
-                       if (must_copy)
-                               *itout = *itin1;
-                       ++itout;
+                       itin1 = itin2;
                }
-               if (itout!=last)
-                       seq.erase(itout,last);
+               ++itin2;
        }
-       
+       if (!ex_to<numeric>(itin1->coeff).is_zero()) {
+               if (must_copy)
+                       *itout = *itin1;
+               ++itout;
+       }
+       if (itout!=last)
+               seq.erase(itout,last);
+
        if (needs_further_processing) {
                epvector v = seq;
                seq.clear();
@@ -1465,7 +1469,7 @@ bool expairseq::is_canonical() const
  *  if no members were changed. */
 epvector * expairseq::expandchildren(unsigned options) const
 {
-       epvector::const_iterator last = seq.end();
+       const epvector::const_iterator last = seq.end();
        epvector::const_iterator cit = seq.begin();
        while (cit!=last) {
                const ex &expanded_ex = cit->rest.expand(options);