X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fconstant.cpp;h=b1b9237a1a486b26345c489cb73bcb9bfd131e91;hp=cc02515389f8e046f846f5578fcc2e524d474def;hb=61434b009f39c40ea85ae7bb4ec14d8d203e2a85;hpb=b0265215a51a081d20fe68475e080716afc2d45a diff --git a/ginac/constant.cpp b/ginac/constant.cpp index cc025153..b1b9237a 100644 --- a/ginac/constant.cpp +++ b/ginac/constant.cpp @@ -3,7 +3,7 @@ * Implementation of GiNaC's constant types and some special constants. */ /* - * GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany + * 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 @@ -26,11 +26,14 @@ #include "constant.h" #include "numeric.h" #include "ex.h" +#include "archive.h" #include "debugmsg.h" -#ifndef NO_GINAC_NAMESPACE +#ifndef NO_NAMESPACE_GINAC namespace GiNaC { -#endif // ndef NO_GINAC_NAMESPACE +#endif // ndef NO_NAMESPACE_GINAC + +GINAC_IMPLEMENT_REGISTERED_CLASS(constant, basic) ////////// // default constructor, destructor, copy constructor assignment operator and helpers @@ -51,7 +54,7 @@ constant::~constant() destroy(0); } -constant::constant(constant const & other) +constant::constant(const constant & other) { debugmsg("constant copy constructor",LOGLEVEL_CONSTRUCT); copy(other); @@ -59,7 +62,7 @@ constant::constant(constant const & other) // protected -void constant::copy(constant const & other) +void constant::copy(const constant & other) { basic::copy(other); name=other.name; @@ -86,7 +89,7 @@ void constant::destroy(bool call_parent) // public -constant::constant(string const & initname, ex (*efun)()) : +constant::constant(const string & initname, evalffunctype efun) : basic(TINFO_constant), name(initname), ef(efun), // number(0), fct_assigned(true), serial(next_serial++) number(0), serial(next_serial++) @@ -94,13 +97,49 @@ constant::constant(string const & initname, ex (*efun)()) : debugmsg("constant constructor from string, function",LOGLEVEL_CONSTRUCT); } -constant::constant(string const & initname, numeric const & initnumber) : +constant::constant(const string & initname, const numeric & initnumber) : basic(TINFO_constant), name(initname), ef(0), number(new numeric(initnumber)), /* fct_assigned(false),*/ serial(next_serial++) { debugmsg("constant constructor from string, numeric",LOGLEVEL_CONSTRUCT); } +////////// +// archiving +////////// + +/** Construct object from archive_node. */ +constant::constant(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst) +{ + debugmsg("constant constructor from archive_node", LOGLEVEL_CONSTRUCT); +} + +/** Unarchive the object. */ +ex constant::unarchive(const archive_node &n, const lst &sym_lst) +{ + // Find constant by name (!! this is bad: 'twould be better if there + // was a list of all global constants that we could search) + string s; + if (n.find_string("name", s)) { + if (s == Pi.name) + return Pi; + else if (s == Catalan.name) + return Catalan; + else if (s == gamma.name) + return gamma; + else + throw (std::runtime_error("unknown constant '" + s + "' in archive")); + } else + throw (std::runtime_error("unnamed constant in archive")); +} + +/** Archive the object. */ +void constant::archive(archive_node &n) const +{ + inherited::archive(n); + n.add_string("name", name); +} + ////////// // functions overriding virtual functions from bases classes ////////// @@ -113,6 +152,33 @@ basic * constant::duplicate() const return new constant(*this); } +void constant::print(ostream & os, unsigned upper_precedence) const +{ + debugmsg("constant print",LOGLEVEL_PRINT); + os << name; +} + +void constant::printraw(ostream & os) const +{ + debugmsg("constant printraw",LOGLEVEL_PRINT); + os << "constant(" << name << ")"; +} + +void constant::printtree(ostream & os, unsigned indent) const +{ + debugmsg("constant printtree",LOGLEVEL_PRINT); + os << string(indent,' ') << name + << ", type=" << typeid(*this).name() + << ", hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")" + << ", flags=" << flags << endl; +} + +void constant::printcsrc(ostream & os, unsigned type, unsigned upper_precedence) const +{ + debugmsg("constant print csrc",LOGLEVEL_PRINT); + os << name; +} + ex constant::evalf(int level) const { if (ef!=0) { @@ -125,17 +191,25 @@ ex constant::evalf(int level) const // protected -int constant::compare_same_type(basic const & other) const +/** Implementation of ex::diff() for a constant. It always returns 0. + * + * @see ex::diff */ +ex constant::derivative(const symbol & s) const +{ + return _ex0(); +} + +int constant::compare_same_type(const basic & other) const { GINAC_ASSERT(is_exactly_of_type(other, constant)); - // constant const & o=static_cast(const_cast(other)); + // const constant & o=static_cast(const_cast(other)); // return name.compare(o.name); const constant *o = static_cast(&other); if (serial==o->serial) return 0; return serial < o->serial ? -1 : 1; } -bool constant::is_equal_same_type(basic const & other) const +bool constant::is_equal_same_type(const basic & other) const { GINAC_ASSERT(is_exactly_of_type(other, constant)); const constant *o = static_cast(&other); @@ -165,16 +239,16 @@ unsigned constant::next_serial=0; ////////// const constant some_constant; -type_info const & typeid_constant=typeid(some_constant); +const type_info & typeid_constant=typeid(some_constant); /** Pi. (3.14159...) Diverts straight into CLN for evalf(). */ const constant Pi("Pi", PiEvalf); /** Catalan's constant. (0.91597...) Diverts straight into CLN for evalf(). */ -const constant EulerGamma("EulerGamma", EulerGammaEvalf); +const constant gamma("gamma", gammaEvalf); /** Euler's constant. (0.57721...) Sometimes called Euler-Mascheroni constant. * Diverts straight into CLN for evalf(). */ const constant Catalan("Catalan", CatalanEvalf); -#ifndef NO_GINAC_NAMESPACE +#ifndef NO_NAMESPACE_GINAC } // namespace GiNaC -#endif // ndef NO_GINAC_NAMESPACE +#endif // ndef NO_NAMESPACE_GINAC