X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fsymbol.h;h=e38ed6763bbde01c7750099eaaf31ba9b8c09b2b;hp=e13341f021052aaf0875ed67d7535ba15656dc61;hb=6ff92476a4dcd32f9a0c6f59c95c74812ea86fef;hpb=3ac17e18ada69428fe170c10abcc5f33a30f0676 diff --git a/ginac/symbol.h b/ginac/symbol.h index e13341f0..e38ed676 100644 --- a/ginac/symbol.h +++ b/ginac/symbol.h @@ -3,7 +3,7 @@ * Interface to 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 @@ -41,6 +41,7 @@ class symbol : public basic GINAC_DECLARE_REGISTERED_CLASS(symbol, basic) friend class realsymbol; + friend class possymbol; // types @@ -57,9 +58,10 @@ class symbol : public basic // other constructors public: explicit symbol(const std::string & initname, unsigned domain = domain::complex); - symbol(const std::string & initname, unsigned rt, unsigned domain); symbol(const std::string & initname, const std::string & texname, unsigned domain = domain::complex); symbol(const std::string & initname, const std::string & texname, unsigned rt, unsigned domain); + symbol(const std::string & initname, unsigned rt, tinfo_t rtt, unsigned domain = domain::complex); + symbol(const std::string & initname, const std::string & texname, unsigned rt, tinfo_t rtt, unsigned domain = domain::complex); // functions overriding virtual functions from base classes public: @@ -72,7 +74,11 @@ public: ex to_rational(exmap & repl) const; ex to_polynomial(exmap & repl) const; unsigned return_type() const { return ret_type; } + tinfo_t return_type_tinfo() const { return ret_type_tinfo; } ex conjugate() const; + ex real_part() const; + ex imag_part() const; + bool is_polynomial(const ex & var) const; protected: ex derivative(const symbol & s) const; bool is_equal_same_type(const basic & other) const; @@ -103,6 +109,7 @@ protected: std::string TeX_name; ///< LaTeX name of this symbol unsigned domain; ///< domain of symbol, complex (default) or real unsigned ret_type; ///< value returned by return_type() + tinfo_t ret_type_tinfo; ///< value returned by return_type_tinfo() private: static unsigned next_serial; }; @@ -116,8 +123,21 @@ public: realsymbol(); explicit realsymbol(const std::string & initname, unsigned domain = domain::real); realsymbol(const std::string & initname, const std::string & texname, unsigned domain = domain::real); - realsymbol(const std::string & initname, unsigned rt, unsigned domain = domain::real); - realsymbol(const std::string & initname, const std::string & texname, unsigned rt, unsigned domain = domain::real); + realsymbol(const std::string & initname, unsigned rt, tinfo_t rtt, unsigned domain = domain::real); + realsymbol(const std::string & initname, const std::string & texname, unsigned rt, tinfo_t rtt, unsigned domain = domain::real); +}; + + +/** Specialization of symbol to real domain */ +class possymbol : public symbol +{ + // constructors +public: + possymbol(); + explicit possymbol(const std::string & initname, unsigned domain = domain::positive); + possymbol(const std::string & initname, const std::string & texname, unsigned domain = domain::positive); + possymbol(const std::string & initname, unsigned rt, tinfo_t rtt, unsigned domain = domain::positive); + possymbol(const std::string & initname, const std::string & texname, unsigned rt, tinfo_t rtt, unsigned domain = domain::positive); }; @@ -126,7 +146,19 @@ public: /** Specialization of is_exactly_a(obj) for realsymbol objects. */ template<> inline bool is_exactly_a(const basic & obj) { - return (obj.tinfo() == &symbol::tinfo_static) && (static_cast(obj).get_domain() == domain::real); + if (obj.tinfo() != &symbol::tinfo_static) + return false; + unsigned domain = static_cast(obj).get_domain(); + return domain==domain::real || domain==domain::positive; +} + +/** Specialization of is_exactly_a(obj) for possymbol objects. */ +template<> inline bool is_exactly_a(const basic & obj) +{ + if (obj.tinfo() != &symbol::tinfo_static) + return false; + unsigned domain = static_cast(obj).get_domain(); + return domain == domain::positive; } // wrapper functions around member functions