X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fbasic.h;h=9dc49bfdee4b8752cb2982dddfed23377d9bc59d;hp=b2dc0ade2b30c123d41ff52d0b537444b31596fa;hb=50ed15a65e858858999be45301b3f49821cb1e71;hpb=3ac17e18ada69428fe170c10abcc5f33a30f0676 diff --git a/ginac/basic.h b/ginac/basic.h index b2dc0ade..9dc49bfd 100644 --- a/ginac/basic.h +++ b/ginac/basic.h @@ -3,7 +3,7 @@ * Interface to GiNaC's ABC. */ /* - * GiNaC Copyright (C) 1999-2006 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2011 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 @@ -20,20 +20,22 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __GINAC_BASIC_H__ -#define __GINAC_BASIC_H__ - -#include // for size_t -#include -#include -// CINT needs to work properly with -#include +#ifndef GINAC_BASIC_H +#define GINAC_BASIC_H #include "flags.h" #include "ptr.h" #include "assertion.h" #include "registrar.h" +// CINT needs to work properly with +#include +#include // for size_t +#include +#include +#include // for typeid +#include + namespace GiNaC { class ex; @@ -45,6 +47,7 @@ class archive_node; class print_context; typedef std::vector exvector; +typedef std::set exset; typedef std::map exmap; // Define this to enable some statistical output for comparisons and hashing @@ -106,7 +109,7 @@ class basic : public refcounted // default constructor, destructor, copy constructor and assignment operator protected: - basic() : tinfo_key(&tinfo_static), flags(0) {} + basic() : flags(0) {} public: /** basic destructor, virtual because class ex will delete objects of @@ -119,10 +122,6 @@ public: const basic & operator=(const basic & other); protected: - /** Constructor with specified tinfo_key (used by derived classes instead - * of the default constructor to avoid assigning tinfo_key twice). */ - basic(tinfo_t ti) : tinfo_key(ti), flags(0) {} - // new virtual functions which can be overridden by derived classes public: // only const functions please (may break reference counting) @@ -160,8 +159,8 @@ public: virtual ex & operator[](size_t i); // pattern matching - virtual bool has(const ex & other) const; - virtual bool match(const ex & pattern, lst & repl_lst) const; + virtual bool has(const ex & other, unsigned options = 0) const; + virtual bool match(const ex & pattern, exmap & repls) const; protected: virtual bool match_same_type(const basic & other) const; public: @@ -180,6 +179,7 @@ public: } // degree/coeff + virtual bool is_polynomial(const ex & var) 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; @@ -212,10 +212,12 @@ public: // noncommutativity virtual unsigned return_type() const; - virtual const basic* return_type_tinfo() const; + virtual return_type_t return_type_tinfo() const; - // complex conjugation + // functions for complex expressions virtual ex conjugate() const; + virtual ex real_part() const; + virtual ex imag_part() const; // functions that should be called from class ex only protected: @@ -239,6 +241,23 @@ public: void print_dispatch(const registered_class_info & ri, const print_context & c, unsigned level) const; + /** Save (serialize) the object into archive node. + * + * Losely speaking, this method turns an expression into a byte + * stream (which can be saved and restored later on, or sent via + * network, etc.) + */ + virtual void archive(archive_node& n) const; + /** Load (deserialize) the object from an archive node. + * + * @note This method is essentially a constructor. However, + * constructors can't be virtual. So, if unarchiving routines + * are implemented as constructors one would need to define such + * a constructor in every class, even if all it does is simply + * calling constructor of a superclass. + */ + virtual void read_archive(const archive_node& n, lst& syms); // no const + ex subs_one_level(const exmap & m, unsigned options) const; ex diff(const symbol & s, unsigned nth = 1) const; int compare(const basic & other) const; @@ -260,8 +279,6 @@ public: } } - tinfo_t tinfo() const {return tinfo_key;} - /** Set some status_flags. */ const basic & setflag(unsigned f) const {flags |= f; return *this;} @@ -277,7 +294,6 @@ protected: // member variables protected: - tinfo_t tinfo_key; ///< type info mutable unsigned flags; ///< of type status_flags mutable unsigned hashvalue; ///< hash value }; @@ -301,9 +317,9 @@ inline bool is_a(const basic &obj) template inline bool is_exactly_a(const basic & obj) { - return obj.tinfo() == &T::tinfo_static; + return typeid(T) == typeid(obj); } } // namespace GiNaC -#endif // ndef __GINAC_BASIC_H__ +#endif // ndef GINAC_BASIC_H