X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fsymbol.cpp;h=aa8ebc0fc28a00f254c5209418a1f67883852da1;hp=a1c15ed16cbc270879f7490eb60f44644bdf9e89;hb=9d92d4b442fc4c1a95685884be4ba0494cd02bbe;hpb=94e5076a9ad0d142ee4604e9b078a10083efd24c diff --git a/ginac/symbol.cpp b/ginac/symbol.cpp index a1c15ed1..aa8ebc0f 100644 --- a/ginac/symbol.cpp +++ b/ginac/symbol.cpp @@ -45,25 +45,18 @@ GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(symbol, basic, // symbol -symbol::symbol() - : serial(next_serial++), name(""), TeX_name(""), domain(domain::complex) +symbol::symbol() : serial(next_serial++), name(""), TeX_name("") { setflag(status_flags::evaluated | status_flags::expanded); } // realsymbol -realsymbol::realsymbol() -{ - domain = domain::real; -} +realsymbol::realsymbol() : symbol() { } // possymbol -possymbol::possymbol() -{ - domain = domain::positive; -} +possymbol::possymbol() : realsymbol() { } ////////// // other constructors @@ -73,66 +66,58 @@ possymbol::possymbol() // symbol -symbol::symbol(const std::string & initname, unsigned domain) : - serial(next_serial++), name(initname), TeX_name(""), - domain(domain) +symbol::symbol(const std::string & initname) : serial(next_serial++), + name(initname), TeX_name("") { setflag(status_flags::evaluated | status_flags::expanded); } -symbol::symbol(const std::string & initname, const std::string & texname, unsigned domain) : - serial(next_serial++), name(initname), TeX_name(texname), domain(domain) +symbol::symbol(const std::string & initname, const std::string & texname) : + serial(next_serial++), name(initname), TeX_name(texname) { setflag(status_flags::evaluated | status_flags::expanded); } // realsymbol -realsymbol::realsymbol(const std::string & initname, unsigned domain) - : symbol(initname, domain) { } +realsymbol::realsymbol(const std::string & initname) : symbol(initname) { } -realsymbol::realsymbol(const std::string & initname, const std::string & texname, unsigned domain) - : symbol(initname, texname, domain) { } +realsymbol::realsymbol(const std::string & initname, const std::string & texname) + : symbol(initname, texname) { } // possymbol -possymbol::possymbol(const std::string & initname, unsigned domain) - : symbol(initname, domain) { } +possymbol::possymbol(const std::string & initname) : realsymbol(initname) { } -possymbol::possymbol(const std::string & initname, const std::string & texname, unsigned domain) - : symbol(initname, texname, domain) { } +possymbol::possymbol(const std::string & initname, const std::string & texname) + : realsymbol(initname, texname) { } ////////// // archiving ////////// -/** Construct object from archive_node. */ -symbol::symbol(const archive_node &n, lst &sym_lst) - : inherited(n, sym_lst), serial(next_serial++) +/** Read object from archive_node. */ +void symbol::read_archive(const archive_node &n, lst &sym_lst) { - if (!n.find_string("name", name)) - name = std::string(""); - if (!n.find_string("TeXname", TeX_name)) - TeX_name = std::string(""); - if (!n.find_unsigned("domain", domain)) - domain = domain::complex; - setflag(status_flags::evaluated | status_flags::expanded); -} - -/** Unarchive the object. */ -ex symbol::unarchive(const archive_node &n, lst &sym_lst) -{ - ex s = (new symbol(n, sym_lst))->setflag(status_flags::dynallocated); + inherited::read_archive(n, sym_lst); + serial = next_serial++; + std::string tmp_name; + n.find_string("name", tmp_name); // If symbol is in sym_lst, return the existing symbol for (lst::const_iterator it = sym_lst.begin(); it != sym_lst.end(); ++it) { - if (is_a(*it) && (ex_to(*it).name == ex_to(s).name)) - return *it; + if (is_a(*it) && (ex_to(*it).name == tmp_name)) { + *this = ex_to(*it); + return; + } } + name = tmp_name; + if (!n.find_string("TeXname", TeX_name)) + TeX_name = std::string(""); + setflag(status_flags::evaluated | status_flags::expanded); - // Otherwise add new symbol to list and return it - sym_lst.append(s); - return s; + setflag(status_flags::dynallocated); + sym_lst.append(*this); } /** Archive the object. */ @@ -144,8 +129,6 @@ void symbol::archive(archive_node &n) const n.add_string("name", name); if (!TeX_name.empty()) n.add_string("TeX_name", TeX_name); - if (domain != domain::complex) - n.add_unsigned("domain", domain); } ////////// @@ -180,7 +163,7 @@ void symbol::do_print_tree(const print_tree & c, unsigned level) const c.s << std::string(level, ' ') << name << " (" << class_name() << ")" << " @" << this << ", serial=" << serial << std::hex << ", hash=0x" << hashvalue << ", flags=0x" << flags << std::dec - << ", domain=" << domain + << ", domain=" << get_domain() << std::endl; } @@ -209,10 +192,10 @@ bool symbol::info(unsigned inf) const case info_flags::expanded: return true; case info_flags::real: - return domain == domain::real || domain == domain::positive; + return get_domain() == domain::real || get_domain() == domain::positive; case info_flags::positive: case info_flags::nonnegative: - return domain == domain::positive; + return get_domain() == domain::positive; case info_flags::has_indices: return false; } @@ -221,24 +204,16 @@ bool symbol::info(unsigned inf) const ex symbol::conjugate() const { - if (this->domain == domain::complex) { - return conjugate_function(*this).hold(); - } else { - return *this; - } + return conjugate_function(*this).hold(); } 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(); } @@ -350,6 +325,10 @@ static const std::string& get_default_TeX_name(const std::string& name) return name; } +GINAC_BIND_UNARCHIVER(symbol); +GINAC_BIND_UNARCHIVER(realsymbol); +GINAC_BIND_UNARCHIVER(possymbol); + ////////// // static member variables //////////