X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fbasic.cpp;h=0d9f989b9c8c6a22b2fa492c09dfb2033b067616;hp=1c8814d44f89bb8d50579551cbb3a01382916402;hb=2565309dd7c38635c191eacf2a4af9b23fc0d310;hpb=9eab44408b9213d8909b7a9e525f404ad06064dd diff --git a/ginac/basic.cpp b/ginac/basic.cpp index 1c8814d4..0d9f989b 100644 --- a/ginac/basic.cpp +++ b/ginac/basic.cpp @@ -3,7 +3,7 @@ * Implementation of GiNaC's ABC. */ /* - * 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 @@ -31,10 +31,15 @@ #include "symbol.h" #include "lst.h" #include "ncmul.h" +#include "archive.h" #include "utils.h" #include "debugmsg.h" +#ifndef NO_GINAC_NAMESPACE namespace GiNaC { +#endif // ndef NO_GINAC_NAMESPACE + +GINAC_IMPLEMENT_REGISTERED_CLASS(basic, void) ////////// // default constructor, destructor, copy constructor assignment operator and helpers @@ -45,27 +50,27 @@ namespace GiNaC { #ifndef INLINE_BASIC_CONSTRUCTORS basic::basic() : flags(0), refcount(0), tinfo_key(TINFO_BASIC) { - debugmsg("basic default constructor",LOGLEVEL_CONSTRUCT); + debugmsg("basic default constructor", LOGLEVEL_CONSTRUCT); // nothing to do } basic::~basic() { - debugmsg("basic destructor",LOGLEVEL_DESTRUCT); + debugmsg("basic destructor", LOGLEVEL_DESTRUCT); destroy(0); - ASSERT((!(flags & status_flags::dynallocated))||(refcount==0)); + GINAC_ASSERT((!(flags & status_flags::dynallocated))||(refcount==0)); } -basic::basic(basic const & other) : flags(0), refcount(0), tinfo_key(TINFO_BASIC) +basic::basic(const basic & other) : flags(0), refcount(0), tinfo_key(TINFO_BASIC) { - debugmsg("basic copy constructor",LOGLEVEL_CONSTRUCT); + debugmsg("basic copy constructor", LOGLEVEL_CONSTRUCT); copy(other); } #endif -basic const & basic::operator=(basic const & other) +const basic & basic::operator=(const basic & other) { - debugmsg("basic operator=",LOGLEVEL_ASSIGNMENT); + debugmsg("basic operator=", LOGLEVEL_ASSIGNMENT); if (this != &other) { destroy(1); copy(other); @@ -76,7 +81,7 @@ basic const & basic::operator=(basic const & other) // protected #if 0 -void basic::copy(basic const & other) +void basic::copy(const basic & other) { flags=other.flags & ~ status_flags::dynallocated; hashvalue=other.hashvalue; @@ -91,11 +96,40 @@ void basic::copy(basic const & other) #ifndef INLINE_BASIC_CONSTRUCTORS basic::basic(unsigned ti) : flags(0), refcount(0), tinfo_key(ti) { - debugmsg("basic constructor with tinfo_key",LOGLEVEL_CONSTRUCT); + debugmsg("basic constructor with tinfo_key", LOGLEVEL_CONSTRUCT); // nothing to do } #endif +////////// +// archiving +////////// + +/** Construct object from archive_node. */ +basic::basic(const archive_node &n, const lst &sym_lst) : flags(0), refcount(0) +{ + debugmsg("basic constructor from archive_node", LOGLEVEL_CONSTRUCT); + + // Reconstruct tinfo_key from class name + string class_name; + if (n.find_string("class", class_name)) + tinfo_key = find_tinfo_key(class_name); + else + throw (std::runtime_error("archive node contains no class name")); +} + +/** Unarchive the object. */ +ex basic::unarchive(const archive_node &n, const lst &sym_lst) +{ + return (new basic(n, sym_lst))->setflag(status_flags::dynallocated); +} + +/** Archive the object. */ +void basic::archive(archive_node &n) const +{ + n.add_string("class", class_name()); +} + ////////// // functions overriding virtual functions from bases classes ////////// @@ -108,6 +142,59 @@ basic::basic(unsigned ti) : flags(0), refcount(0), tinfo_key(ti) // public +/** Output to stream formatted to be useful as ginsh input. */ +void basic::print(ostream & os, unsigned upper_precedence) const +{ + debugmsg("basic print",LOGLEVEL_PRINT); + os << "[basic object]"; +} + +/** Output to stream in ugly raw format, so brave developers can have a look + * at the underlying structure. */ +void basic::printraw(ostream & os) const +{ + debugmsg("basic printraw",LOGLEVEL_PRINT); + os << "[basic object]"; +} + +/** Output to stream formatted in tree- (indented-) form, so developers can + * have a look at the underlying structure. */ +void basic::printtree(ostream & os, unsigned indent) const +{ + debugmsg("basic printtree",LOGLEVEL_PRINT); + os << string(indent,' ') << "type=" << typeid(*this).name() + << ", hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")" + << ", flags=" << flags + << ", nops=" << nops() << endl; + for (unsigned i=0; i(this))->let_op(i); } -ex & basic::let_op(int const i) +ex & basic::let_op(int i) { throw(std::out_of_range("op() out of range")); } -ex basic::operator[](ex const & index) const +ex basic::operator[](const ex & index) const { if (is_exactly_of_type(*index.bp,numeric)) { - return op(static_cast(*index.bp).to_int()); + return op(static_cast(*index.bp).to_int()); } throw(std::invalid_argument("non-numeric indices not supported by this type")); } -ex basic::operator[](int const i) const +ex basic::operator[](int i) const { return op(i); } -bool basic::has(ex const & other) const +bool basic::has(const ex & other) const { - ASSERT(other.bp!=0); + GINAC_ASSERT(other.bp!=0); if (is_equal(*other.bp)) return true; if (nops()>0) { - for (int i=0; i(this))->let_op(i).gethash(); + v ^= (const_cast(this))->op(i).gethash(); } v = v & 0x7FFFFFFFU; @@ -262,7 +349,7 @@ ex basic::expand(unsigned options) const // public -ex basic::subs(ex const & e) const +ex basic::subs(const ex & e) const { // accept 2 types of replacement expressions: // - symbol==ex @@ -277,7 +364,7 @@ ex basic::subs(ex const & e) const } lst ls; lst lr; - for (int i=0; i