]> www.ginac.de Git - ginac.git/blobdiff - ginac/ex.cpp
implemented operator-> for the iterators
[ginac.git] / ginac / ex.cpp
index e53cbd332958194f9cda094e716db7788e02f5f8..40a7de2fefe1a51cdabd570bdec8ff33297e7fd4 100644 (file)
@@ -126,7 +126,7 @@ ex ex::subs(const lst & ls, const lst & lr, unsigned options) const
        // Convert the lists to a map
        exmap m;
        for (lst::const_iterator its = ls.begin(), itr = lr.begin(); its != ls.end(); ++its, ++itr) {
-               m[*its] = *itr;
+               m.insert(std::make_pair(*its, *itr));
 
                // Search for products and powers in the expressions to be substituted
                // (for an optimization in expairseq::subs())
@@ -148,7 +148,7 @@ ex ex::subs(const ex & e, unsigned options) const
        if (e.info(info_flags::relation_equal)) {
                exmap m;
                const ex & s = e.lhs();
-               m[s] = e.rhs();
+               m.insert(std::make_pair(s, e.rhs()));
                if (is_exactly_a<mul>(s) || is_exactly_a<power>(s))
                        options |= subs_options::pattern_is_product;
                return bp->subs(m, options);
@@ -163,7 +163,7 @@ ex ex::subs(const ex & e, unsigned options) const
                if (!r.info(info_flags::relation_equal))
                        throw(std::invalid_argument("basic::subs(ex): argument must be a list of equations"));
                const ex & s = r.lhs();
-               m[s] = r.rhs();
+               m.insert(std::make_pair(s, r.rhs()));
 
                // Search for products and powers in the expressions to be substituted
                // (for an optimization in expairseq::subs())
@@ -239,7 +239,20 @@ void ex::makewriteable()
 {
        GINAC_ASSERT(bp->flags & status_flags::dynallocated);
        bp.makewritable();
-       GINAC_ASSERT(bp->refcount == 1);
+       GINAC_ASSERT(bp->get_refcount() == 1);
+}
+
+/** Share equal objects between expressions.
+ *  @see ex::compare(const basic &) */
+void ex::share(const ex & other) const
+{
+       if ((bp->flags | other.bp->flags) & status_flags::not_shareable)
+               return;
+
+       if (bp->get_refcount() <= other.bp->get_refcount())
+               bp = other.bp;
+       else
+               other.bp = bp;
 }
 
 /** Helper function for the ex-from-basic constructor. This is where GiNaC's
@@ -274,7 +287,7 @@ ptr<basic> ex::construct_from_basic(const basic & other)
                // it means that eval() hit case b) above. The original object is
                // no longer needed (it evaluated into something different), so we
                // delete it (because nobody else will).
-               if ((other.refcount==0) && (other.flags & status_flags::dynallocated))
+               if ((other.get_refcount() == 0) && (other.flags & status_flags::dynallocated))
                        delete &other; // yes, you can apply delete to a const pointer
 
                // We can't return a basic& here because the tmpex is destroyed as
@@ -297,7 +310,7 @@ ptr<basic> ex::construct_from_basic(const basic & other)
                        // on the heap.
                        basic *bp = other.duplicate();
                        bp->setflag(status_flags::dynallocated);
-                       GINAC_ASSERT(bp->refcount == 0);
+                       GINAC_ASSERT(bp->get_refcount() == 0);
                        return bp;
                }
        }
@@ -359,7 +372,7 @@ basic & ex::construct_from_int(int i)
        default:
                basic *bp = new numeric(i);
                bp->setflag(status_flags::dynallocated);
-               GINAC_ASSERT(bp->refcount == 0);
+               GINAC_ASSERT(bp->get_refcount() == 0);
                return *bp;
        }
 }
@@ -396,7 +409,7 @@ basic & ex::construct_from_uint(unsigned int i)
        default:
                basic *bp = new numeric(i);
                bp->setflag(status_flags::dynallocated);
-               GINAC_ASSERT(bp->refcount == 0);
+               GINAC_ASSERT(bp->get_refcount() == 0);
                return *bp;
        }
 }
@@ -457,7 +470,7 @@ basic & ex::construct_from_long(long i)
        default:
                basic *bp = new numeric(i);
                bp->setflag(status_flags::dynallocated);
-               GINAC_ASSERT(bp->refcount == 0);
+               GINAC_ASSERT(bp->get_refcount() == 0);
                return *bp;
        }
 }
@@ -494,7 +507,7 @@ basic & ex::construct_from_ulong(unsigned long i)
        default:
                basic *bp = new numeric(i);
                bp->setflag(status_flags::dynallocated);
-               GINAC_ASSERT(bp->refcount == 0);
+               GINAC_ASSERT(bp->get_refcount() == 0);
                return *bp;
        }
 }
@@ -503,7 +516,7 @@ basic & ex::construct_from_double(double d)
 {
        basic *bp = new numeric(d);
        bp->setflag(status_flags::dynallocated);
-       GINAC_ASSERT(bp->refcount == 0);
+       GINAC_ASSERT(bp->get_refcount() == 0);
        return *bp;
 }