symbol: get rid of assign/unassign (for performance and other reasons).
authorAlexei Sheplyakov <varg@theor.jinr.ru>
Tue, 9 Sep 2008 07:14:57 +0000 (11:14 +0400)
committerAlexei Sheplyakov <varg@theor.jinr.ru>
Tue, 9 Sep 2008 10:17:07 +0000 (14:17 +0400)
* 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
ginac/symbol.h

index f1b2be6e13885b3cc337c7cde26e9cb689894559..cf31cb490a4de81de5638f06f7ab2900487ae1a3 100644 (file)
@@ -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
index e38ed6763bbde01c7750099eaaf31ba9b8c09b2b..c174ad5f5136b10e83d8dc0dc1cf526b07b142d6 100644 (file)
 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<assigned_ex_info> 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<possymbol>(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__