X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fsymbol.cpp;h=6eedfef3b6142b0fd4e53107ced16ccac916d830;hp=bf58fd4bacf6bc2833d763af347ec8c9ca2cf839;hb=3324b2f0f035490940b1a9d7cf5dc210776f6d87;hpb=ece407276fc0f844b2cfcd51838e1cbe83a2d70c diff --git a/ginac/symbol.cpp b/ginac/symbol.cpp index bf58fd4b..6eedfef3 100644 --- a/ginac/symbol.cpp +++ b/ginac/symbol.cpp @@ -3,7 +3,7 @@ * Implementation of GiNaC's symbolic objects. */ /* - * GiNaC Copyright (C) 1999-2006 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2008 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 @@ -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), ret_type(return_types::commutative), ret_type_tinfo(&symbol::tinfo_static), domain(domain::complex) + : 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()), ret_type(return_types::commutative), ret_type_tinfo(&symbol::tinfo_static), domain(domain) + : 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()), ret_type(rt), ret_type_tinfo(rtt), domain(domain) + : 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), ret_type(return_types::commutative), ret_type_tinfo(&symbol::tinfo_static), domain(domain) + : 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), ret_type(rt), ret_type_tinfo(rtt), domain(domain) + : 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); @@ -207,37 +207,25 @@ void symbol::do_print_python_repr(const print_python_repr & c, unsigned level) c bool symbol::info(unsigned inf) const { - if (inf == info_flags::symbol) - return true; - if (inf == info_flags::polynomial || - inf == info_flags::integer_polynomial || - inf == info_flags::cinteger_polynomial || - inf == info_flags::rational_polynomial || - inf == info_flags::crational_polynomial || - inf == info_flags::rational_function) - return true; - if (inf == info_flags::real) - return domain==domain::real || domain==domain::positive; - if (inf == info_flags::nonnegative) - return domain == domain::positive; - else - 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(); + switch (inf) { + case info_flags::symbol: + case info_flags::polynomial: + case info_flags::integer_polynomial: + case info_flags::cinteger_polynomial: + case info_flags::rational_polynomial: + case info_flags::crational_polynomial: + case info_flags::rational_function: + case info_flags::expanded: + return true; + case info_flags::real: + return domain == domain::real || domain == domain::positive; + case info_flags::positive: + case info_flags::nonnegative: + return domain == domain::positive; + case info_flags::has_indices: + return false; } + return inherited::info(inf); } ex symbol::conjugate() const @@ -314,32 +302,14 @@ 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 * prefix and a number. */ -std::string & symbol::autoname_prefix() +std::string& symbol::autoname_prefix() { - static std::string *s = new std::string("symbol"); - return *s; + static std::string s("symbol"); + return s; } /** Return default TeX name for symbol. This recognizes some greek letters. */ @@ -372,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