From 1776cd33da528c878ef1fb5530f8ac788e445ee5 Mon Sep 17 00:00:00 2001 From: Alexei Sheplyakov Date: Tue, 9 Sep 2008 11:14:57 +0400 Subject: [PATCH 1/1] symbol: get rid of assign/unassign (for performance and other reasons). * symbol::eval() is trivial now, so compiler can inline it in some cases. * symbol takes less memory. * no functionality is lost (as C++ has associative arrays). --- ginac/symbol.cpp | 55 ++++++------------------------------------------ ginac/symbol.h | 25 ++-------------------- 2 files changed, 8 insertions(+), 72 deletions(-) diff --git a/ginac/symbol.cpp b/ginac/symbol.cpp index f1b2be6e..cf31cb49 100644 --- a/ginac/symbol.cpp +++ b/ginac/symbol.cpp @@ -45,7 +45,7 @@ GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(symbol, basic, // symbol symbol::symbol() - : inherited(&symbol::tinfo_static), asexinfop(new assigned_ex_info), serial(next_serial++), name(autoname_prefix() + ToString(serial)), TeX_name(name), domain(domain::complex), ret_type(return_types::commutative), ret_type_tinfo(&symbol::tinfo_static) + : inherited(&symbol::tinfo_static), serial(next_serial++), name(autoname_prefix() + ToString(serial)), TeX_name(name), domain(domain::complex), ret_type(return_types::commutative), ret_type_tinfo(&symbol::tinfo_static) { setflag(status_flags::evaluated | status_flags::expanded); } @@ -73,25 +73,25 @@ possymbol::possymbol() // symbol symbol::symbol(const std::string & initname, unsigned domain) - : inherited(&symbol::tinfo_static), asexinfop(new assigned_ex_info), serial(next_serial++), name(initname), TeX_name(default_TeX_name()), domain(domain), ret_type(return_types::commutative), ret_type_tinfo(&symbol::tinfo_static) + : inherited(&symbol::tinfo_static), serial(next_serial++), name(initname), TeX_name(default_TeX_name()), domain(domain), ret_type(return_types::commutative), ret_type_tinfo(&symbol::tinfo_static) { setflag(status_flags::evaluated | status_flags::expanded); } symbol::symbol(const std::string & initname, unsigned rt, tinfo_t rtt, unsigned domain) - : inherited(&symbol::tinfo_static), asexinfop(new assigned_ex_info), serial(next_serial++), name(initname), TeX_name(default_TeX_name()), domain(domain), ret_type(rt), ret_type_tinfo(rtt) + : inherited(&symbol::tinfo_static), serial(next_serial++), name(initname), TeX_name(default_TeX_name()), domain(domain), ret_type(rt), ret_type_tinfo(rtt) { setflag(status_flags::evaluated | status_flags::expanded); } symbol::symbol(const std::string & initname, const std::string & texname, unsigned domain) - : inherited(&symbol::tinfo_static), asexinfop(new assigned_ex_info), serial(next_serial++), name(initname), TeX_name(texname), domain(domain), ret_type(return_types::commutative), ret_type_tinfo(&symbol::tinfo_static) + : inherited(&symbol::tinfo_static), serial(next_serial++), name(initname), TeX_name(texname), domain(domain), ret_type(return_types::commutative), ret_type_tinfo(&symbol::tinfo_static) { setflag(status_flags::evaluated | status_flags::expanded); } symbol::symbol(const std::string & initname, const std::string & texname, unsigned rt, tinfo_t rtt, unsigned domain) - : inherited(&symbol::tinfo_static), asexinfop(new assigned_ex_info), serial(next_serial++), name(initname), TeX_name(texname), domain(domain), ret_type(rt), ret_type_tinfo(rtt) + : inherited(&symbol::tinfo_static), serial(next_serial++), name(initname), TeX_name(texname), domain(domain), ret_type(rt), ret_type_tinfo(rtt) { setflag(status_flags::evaluated | status_flags::expanded); } @@ -130,7 +130,7 @@ possymbol::possymbol(const std::string & initname, const std::string & texname, /** Construct object from archive_node. */ symbol::symbol(const archive_node &n, lst &sym_lst) - : inherited(n, sym_lst), asexinfop(new assigned_ex_info), serial(next_serial++) + : inherited(n, sym_lst), serial(next_serial++) { if (!n.find_string("name", name)) name = autoname_prefix() + ToString(serial); @@ -228,22 +228,6 @@ bool symbol::info(unsigned inf) const return inherited::info(inf); } -ex symbol::eval(int level) const -{ - if (level == -max_recursion_level) - throw(std::runtime_error("max recursion level reached")); - - if (asexinfop->is_assigned) { - setflag(status_flags::evaluated); - if (level==1) - return (asexinfop->assigned_expression); - else - return (asexinfop->assigned_expression).eval(level); - } else { - return this->hold(); - } -} - ex symbol::conjugate() const { if (this->domain == domain::complex) { @@ -318,24 +302,6 @@ unsigned symbol::calchash() const // non-virtual functions in this class ////////// -// public - -void symbol::assign(const ex & value) -{ - asexinfop->is_assigned = true; - asexinfop->assigned_expression = value; - clearflag(status_flags::evaluated | status_flags::expanded); -} - -void symbol::unassign() -{ - if (asexinfop->is_assigned) { - asexinfop->is_assigned = false; - asexinfop->assigned_expression = _ex0; - } - setflag(status_flags::evaluated | status_flags::expanded); -} - // private /** Symbols not constructed with a string get one assigned using this @@ -376,13 +342,4 @@ std::string symbol::default_TeX_name() const unsigned symbol::next_serial = 0; -////////// -// subclass assigned_ex_info -////////// - -/** Default ctor. Defaults to unassigned. */ -symbol::assigned_ex_info::assigned_ex_info() throw() : is_assigned(false) -{ -} - } // namespace GiNaC diff --git a/ginac/symbol.h b/ginac/symbol.h index e38ed676..c174ad5f 100644 --- a/ginac/symbol.h +++ b/ginac/symbol.h @@ -31,11 +31,7 @@ namespace GiNaC { /** Basic CAS symbol. It has a name because it must know how to output itself. - * It may be assigned an expression, but this feature is only intended for - * programs like 'ginsh' that want to associate symbols with expressions. - * If you want to replace symbols by expressions in your code, you should - * use ex::subs() or use objects of class ex instead of class symbol in the - * first place. */ + */ class symbol : public basic { GINAC_DECLARE_REGISTERED_CLASS(symbol, basic) @@ -43,16 +39,6 @@ class symbol : public basic friend class realsymbol; friend class possymbol; -// types - - /** Symbols as keys to expressions - only for ginsh. */ - class assigned_ex_info : public refcounted { - public: - assigned_ex_info() throw(); ///< Default ctor - bool is_assigned; ///< True if there is an expression assigned - ex assigned_expression; ///< The actual expression - }; - // member functions // other constructors @@ -66,7 +52,7 @@ public: // functions overriding virtual functions from base classes public: bool info(unsigned inf) const; - ex eval(int level = 0) const; + ex eval(int level = 0) const { return *this; } // for performance reasons ex evalf(int level = 0) const { return *this; } // overwrites basic::evalf() for performance reasons ex series(const relational & s, int order, unsigned options = 0) const; ex subs(const exmap & m, unsigned options = 0) const { return subs_one_level(m, options); } // overwrites basic::subs() for performance reasons @@ -86,8 +72,6 @@ protected: // non-virtual functions in this class public: - void assign(const ex & value); - void unassign(); void set_name(const std::string & n) { name = n; } std::string get_name() const { return name; } unsigned get_domain() const { return domain; } @@ -103,7 +87,6 @@ private: // member variables protected: - ptr asexinfop; ///< assigned expression, only for private use by ginsh unsigned serial; ///< unique serial number for comparison std::string name; ///< printname of this symbol std::string TeX_name; ///< LaTeX name of this symbol @@ -161,10 +144,6 @@ template<> inline bool is_exactly_a(const basic & obj) return domain == domain::positive; } -// wrapper functions around member functions -inline void unassign(symbol & symarg) -{ symarg.unassign(); } - } // namespace GiNaC #endif // ndef __GINAC_SYMBOL_H__ -- 2.44.0