X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fbasic.h;h=fc825226538a1ff5672ddac9cf991eea1932a850;hp=e4c4b09b53daa61e4a4e7f481a989a4185a75d08;hb=29b420743599f001b8bfc8b63fb6ac81aa3dfba7;hpb=0a5049a0354466a88862c67b1b9c9e27e36cc309 diff --git a/ginac/basic.h b/ginac/basic.h index e4c4b09b..fc825226 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-2006 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 @@ -17,7 +17,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __GINAC_BASIC_H__ @@ -30,7 +30,6 @@ #include #include "flags.h" -#include "tinfos.h" #include "ptr.h" #include "assertion.h" #include "registrar.h" @@ -48,9 +47,41 @@ class print_context; typedef std::vector exvector; typedef std::map exmap; +// Define this to enable some statistical output for comparisons and hashing +#undef GINAC_COMPARE_STATISTICS + +#ifdef GINAC_COMPARE_STATISTICS +class compare_statistics_t { +public: + compare_statistics_t() + : total_compares(0), nontrivial_compares(0), total_basic_compares(0), compare_same_hashvalue(0), compare_same_type(0), + total_is_equals(0), nontrivial_is_equals(0), total_basic_is_equals(0), is_equal_same_hashvalue(0), is_equal_same_type(0), + total_gethash(0), gethash_cached(0) {} + ~compare_statistics_t(); + + unsigned long total_compares; + unsigned long nontrivial_compares; + unsigned long total_basic_compares; + unsigned long compare_same_hashvalue; + unsigned long compare_same_type; + + unsigned long total_is_equals; + unsigned long nontrivial_is_equals; + unsigned long total_basic_is_equals; + unsigned long is_equal_same_hashvalue; + unsigned long is_equal_same_type; + + unsigned long total_gethash; + unsigned long gethash_cached; +}; + +extern compare_statistics_t compare_statistics; +#endif + /** Function object for map(). */ struct map_function { + virtual ~map_function() {} typedef const ex & argument_type; typedef ex result_type; virtual ex operator()(const ex & e) = 0; @@ -75,7 +106,7 @@ class basic : public refcounted // default constructor, destructor, copy constructor and assignment operator protected: - basic() : tinfo_key(TINFO_basic), flags(0) {} + basic() : tinfo_key(&tinfo_static), flags(0) {} public: /** basic destructor, virtual because class ex will delete objects of @@ -90,7 +121,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) {} + 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) @@ -104,6 +135,7 @@ public: // only const functions please (may break reference counting) virtual ex eval(int level = 0) const; virtual ex evalf(int level = 0) const; virtual ex evalm() const; + virtual ex eval_integ() const; protected: virtual ex eval_ncmul(const exvector & v) const; public: @@ -128,7 +160,7 @@ public: virtual ex & operator[](size_t i); // pattern matching - virtual bool has(const ex & other) const; + virtual bool has(const ex & other, unsigned options = 0) const; virtual bool match(const ex & pattern, lst & repl_lst) const; protected: virtual bool match_same_type(const basic & other) const; @@ -164,8 +196,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; @@ -180,9 +212,13 @@ public: // noncommutativity virtual unsigned return_type() const; - virtual unsigned return_type_tinfo() const; + virtual tinfo_t return_type_tinfo() const; + + // complex conjugation + virtual ex conjugate() const; -protected: // functions that should be called from class ex only + // 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; @@ -208,8 +244,23 @@ public: int compare(const basic & other) const; bool is_equal(const basic & other) const; const basic & hold() const; - unsigned gethash() const { if (flags & status_flags::hash_calculated) return hashvalue; else return calchash(); } - unsigned tinfo() const {return tinfo_key;} + + unsigned gethash() const + { +#ifdef GINAC_COMPARE_STATISTICS + compare_statistics.total_gethash++; +#endif + if (flags & status_flags::hash_calculated) { +#ifdef GINAC_COMPARE_STATISTICS + compare_statistics.gethash_cached++; +#endif + return hashvalue; + } else { + return calchash(); + } + } + + tinfo_t tinfo() const {return tinfo_key;} /** Set some status_flags. */ const basic & setflag(unsigned f) const {flags |= f; return *this;} @@ -226,7 +277,7 @@ protected: // member variables protected: - unsigned tinfo_key; ///< typeinfo + tinfo_t tinfo_key; ///< type info mutable unsigned flags; ///< of type status_flags mutable unsigned hashvalue; ///< hash value }; @@ -246,13 +297,11 @@ inline bool is_a(const basic &obj) return dynamic_cast(&obj) != 0; } -/** Check if obj is a T, not including base classes. This one is just an - * inefficient default. It should in all time-critical cases be overridden - * by template specializations that use the TINFO_* constants directly. */ +/** Check if obj is a T, not including base classes. */ template -inline bool is_exactly_a(const basic &obj) +inline bool is_exactly_a(const basic & obj) { - return obj.tinfo() == T::get_class_info_static().options.get_id(); + return obj.tinfo() == &T::tinfo_static; } } // namespace GiNaC