X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fex.h;h=87105a12212d18150a1ee8b24b8a9cecfad6eb8d;hp=9f72ab55fd33f245d8e19fc62c005bbeaee7f842;hb=703c6cebb5d3d395437e73e6935f3691aed68e0a;hpb=308cc279067413f46f2ceda60431ba61089d8368 diff --git a/ginac/ex.h b/ginac/ex.h index 9f72ab55..87105a12 100644 --- a/ginac/ex.h +++ b/ginac/ex.h @@ -42,8 +42,6 @@ class lst; // are defined in utils.h and not visible from outside. extern const ex & _ex0(void); // single ex(numeric(0)) -// typedef vector exvector; - #define INLINE_EX_CONSTRUCTORS /** Lightweight wrapper for GiNaC's symbolic objects. Basically all it does is @@ -51,281 +49,300 @@ extern const ex & _ex0(void); // single ex(numeric(0)) * provide methods for manipulation of these objects. */ class ex { - friend class basic; + friend class basic; // member functions - // default constructor, destructor, copy constructor assignment operator and helpers + // default constructor, destructor, copy constructor assignment operator and helpers public: - ex() + ex() #ifdef INLINE_EX_CONSTRUCTORS - : bp(_ex0().bp) - { - GINAC_ASSERT(_ex0().bp!=0); - GINAC_ASSERT(_ex0().bp->flags & status_flags::dynallocated); - GINAC_ASSERT(bp!=0); - ++bp->refcount; + : bp(_ex0().bp) + { + GINAC_ASSERT(_ex0().bp!=0); + GINAC_ASSERT(_ex0().bp->flags & status_flags::dynallocated); + GINAC_ASSERT(bp!=0); + ++bp->refcount; #ifdef OBSCURE_CINT_HACK - update_last_created_or_assigned_bp(); + update_last_created_or_assigned_bp(); #endif // def OBSCURE_CINT_HACK - } + } #else ; #endif // def INLINE_EX_CONSTRUCTORS - ~ex() + ~ex() #ifdef INLINE_EX_CONSTRUCTORS - { - GINAC_ASSERT(bp!=0); - GINAC_ASSERT(bp->flags & status_flags::dynallocated); - if (--bp->refcount == 0) { - delete bp; - } - } + { + GINAC_ASSERT(bp!=0); + GINAC_ASSERT(bp->flags & status_flags::dynallocated); + if (--bp->refcount == 0) { + delete bp; + } + } #else ; #endif // def INLINE_EX_CONSTRUCTORS - - ex(const ex & other) + + ex(const ex & other) #ifdef INLINE_EX_CONSTRUCTORS - : bp(other.bp) - { - GINAC_ASSERT(bp!=0); - GINAC_ASSERT((bp->flags) & status_flags::dynallocated); - ++bp->refcount; + : bp(other.bp) + { + GINAC_ASSERT(bp!=0); + GINAC_ASSERT((bp->flags) & status_flags::dynallocated); + ++bp->refcount; #ifdef OBSCURE_CINT_HACK - update_last_created_or_assigned_bp(); + update_last_created_or_assigned_bp(); #endif // def OBSCURE_CINT_HACK - } + } #else ; #endif // def INLINE_EX_CONSTRUCTORS - - const ex & operator=(const ex & other) + + const ex & operator=(const ex & other) #ifdef INLINE_EX_CONSTRUCTORS - { - GINAC_ASSERT(bp!=0); - GINAC_ASSERT(bp->flags & status_flags::dynallocated); - GINAC_ASSERT(other.bp!=0); - GINAC_ASSERT(other.bp->flags & status_flags::dynallocated); - ++other.bp->refcount; - basic * tmpbp=other.bp; - if (--bp->refcount==0) { - delete bp; - } - bp=tmpbp; + { + GINAC_ASSERT(bp!=0); + GINAC_ASSERT(bp->flags & status_flags::dynallocated); + GINAC_ASSERT(other.bp!=0); + GINAC_ASSERT(other.bp->flags & status_flags::dynallocated); + ++other.bp->refcount; + basic * tmpbp=other.bp; + if (--bp->refcount==0) { + delete bp; + } + bp=tmpbp; #ifdef OBSCURE_CINT_HACK - update_last_created_or_assigned_bp(); + update_last_created_or_assigned_bp(); #endif // def OBSCURE_CINT_HACK - return *this; - } + return *this; + } #else ; #endif // def INLINE_EX_CONSTRUCTORS - // other constructors + + // other constructors public: - ex(const basic & other) + ex(const basic & other) #ifdef INLINE_EX_CONSTRUCTORS - { - construct_from_basic(other); + { + construct_from_basic(other); #ifdef OBSCURE_CINT_HACK - update_last_created_or_assigned_bp(); + update_last_created_or_assigned_bp(); #endif // def OBSCURE_CINT_HACK - } + } #else ; #endif // def INLINE_EX_CONSTRUCTORS - - ex(int i) + + ex(int i) #ifdef INLINE_EX_CONSTRUCTORS - { - construct_from_int(i); + { + construct_from_int(i); #ifdef OBSCURE_CINT_HACK - update_last_created_or_assigned_bp(); + update_last_created_or_assigned_bp(); #endif // def OBSCURE_CINT_HACK - } + } #else ; #endif // def INLINE_EX_CONSTRUCTORS - ex(unsigned int i) + ex(unsigned int i) #ifdef INLINE_EX_CONSTRUCTORS - { - construct_from_uint(i); + { + construct_from_uint(i); #ifdef OBSCURE_CINT_HACK - update_last_created_or_assigned_bp(); + update_last_created_or_assigned_bp(); #endif // def OBSCURE_CINT_HACK - } + } #else ; #endif // def INLINE_EX_CONSTRUCTORS - - ex(long i) + + ex(long i) #ifdef INLINE_EX_CONSTRUCTORS - { - construct_from_long(i); + { + construct_from_long(i); #ifdef OBSCURE_CINT_HACK - update_last_created_or_assigned_bp(); + update_last_created_or_assigned_bp(); #endif // def OBSCURE_CINT_HACK - } + } #else ; #endif // def INLINE_EX_CONSTRUCTORS - ex(unsigned long i) + ex(unsigned long i) +#ifdef INLINE_EX_CONSTRUCTORS + { + construct_from_ulong(i); +#ifdef OBSCURE_CINT_HACK + update_last_created_or_assigned_bp(); +#endif // def OBSCURE_CINT_HACK + } +#else +; +#endif // def INLINE_EX_CONSTRUCTORS + + ex(double const d) #ifdef INLINE_EX_CONSTRUCTORS - { - construct_from_ulong(i); + { + construct_from_double(d); #ifdef OBSCURE_CINT_HACK - update_last_created_or_assigned_bp(); + update_last_created_or_assigned_bp(); #endif // def OBSCURE_CINT_HACK - } + } #else ; #endif // def INLINE_EX_CONSTRUCTORS - - ex(double const d) + + /** Construct ex from string and a list of symbols. The input grammar is + * similar to the GiNaC output format. All symbols to be used in the + * expression must be specified in a lst in the second argument. Undefined + * symbols and other parser errors will throw an exception. */ + ex(const std::string &s, const ex &l) #ifdef INLINE_EX_CONSTRUCTORS - { - construct_from_double(d); + { + construct_from_string_and_lst(s, l); #ifdef OBSCURE_CINT_HACK - update_last_created_or_assigned_bp(); + update_last_created_or_assigned_bp(); #endif // def OBSCURE_CINT_HACK - } + } #else ; #endif // def INLINE_EX_CONSTRUCTORS - - // functions overriding virtual functions from bases classes - // none - - // new virtual functions which can be overridden by derived classes - // none + + // functions overriding virtual functions from bases classes + // none + + // new virtual functions which can be overridden by derived classes + // none - // non-virtual functions in this class + // non-virtual functions in this class public: - void swap(ex & other); - void printraw(ostream & os) const; - void printtree(ostream & os, unsigned indent=0) const; - void print(ostream & os, unsigned upper_precedence=0) const; - void printcsrc(ostream & os, unsigned type, const char *var_name) const; - void dbgprint(void) const; - void dbgprinttree(void) const; - bool info(unsigned inf) const; - unsigned nops() const; - ex expand(unsigned options=0) const; - bool has(const ex & other) const; - int degree(const symbol & s) const; - int ldegree(const symbol & s) const; - ex coeff(const symbol & s, int n=1) const; - ex lcoeff(const symbol & s) const { return coeff(s, degree(s)); } - ex tcoeff(const symbol & s) const { return coeff(s, ldegree(s)); } - ex numer(void) const; - ex denom(void) const; - ex unit(const symbol &x) const; - ex content(const symbol &x) const; - numeric integer_content(void) const; - ex primpart(const symbol &x) const; - ex primpart(const symbol &x, const ex &cont) const; - ex normal(int level = 0) const; - ex smod(const numeric &xi) const; - numeric max_coefficient(void) const; - ex collect(const symbol & s) const; - ex eval(int level = 0) const; - ex evalf(int level = 0) const; - ex diff(const symbol & s, unsigned nth = 1) const; - ex series(const symbol & s, const ex & point, int order = 6) const; - ex subs(const lst & ls, const lst & lr) const; - ex subs(const ex & e) const; - exvector get_indices(void) const; - ex simplify_ncmul(const exvector & v) const; - ex operator[](const ex & index) const; - ex operator[](int i) const; - ex op(int i) const; - ex & let_op(int i); - ex lhs(void) const; - ex rhs(void) const; - int compare(const ex & other) const + void swap(ex & other); + void printraw(std::ostream & os) const; + void printtree(std::ostream & os, unsigned indent=0) const; + void print(std::ostream & os, unsigned upper_precedence=0) const; + void printcsrc(std::ostream & os, unsigned type, const char *var_name) const; + void dbgprint(void) const; + void dbgprinttree(void) const; + bool info(unsigned inf) const; + unsigned nops() const; + ex expand(unsigned options=0) const; + bool has(const ex & other) const; + int degree(const symbol & s) const; + int ldegree(const symbol & s) const; + ex coeff(const symbol & s, int n=1) const; + ex lcoeff(const symbol & s) const { return coeff(s, degree(s)); } + ex tcoeff(const symbol & s) const { return coeff(s, ldegree(s)); } + ex numer(void) const; + ex denom(void) const; + ex unit(const symbol &x) const; + ex content(const symbol &x) const; + numeric integer_content(void) const; + ex primpart(const symbol &x) const; + ex primpart(const symbol &x, const ex &cont) const; + ex normal(int level = 0) const; + ex to_rational(lst &repl_lst) const; + ex smod(const numeric &xi) const; + numeric max_coefficient(void) const; + ex collect(const symbol & s) const; + ex eval(int level = 0) const; + ex evalf(int level = 0) const; + ex diff(const symbol & s, unsigned nth = 1) const; + ex series(const ex & r, int order, unsigned options = 0) const; + ex subs(const lst & ls, const lst & lr) const; + ex subs(const ex & e) const; + exvector get_indices(void) const; + ex simplify_ncmul(const exvector & v) const; + ex operator[](const ex & index) const; + ex operator[](int i) const; + ex op(int i) const; + ex & let_op(int i); + ex lhs(void) const; + ex rhs(void) const; + int compare(const ex & other) const #ifdef INLINE_EX_CONSTRUCTORS - { - GINAC_ASSERT(bp!=0); - GINAC_ASSERT(other.bp!=0); - if (bp==other.bp) { - // special case: both expression point to same basic, trivially equal - return 0; - } - return bp->compare(*other.bp); - } + { + GINAC_ASSERT(bp!=0); + GINAC_ASSERT(other.bp!=0); + if (bp==other.bp) { + // special case: both expression point to same basic, trivially equal + return 0; + } + return bp->compare(*other.bp); + } #else ; #endif // def INLINE_EX_CONSTRUCTORS - bool is_equal(const ex & other) const + bool is_equal(const ex & other) const #ifdef INLINE_EX_CONSTRUCTORS - { - GINAC_ASSERT(bp!=0); - GINAC_ASSERT(other.bp!=0); - if (bp==other.bp) { - // special case: both expression point to same basic, trivially equal - return true; - } - return bp->is_equal(*other.bp); - } + { + GINAC_ASSERT(bp!=0); + GINAC_ASSERT(other.bp!=0); + if (bp==other.bp) { + // special case: both expression point to same basic, trivially equal + return true; + } + return bp->is_equal(*other.bp); + } #else ; #endif // def INLINE_EX_CONSTRUCTORS - bool is_zero(void) const {return compare(_ex0())==0;}; - - unsigned return_type(void) const; - unsigned return_type_tinfo(void) const; - unsigned gethash(void) const; - - ex exadd(const ex & rh) const; - ex exmul(const ex & rh) const; - ex exncmul(const ex & rh) const; + bool is_zero(void) const {return compare(_ex0())==0;}; + + unsigned return_type(void) const; + unsigned return_type_tinfo(void) const; + unsigned gethash(void) const; + + ex exadd(const ex & rh) const; + ex exmul(const ex & rh) const; + ex exncmul(const ex & rh) const; private: - void construct_from_basic(const basic & other); - void construct_from_int(int i); - void construct_from_uint(unsigned int i); - void construct_from_long(long i); - void construct_from_ulong(unsigned long i); - void construct_from_double(double d); - void makewriteable(); + void construct_from_basic(const basic & other); + void construct_from_int(int i); + void construct_from_uint(unsigned int i); + void construct_from_long(long i); + void construct_from_ulong(unsigned long i); + void construct_from_double(double d); + void construct_from_string_and_lst(const std::string &s, const ex &l); + void makewriteable(); #ifdef OBSCURE_CINT_HACK public: - static bool last_created_or_assigned_bp_can_be_converted_to_ex(void) - { - if (last_created_or_assigned_bp==0) return false; - if ((last_created_or_assigned_bp->flags & - status_flags::dynallocated)==0) return false; - if ((last_created_or_assigned_bp->flags & - status_flags::evaluated)==0) return false; - return true; - } + static bool last_created_or_assigned_bp_can_be_converted_to_ex(void) + { + if (last_created_or_assigned_bp==0) return false; + if ((last_created_or_assigned_bp->flags & + status_flags::dynallocated)==0) return false; + if ((last_created_or_assigned_bp->flags & + status_flags::evaluated)==0) return false; + return true; + } protected: - void update_last_created_or_assigned_bp(void) - { - if (last_created_or_assigned_bp!=0) { - if (--last_created_or_assigned_bp->refcount == 0) { - delete last_created_or_assigned_bp; - } - } - last_created_or_assigned_bp=bp; - ++last_created_or_assigned_bp->refcount; - last_created_or_assigned_exp=(long)(void *)(this); - } + void update_last_created_or_assigned_bp(void) + { + if (last_created_or_assigned_bp!=0) { + if (--last_created_or_assigned_bp->refcount == 0) { + delete last_created_or_assigned_bp; + } + } + last_created_or_assigned_bp=bp; + ++last_created_or_assigned_bp->refcount; + last_created_or_assigned_exp=(long)(void *)(this); + } #endif // def OBSCURE_CINT_HACK // member variables public: - basic *bp; + basic *bp; #ifdef OBSCURE_CINT_HACK - static basic * last_created_or_assigned_bp; - static basic * dummy_bp; - static long last_created_or_assigned_exp; + static basic * last_created_or_assigned_bp; + static basic * dummy_bp; + static long last_created_or_assigned_exp; #endif // def OBSCURE_CINT_HACK }; @@ -363,6 +380,9 @@ inline ex denom(const ex & thisex) inline ex normal(const ex & thisex, int level=0) { return thisex.normal(level); } +inline ex to_rational(const ex & thisex, lst & repl_lst) +{ return thisex.to_rational(repl_lst); } + inline ex collect(const ex & thisex, const symbol & s) { return thisex.collect(s); } @@ -375,8 +395,8 @@ inline ex evalf(const ex & thisex, int level = 0) inline ex diff(const ex & thisex, const symbol & s, unsigned nth = 1) { return thisex.diff(s, nth); } -inline ex series(const ex & thisex, const symbol & s, const ex & point, int order = 6) -{ return thisex.series(s, point, order); } +inline ex series(const ex & thisex, const ex & r, int order, unsigned options = 0) +{ return thisex.series(r, order, options); } inline ex subs(const ex & thisex, const ex & e) { return thisex.subs(e); }