X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fsymbol.h;h=d2bc6792b2ba91ab0739bd75da8d7d5ac0762b7f;hp=8b8e9a76cff9ac457f63cd25fbdadb64ea74edaa;hb=af0c47009ca7a15af966430bdf1a72fe05c1c6f9;hpb=a8507b8af1c08d9b27d98d57f95c7ca1a8671e27 diff --git a/ginac/symbol.h b/ginac/symbol.h index 8b8e9a76..d2bc6792 100644 --- a/ginac/symbol.h +++ b/ginac/symbol.h @@ -1,8 +1,9 @@ /** @file symbol.h * - * Interface to GiNaC's symbolic objects. - * - * GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany + * Interface to GiNaC's symbolic objects. */ + +/* + * GiNaC Copyright (C) 1999-2000 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 @@ -23,6 +24,12 @@ #define __GINAC_SYMBOL_H__ #include +#include "basic.h" +#include "ex.h" + +#ifndef NO_NAMESPACE_GINAC +namespace GiNaC { +#endif // ndef NO_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 @@ -32,7 +39,10 @@ * first place. */ class symbol : public basic { + GINAC_DECLARE_REGISTERED_CLASS(symbol, basic) + // types + /** Symbols as keys to expressions. */ class assigned_ex_info { public: @@ -48,45 +58,46 @@ class symbol : public basic public: symbol(); ~symbol(); - symbol(symbol const & other); + symbol(const symbol & other); protected: - void copy(symbol const & other); + void copy(const symbol & other); void destroy(bool call_parent); // other constructors public: - explicit symbol(string const & initname); + explicit symbol(const string & initname); // functions overriding virtual functions from base classes public: basic * duplicate() const; + void print(ostream & os, unsigned upper_precedence=0) const; void printraw(ostream & os) const; void printtree(ostream & os, unsigned indent) const; - void print(ostream & os, unsigned upper_precedence=0) const; void printcsrc(ostream & os, unsigned type, unsigned upper_precedence=0) const; bool info(unsigned inf) const; ex expand(unsigned options=0) const; - bool has(ex const & other) const; - int degree(symbol const & s) const; - int ldegree(symbol const & s) const; - ex coeff(symbol const & s, int const n = 1) const; + bool has(const ex & other) const; + int degree(const symbol & s) const; + int ldegree(const symbol & s) const; + ex coeff(const symbol & s, int n = 1) const; ex eval(int level = 0) const; - ex diff(symbol const & s) const; + ex series(const relational & s, int order) const; ex normal(lst &sym_lst, lst &repl_lst, int level=0) const; - ex subs(lst const & ls, lst const & lr) const; + ex to_rational(lst &repl_lst) const; + ex subs(const lst & ls, const lst & lr) const; protected: - int compare_same_type(basic const & other) const; - bool is_equal_same_type(basic const & other) const; + ex derivative(const symbol & s) const; + int compare_same_type(const basic & other) const; + bool is_equal_same_type(const basic & other) const; unsigned return_type(void) const; unsigned return_type_tinfo(void) const; unsigned calchash(void) const; // non-virtual functions in this class public: - void assign(ex const & value); + void assign(const ex & value); void unassign(void); - ex diff(symbol const & s, unsigned nth) const; - void setname(string const & n) {name=n;} + void setname(const string & n) {name=n;} string getname(void) const {return name;} private: string & autoname_prefix(void); @@ -104,20 +115,26 @@ private: // global constants extern const symbol some_symbol; -extern type_info const & typeid_symbol; - -// macros +extern const type_info & typeid_symbol; -#define ex_to_symbol(X) static_cast(*(X).bp) +// utility functions +inline const symbol &ex_to_symbol(const ex &e) +{ + return static_cast(*e.bp); +} // wrapper functions around member functions inline void unassign(symbol & symarg) { return symarg.unassign(); } -inline int degree(symbol const & a, symbol const & s) +inline int degree(const symbol & a, const symbol & s) { return a.degree(s); } -inline int ldegree(symbol const & a, symbol const & s) +inline int ldegree(const symbol & a, const symbol & s) { return a.ldegree(s); } +#ifndef NO_NAMESPACE_GINAC +} // namespace GiNaC +#endif // ndef NO_NAMESPACE_GINAC + #endif // ndef __GINAC_SYMBOL_H__