X-Git-Url: https://ginac.de/ginac.git//ginac.git?a=blobdiff_plain;f=ginac%2Fex.h;h=95115a30fbbc6b35375329ca9c5989418d11808b;hb=d85cc82288993d3dce31a9c849458bd576259b15;hp=d3c801e2a1839fd9e8995deccdff45614ae76a1a;hpb=6190dc53dc063d142183dc5e117b031624911199;p=ginac.git diff --git a/ginac/ex.h b/ginac/ex.h index d3c801e2..95115a30 100644 --- a/ginac/ex.h +++ b/ginac/ex.h @@ -3,7 +3,7 @@ * Interface to GiNaC's light-weight expression handles. */ /* - * GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2004 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 @@ -132,6 +132,9 @@ public: ex lhs() const; ex rhs() const; + // complex conjugation + ex conjugate() const { return bp->conjugate(); } + // pattern matching bool has(const ex & pattern) const { return bp->has(pattern); } bool find(const ex & pattern, lst & found) const; @@ -170,8 +173,10 @@ public: // rational functions ex normal(int level = 0) const; - ex to_rational(lst &repl_lst) const; - ex to_polynomial(lst &repl_lst) const; + ex to_rational(exmap & repl) const; + ex to_rational(lst & repl_lst) const; + ex to_polynomial(exmap & repl) const; + ex to_polynomial(lst & repl_lst) const; ex numer() const; ex denom() const; ex numer_denom() const; @@ -187,8 +192,8 @@ public: // indexed objects exvector get_free_indices() const { return bp->get_free_indices(); } - ex simplify_indexed() const; - ex simplify_indexed(const scalar_products & sp) const; + ex simplify_indexed(unsigned options = 0) const; + ex simplify_indexed(const scalar_products & sp, unsigned options = 0) const; // comparison int compare(const ex & other) const; @@ -396,14 +401,12 @@ public: return e.op(i); } -#if 0 - // How do we make this work in the context of the "reference to - // temporary" problem? Return an auto_ptr? - pointer operator->() const + // This should return an ex*, but that would be a pointer to a + // temporary value + std::auto_ptr operator->() const { - return &(operator*()); + return std::auto_ptr(new ex(operator*())); } -#endif ex operator[](difference_type n) const { @@ -530,8 +533,8 @@ class const_preorder_iterator : public std::iterator() not implemented (see above) + std::auto_ptr operator->() const + { + return std::auto_ptr(new ex(operator*())); + } const_preorder_iterator &operator++() { @@ -561,7 +566,7 @@ public: bool operator==(const const_preorder_iterator &other) const throw() { - return s == other.s; + return s.top() == other.s.top(); } bool operator!=(const const_preorder_iterator &other) const throw() @@ -570,22 +575,21 @@ public: } private: - std::stack s; + std::stack > s; void increment() { - internal::_iter_rep & current = s.top(); - const ex & child = current.e.op(current.i); - size_t n = child.nops(); - if (n) - s.push(internal::_iter_rep(child, 0, n)); - else - ++current.i; - while (s.top().i == s.top().i_end && s.size() > 1) { s.pop(); ++s.top().i; } + + internal::_iter_rep & current = s.top(); + + if (current.i != current.i_end) { + const ex & child = current.e.op(current.i); + s.push(internal::_iter_rep(child, 0, child.nops())); + } } }; @@ -594,22 +598,27 @@ class const_postorder_iterator : public std::iterator() not implemented + std::auto_ptr operator->() const + { + return std::auto_ptr(new ex(operator*())); + } const_postorder_iterator &operator++() { @@ -635,12 +644,12 @@ public: } private: - std::stack s; + std::stack > s; void descend() { - while (s.top().i != s.top().i_end && s.top().e.op(s.top().i).nops() > 0) { - const internal::_iter_rep & current = s.top(); + while (s.top().i != s.top().i_end) { + internal::_iter_rep & current = s.top(); const ex & child = current.e.op(current.i); s.push(internal::_iter_rep(child, 0, child.nops())); } @@ -648,10 +657,12 @@ private: void increment() { - ++s.top().i; - descend(); - if (s.top().i == s.top().i_end && s.size() > 1) + if (s.top().i == s.top().i_end) s.pop(); + if (s.size() > 0) { + ++s.top().i; + descend(); + } } }; @@ -677,6 +688,23 @@ inline bool are_ex_trivially_equal(const ex &e1, const ex &e2) return e1.bp == e2.bp; } +/* Function objects for STL sort() etc. */ +struct ex_is_less : public std::binary_function { + bool operator() (const ex &lh, const ex &rh) const { return lh.compare(rh) < 0; } +}; + +struct ex_is_equal : public std::binary_function { + bool operator() (const ex &lh, const ex &rh) const { return lh.is_equal(rh); } +}; + +struct op0_is_equal : public std::binary_function { + bool operator() (const ex &lh, const ex &rh) const { return lh.op(0).is_equal(rh.op(0)); } +}; + +struct ex_swap : public std::binary_function { + void operator() (ex &lh, ex &rh) const { lh.swap(rh); } +}; + // wrapper functions around member functions inline size_t nops(const ex & thisex) { return thisex.nops(); } @@ -714,6 +742,12 @@ inline ex normal(const ex & thisex, int level=0) inline ex to_rational(const ex & thisex, lst & repl_lst) { return thisex.to_rational(repl_lst); } +inline ex to_rational(const ex & thisex, exmap & repl) +{ return thisex.to_rational(repl); } + +inline ex to_polynomial(const ex & thisex, exmap & repl) +{ return thisex.to_polynomial(repl); } + inline ex to_polynomial(const ex & thisex, lst & repl_lst) { return thisex.to_polynomial(repl_lst); } @@ -738,11 +772,11 @@ inline ex series(const ex & thisex, const ex & r, int order, unsigned options = inline bool match(const ex & thisex, const ex & pattern, lst & repl_lst) { return thisex.match(pattern, repl_lst); } -inline ex simplify_indexed(const ex & thisex) -{ return thisex.simplify_indexed(); } +inline ex simplify_indexed(const ex & thisex, unsigned options = 0) +{ return thisex.simplify_indexed(options); } -inline ex simplify_indexed(const ex & thisex, const scalar_products & sp) -{ return thisex.simplify_indexed(sp); } +inline ex simplify_indexed(const ex & thisex, const scalar_products & sp, unsigned options = 0) +{ return thisex.simplify_indexed(sp, options); } inline ex symmetrize(const ex & thisex) { return thisex.symmetrize(); } @@ -777,23 +811,6 @@ inline bool is_zero(const ex & thisex) inline void swap(ex & e1, ex & e2) { e1.swap(e2); } -/* Function objects for STL sort() etc. */ -struct ex_is_less : public std::binary_function { - bool operator() (const ex &lh, const ex &rh) const { return lh.compare(rh) < 0; } -}; - -struct ex_is_equal : public std::binary_function { - bool operator() (const ex &lh, const ex &rh) const { return lh.is_equal(rh); } -}; - -struct op0_is_equal : public std::binary_function { - bool operator() (const ex &lh, const ex &rh) const { return lh.op(0).is_equal(rh.op(0)); } -}; - -struct ex_swap : public std::binary_function { - void operator() (ex &lh, ex &rh) const { lh.swap(rh); } -}; - inline ex ex::subs(const exmap & m, unsigned options) const { return bp->subs(m, options);