X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fbasic.h;h=51e0e909336f5a6d0791e6b6aae595194fcf1eb0;hp=348523791a19afa50abd1c84006c49fe003758c8;hb=3627c2c0f2fe8fe04816703c5fc6dad9c96fb0a6;hpb=7d870583a6bf21a2ffb7b6f051b702064623892e diff --git a/ginac/basic.h b/ginac/basic.h index 34852379..51e0e909 100644 --- a/ginac/basic.h +++ b/ginac/basic.h @@ -27,6 +27,7 @@ #include #include #include +#include // for typeid // CINT needs to work properly with #include @@ -108,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 @@ -121,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) @@ -163,7 +160,7 @@ public: // pattern matching virtual bool has(const ex & other, unsigned options = 0) const; - virtual bool match(const ex & pattern, lst & repl_lst) const; + virtual bool match(const ex & pattern, exmap & repls) const; protected: virtual bool match_same_type(const basic & other) const; public: @@ -215,7 +212,7 @@ public: // noncommutativity virtual unsigned return_type() const; - virtual tinfo_t return_type_tinfo() const; + virtual return_type_t return_type_tinfo() const; // functions for complex expressions virtual ex conjugate() const; @@ -244,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; @@ -265,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;} @@ -282,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 }; @@ -306,7 +317,7 @@ 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