X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?a=blobdiff_plain;f=ginac%2Fsymbol.cpp;h=6ef9ade5f9a037b7186323864723091d41954766;hb=def26469ff96228c66e877bb5594e7d9a24b638f;hp=10b38a8eb71f8750e4671a2742db328bf9d62da8;hpb=80ceed0c855ea06ff5acd9375ad2e0c5ca386373;p=ginac.git diff --git a/ginac/symbol.cpp b/ginac/symbol.cpp index 10b38a8e..6ef9ade5 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) + : serial(next_serial++), name(autoname_prefix() + ToString(serial)), TeX_name(name), domain(domain::complex), ret_type(return_types::commutative), ret_type_tinfo(make_return_type_t()) { setflag(status_flags::evaluated | status_flags::expanded); } @@ -57,6 +57,13 @@ realsymbol::realsymbol() domain = domain::real; } +// possymbol + +possymbol::possymbol() +{ + domain = domain::positive; +} + ////////// // other constructors ////////// @@ -65,26 +72,32 @@ realsymbol::realsymbol() // 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) +symbol::symbol(const std::string & initname, unsigned domain) : + serial(next_serial++), name(initname), TeX_name(default_TeX_name()), + domain(domain), ret_type(return_types::commutative), + ret_type_tinfo(make_return_type_t()) { 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) +symbol::symbol(const std::string & initname, unsigned rt, const return_type_t& rtt, unsigned domain) : + 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) +symbol::symbol(const std::string & initname, const std::string & texname, unsigned domain) : + serial(next_serial++), name(initname), TeX_name(texname), domain(domain), + ret_type(return_types::commutative), ret_type_tinfo(make_return_type_t()) { 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) +symbol::symbol(const std::string & initname, const std::string & texname, + unsigned rt, const return_type_t& rtt, unsigned domain) : + serial(next_serial++), name(initname), TeX_name(texname), + domain(domain), ret_type(rt), ret_type_tinfo(rtt) { setflag(status_flags::evaluated | status_flags::expanded); } @@ -97,10 +110,24 @@ realsymbol::realsymbol(const std::string & initname, unsigned domain) realsymbol::realsymbol(const std::string & initname, const std::string & texname, unsigned domain) : symbol(initname, texname, domain) { } -realsymbol::realsymbol(const std::string & initname, unsigned rt, tinfo_t rtt, unsigned domain) +realsymbol::realsymbol(const std::string & initname, unsigned rt, const return_type_t& rtt, unsigned domain) + : symbol(initname, rt, rtt, domain) { } + +realsymbol::realsymbol(const std::string & initname, const std::string & texname, unsigned rt, const return_type_t& rtt, unsigned domain) + : symbol(initname, texname, rt, rtt, domain) { } + +// possymbol + +possymbol::possymbol(const std::string & initname, unsigned domain) + : symbol(initname, domain) { } + +possymbol::possymbol(const std::string & initname, const std::string & texname, unsigned domain) + : symbol(initname, texname, domain) { } + +possymbol::possymbol(const std::string & initname, unsigned rt, const return_type_t& rtt, unsigned domain) : symbol(initname, rt, rtt, domain) { } -realsymbol::realsymbol(const std::string & initname, const std::string & texname, unsigned rt, tinfo_t rtt, unsigned domain) +possymbol::possymbol(const std::string & initname, const std::string & texname, unsigned rt, const return_type_t& rtt, unsigned domain) : symbol(initname, texname, rt, rtt, domain) { } ////////// @@ -109,7 +136,7 @@ realsymbol::realsymbol(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); @@ -186,46 +213,50 @@ 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; - 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 { if (this->domain == domain::complex) { - return GiNaC::conjugate_function(*this).hold(); + return conjugate_function(*this).hold(); } else { return *this; } } +ex symbol::real_part() const +{ + if (domain==domain::real || domain==domain::positive) + return *this; + return real_part_function(*this).hold(); +} + +ex symbol::imag_part() const +{ + if (domain==domain::real || domain==domain::positive) + return 0; + return imag_part_function(*this).hold(); +} + bool symbol::is_polynomial(const ex & var) const { return true; @@ -262,7 +293,8 @@ bool symbol::is_equal_same_type(const basic & other) const unsigned symbol::calchash() const { - hashvalue = golden_ratio_hash((p_int)tinfo() ^ serial); + const void* this_tinfo = (const void*)typeid(*this).name(); + hashvalue = golden_ratio_hash((p_int)this_tinfo ^ serial); setflag(status_flags::hash_calculated); return hashvalue; } @@ -277,32 +309,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. */ @@ -335,13 +349,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