X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fconstant.cpp;h=b8543092c0d993e4b8993ceda68e9a435afba7d5;hp=166b53e94a7b5861f2af87e3a49bed6f9350a143;hb=dc99ad9cf2df9460d5d7e1cf96ccdd5f4055b798;hpb=721cff7b2f8d555e085202f6f3f47801b92d0413 diff --git a/ginac/constant.cpp b/ginac/constant.cpp index 166b53e9..b8543092 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, evalffunctype 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, evalffunctype 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 == EulerGamma.name) + return EulerGamma; + 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 ////////// @@ -152,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); @@ -192,7 +239,7 @@ 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); @@ -202,6 +249,6 @@ const constant EulerGamma("EulerGamma", EulerGammaEvalf); * 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