]> www.ginac.de Git - ginac.git/blobdiff - ginac/ex.cpp
added example for namespace bracing
[ginac.git] / ginac / ex.cpp
index 1af7f214efa49d76340d78fe8ae0ac679e179f09..778531129a95e1ad236e3bd85de712245dd1ea70 100644 (file)
@@ -146,34 +146,43 @@ ex ex::subs(const lst & ls, const lst & lr, unsigned options) const
 ex ex::subs(const ex & e, unsigned options) const
 {
        if (e.info(info_flags::relation_equal)) {
+
+               // Argument is a relation: convert it to a map
                exmap m;
-               const ex & s = e.lhs();
-               m.insert(std::make_pair(s, e.rhs()));
+               const ex & s = e.op(0);
+               m.insert(std::make_pair(s, e.op(1)));
+
                if (is_exactly_a<mul>(s) || is_exactly_a<power>(s))
                        options |= subs_options::pattern_is_product;
+               else
+                       options |= subs_options::pattern_is_not_product;
+
                return bp->subs(m, options);
-       } else if (!e.info(info_flags::list))
-               throw(std::invalid_argument("basic::subs(ex): argument must be a list"));
 
-       // Convert the list to a map
-       exmap m;
-       GINAC_ASSERT(is_a<lst>(e));
-       for (lst::const_iterator it = ex_to<lst>(e).begin(); it != ex_to<lst>(e).end(); ++it) {
-               ex r = *it;
-               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.insert(std::make_pair(s, r.rhs()));
+       } else if (e.info(info_flags::list)) {
 
-               // Search for products and powers in the expressions to be substituted
-               // (for an optimization in expairseq::subs())
-               if (is_exactly_a<mul>(s) || is_exactly_a<power>(s))
-                       options |= subs_options::pattern_is_product;
-       }
-       if (!(options & subs_options::pattern_is_product))
-               options |= subs_options::pattern_is_not_product;
+               // Argument is a list: convert it to a map
+               exmap m;
+               GINAC_ASSERT(is_a<lst>(e));
+               for (lst::const_iterator it = ex_to<lst>(e).begin(); it != ex_to<lst>(e).end(); ++it) {
+                       ex r = *it;
+                       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.op(0);
+                       m.insert(std::make_pair(s, r.op(1)));
+
+                       // Search for products and powers in the expressions to be substituted
+                       // (for an optimization in expairseq::subs())
+                       if (is_exactly_a<mul>(s) || is_exactly_a<power>(s))
+                               options |= subs_options::pattern_is_product;
+               }
+               if (!(options & subs_options::pattern_is_product))
+                       options |= subs_options::pattern_is_not_product;
 
-       return bp->subs(m, options);
+               return bp->subs(m, options);
+
+       } else
+               throw(std::invalid_argument("ex::subs(ex): argument must be a relation_equal or a list"));
 }
 
 /** Traverse expression tree with given visitor, preorder traversal. */
@@ -239,17 +248,17 @@ 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 &) */
+ *  @see ex::compare(const ex &) */
 void ex::share(const ex & other) const
 {
-       if ((bp->flags & status_flags::not_shareable) || (other.bp->flags & status_flags::not_shareable))
+       if ((bp->flags | other.bp->flags) & status_flags::not_shareable)
                return;
 
-       if (bp->refcount <= other.bp->refcount)
+       if (bp->get_refcount() <= other.bp->get_refcount())
                bp = other.bp;
        else
                other.bp = bp;
@@ -287,7 +296,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
@@ -310,7 +319,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;
                }
        }
@@ -372,7 +381,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;
        }
 }
@@ -409,7 +418,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;
        }
 }
@@ -470,7 +479,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;
        }
 }
@@ -507,7 +516,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;
        }
 }
@@ -516,7 +525,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;
 }