X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fbasic.h;h=9895902b5d85be488acf4c2a5a209254f81ca966;hp=05ee4f23ab2312cf447c00226b1fddc2f6ab69af;hb=a8030df4915df6a1ea0312cbffb79ace4795c865;hpb=e58227e1112f989f3b5417e497a61d53fc2971fa;ds=inline diff --git a/ginac/basic.h b/ginac/basic.h index 05ee4f23..9895902b 100644 --- a/ginac/basic.h +++ b/ginac/basic.h @@ -24,7 +24,6 @@ #define __GINAC_BASIC_H__ #include -#include #include // CINT needs to work properly with @@ -34,100 +33,73 @@ #include "tinfos.h" #include "assertion.h" #include "registrar.h" +/*#include "debugmsg.h"*/ -#ifndef NO_NAMESPACE_GINAC namespace GiNaC { -#endif // ndef NO_NAMESPACE_GINAC -class basic; class ex; class symbol; class lst; class numeric; class relational; class archive_node; +class print_context; // Cint doesn't like vector<..,default_alloc> but malloc_alloc is // unstandardized and not supported by newer GCCs. #if defined(__GNUC__) && ((__GNUC__ == 2) && (__GNUC_MINOR__ < 97)) -typedef std::vector exvector; + typedef std::vector exvector; #else -typedef std::vector exvector; + typedef std::vector exvector; #endif -#define INLINE_BASIC_CONSTRUCTORS - /** This class is the ABC (abstract base class) of GiNaC's class hierarchy. * It is responsible for the reference counting. */ class basic { - GINAC_DECLARE_REGISTERED_CLASS(basic, void) - + GINAC_DECLARE_REGISTERED_CLASS_NO_CTORS(basic, void) + friend class ex; - -// member functions - - // default constructor, destructor, copy constructor assignment operator and helpers + + // default ctor, dtor, copy ctor assignment operator and helpers public: - basic() -#ifdef INLINE_BASIC_CONSTRUCTORS - : tinfo_key(TINFO_basic), flags(0), refcount(0) + basic() : tinfo_key(TINFO_basic), flags(0), refcount(0) { + /* debugmsg("basic default ctor", LOGLEVEL_CONSTRUCT); */ } -#else -; -#endif // def INLINE_BASIC_CONSTRUCTORS - + /** basic dtor, virtual because class ex will delete objects via ptr. */ virtual ~basic() -#ifdef INLINE_BASIC_CONSTRUCTORS { - destroy(0); + /* debugmsg("basic dtor", LOGLEVEL_DESTRUCT); */ + destroy(false); GINAC_ASSERT((!(flags & status_flags::dynallocated))||(refcount==0)); } -#else -; -#endif // def INLINE_BASIC_CONSTRUCTORS - - basic(const basic & other) -#ifdef INLINE_BASIC_CONSTRUCTORS - { - copy(other); - } -#else -; -#endif // def INLINE_BASIC_CONSTRUCTORS - + basic(const basic & other); const basic & operator=(const basic & other); - protected: + /** For use by copy ctor and assignment operator. */ void copy(const basic & other) { flags = other.flags & ~status_flags::dynallocated; hashvalue = other.hashvalue; tinfo_key = other.tinfo_key; } - void destroy(bool call_parent) {} - - // other constructors - basic(unsigned ti) -#ifdef INLINE_BASIC_CONSTRUCTORS - : tinfo_key(ti), flags(0), refcount(0) + /** For use by dtor and assignment operator. */ + virtual void destroy(bool call_parent) { } + + // other ctors + /** ctor with specified tinfo_key */ + basic(unsigned ti) : tinfo_key(ti), flags(0), refcount(0) { + /* debugmsg("basic ctor with tinfo_key", LOGLEVEL_CONSTRUCT); */ } -#else -; -#endif // def INLINE_BASIC_CONSTRUCTORS - // functions overriding virtual functions from bases classes // none // new virtual functions which can be overridden by derived classes public: // only const functions please (may break reference counting) virtual basic * duplicate() const; - virtual void print(std::ostream & os,unsigned upper_precedence = 0) const; - virtual void printraw(std::ostream & os) const; - virtual void printtree(std::ostream & os, unsigned indent) const; - virtual void printcsrc(std::ostream & os, unsigned type, unsigned upper_precedence = 0) const; + virtual void print(const print_context & c, unsigned level = 0) const; virtual void dbgprint(void) const; virtual void dbgprinttree(void) const; virtual bool info(unsigned inf) const; @@ -137,10 +109,10 @@ public: // only const functions please (may break reference counting) virtual ex operator[](const ex & index) const; virtual ex operator[](int i) const; virtual bool has(const ex & other) const; - virtual int degree(const symbol & s) const; - virtual int ldegree(const symbol & s) const; - virtual ex coeff(const symbol & s, int n = 1) const; - virtual ex collect(const symbol & s) const; + virtual int degree(const ex & s) const; + virtual int ldegree(const ex & s) const; + virtual ex coeff(const ex & s, int n = 1) const; + virtual ex collect(const ex & s) const; virtual ex eval(int level = 0) const; virtual ex evalf(int level = 0) const; virtual ex series(const relational & r, int order, unsigned options = 0) const; @@ -150,8 +122,12 @@ public: // only const functions please (may break reference counting) virtual numeric integer_content(void) const; virtual ex smod(const numeric &xi) const; virtual numeric max_coefficient(void) const; - virtual exvector get_indices(void) const; + virtual exvector get_free_indices(void) const; virtual ex simplify_ncmul(const exvector & v) const; + virtual ex eval_indexed(const basic & i) const; + virtual ex add_indexed(const ex & self, const ex & other) const; + virtual ex scalar_mul_indexed(const ex & self, const numeric & other) const; + virtual bool contract_with(exvector::iterator self, exvector::iterator other, exvector & v) const; protected: // non-const functions should be called from class ex only virtual ex derivative(const symbol & s) const; virtual int compare_same_type(const basic & other) const; @@ -159,8 +135,8 @@ protected: // non-const functions should be called from class ex only virtual unsigned return_type(void) const; virtual unsigned return_type_tinfo(void) const; virtual unsigned calchash(void) const; - virtual ex expand(unsigned options=0) const; - + virtual ex expand(unsigned options = 0) const; + // non-virtual functions in this class public: ex subs(const ex & e) const; @@ -168,23 +144,30 @@ public: int compare(const basic & other) const; bool is_equal(const basic & other) const; const basic & hold(void) const; - unsigned gethash(void) const {if (flags & status_flags::hash_calculated) return hashvalue; else return calchash();} + unsigned gethash(void) const { if (flags & status_flags::hash_calculated) return hashvalue; else return calchash(); } unsigned tinfo(void) const {return tinfo_key;} + + /** Set some status_flags. */ const basic & setflag(unsigned f) const {flags |= f; return *this;} + + /** Clear some status_flags. */ const basic & clearflag(unsigned f) const {flags &= ~f; return *this;} + + /** Get relative precedence level (useful for implementing pretty-printed + * output). */ + unsigned get_precedence(void) const {return precedence;} + protected: void ensure_if_modifiable(void) const; - -// member variables + // member variables protected: - unsigned tinfo_key; - mutable unsigned flags; - mutable unsigned hashvalue; - static unsigned precedence; - static unsigned delta_indent; + unsigned tinfo_key; ///< typeinfo + mutable unsigned flags; ///< of type status_flags + mutable unsigned hashvalue; ///< hash value + static unsigned precedence; ///< precedence for printing parens private: - unsigned refcount; + unsigned refcount; ///< Number of reference counts }; // global variables @@ -193,38 +176,22 @@ extern int max_recursion_level; // convenience macros -#ifndef NO_NAMESPACE_GINAC - +/** Check if OBJ is a TYPE, including base classes. */ #define is_of_type(OBJ,TYPE) \ - (dynamic_cast(const_cast(&OBJ))!=0) + (dynamic_cast(&OBJ)!=0) +/** Check if OBJ is a TYPE, not including base classes. */ #define is_exactly_of_type(OBJ,TYPE) \ ((OBJ).tinfo()==GiNaC::TINFO_##TYPE) +/** Check if ex is a handle to a TYPE, including base classes. */ #define is_ex_of_type(OBJ,TYPE) \ - (dynamic_cast(const_cast((OBJ).bp))!=0) + (dynamic_cast((OBJ).bp)!=0) +/** Check if ex is a handle to a TYPE, not including base classes. */ #define is_ex_exactly_of_type(OBJ,TYPE) \ ((*(OBJ).bp).tinfo()==GiNaC::TINFO_##TYPE) -#else // ndef NO_NAMESPACE_GINAC - -#define is_of_type(OBJ,TYPE) \ - (dynamic_cast(const_cast(&OBJ))!=0) - -#define is_exactly_of_type(OBJ,TYPE) \ - ((OBJ).tinfo()==TINFO_##TYPE) - -#define is_ex_of_type(OBJ,TYPE) \ - (dynamic_cast(const_cast((OBJ).bp))!=0) - -#define is_ex_exactly_of_type(OBJ,TYPE) \ - ((*(OBJ).bp).tinfo()==TINFO_##TYPE) - -#endif // ndef NO_NAMESPACE_GINAC - -#ifndef NO_NAMESPACE_GINAC } // namespace GiNaC -#endif // ndef NO_NAMESPACE_GINAC #endif // ndef __GINAC_BASIC_H__