X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fconstant.cpp;h=c115d902ef951365ffc2602c455655f072f2ede4;hp=cc02515389f8e046f846f5578fcc2e524d474def;hb=dbb36db8d02b2c25af6bbfff8135112637936e1f;hpb=b0265215a51a081d20fe68475e080716afc2d45a diff --git a/ginac/constant.cpp b/ginac/constant.cpp index cc025153..c115d902 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,12 +26,15 @@ #include "constant.h" #include "numeric.h" #include "ex.h" +#include "archive.h" #include "debugmsg.h" #ifndef NO_GINAC_NAMESPACE namespace GiNaC { #endif // ndef NO_GINAC_NAMESPACE +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 == 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 ////////// @@ -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,17 @@ ex constant::evalf(int level) const // protected -int constant::compare_same_type(basic const & other) const +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,7 +231,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);