X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fbasic.h;h=da634e08b158ae846b28c02732f540d040c4f4fd;hp=90e3faffe2cff79ce3d838d85493bc039a683f94;hb=0a2231e31d5d0eb780ebb7ffb8d0628c78b74248;hpb=ef66dd715490d714cbc32f3ba74bd7386835cb4e diff --git a/ginac/basic.h b/ginac/basic.h index 90e3faff..da634e08 100644 --- a/ginac/basic.h +++ b/ginac/basic.h @@ -3,7 +3,7 @@ * Interface to GiNaC's ABC. */ /* - * 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 @@ -31,6 +31,7 @@ #include "flags.h" #include "tinfos.h" +#include "ptr.h" #include "assertion.h" #include "registrar.h" @@ -43,7 +44,6 @@ class numeric; class relational; class archive_node; class print_context; -template class ptr; typedef std::vector exvector; typedef std::map exmap; @@ -66,25 +66,23 @@ protected: }; -/** This class is the ABC (abstract base class) of GiNaC's class hierarchy. - * It is responsible for the reference counting. */ -class basic +/** This class is the ABC (abstract base class) of GiNaC's class hierarchy. */ +class basic : public refcounted { GINAC_DECLARE_REGISTERED_CLASS_NO_CTORS(basic, void) friend class ex; - friend class ptr; // default constructor, destructor, copy constructor and assignment operator protected: - basic() : tinfo_key(TINFO_basic), flags(0), refcount(0) {} + basic() : tinfo_key(TINFO_basic), flags(0) {} public: /** basic destructor, virtual because class ex will delete objects of * derived classes via a basic*. */ virtual ~basic() { - GINAC_ASSERT((!(flags & status_flags::dynallocated))||(refcount==0)); + GINAC_ASSERT((!(flags & status_flags::dynallocated)) || (get_refcount() == 0)); } basic(const basic & other); const basic & operator=(const basic & other); @@ -92,7 +90,7 @@ public: protected: /** Constructor with specified tinfo_key (used by derived classes instead * of the default constructor to avoid assigning tinfo_key twice). */ - basic(unsigned ti) : tinfo_key(ti), flags(0), refcount(0) {} + basic(unsigned 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) @@ -166,8 +164,8 @@ public: // rational functions virtual ex normal(exmap & repl, exmap & rev_lookup, int level = 0) const; - virtual ex to_rational(lst &repl_lst) const; - virtual ex to_polynomial(lst &repl_lst) const; + virtual ex to_rational(exmap & repl) const; + virtual ex to_polynomial(exmap & repl) const; // polynomial algorithms virtual numeric integer_content() const; @@ -184,7 +182,11 @@ public: virtual unsigned return_type() const; virtual unsigned return_type_tinfo() const; -protected: // functions that should be called from class ex only + // complex conjugation + virtual ex conjugate() const; + + // functions that should be called from class ex only +protected: virtual int compare_same_type(const basic & other) const; virtual bool is_equal_same_type(const basic & other) const; @@ -192,6 +194,19 @@ protected: // functions that should be called from class ex only // non-virtual functions in this class public: + /** Like print(), but dispatch to the specified class. Can be used by + * implementations of print methods to dispatch to the method of the + * superclass. + * + * @see basic::print */ + template + void print_dispatch(const print_context & c, unsigned level) const + { + print_dispatch(T::get_class_info_static(), c, level); + } + + void print_dispatch(const registered_class_info & ri, const print_context & c, unsigned level) 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; @@ -208,14 +223,16 @@ public: protected: void ensure_if_modifiable() const; + + void do_print(const print_context & c, unsigned level) const; + void do_print_tree(const print_tree & c, unsigned level) const; + void do_print_python_repr(const print_python_repr & c, unsigned level) const; // member variables protected: unsigned tinfo_key; ///< typeinfo mutable unsigned flags; ///< of type status_flags mutable unsigned hashvalue; ///< hash value -private: - size_t refcount; ///< reference counter, managed by ptr }; @@ -239,7 +256,7 @@ inline bool is_a(const basic &obj) template inline bool is_exactly_a(const basic &obj) { - return obj.tinfo() == T::reg_info.options.get_id(); + return obj.tinfo() == T::get_class_info_static().options.get_id(); } } // namespace GiNaC