*
* Implementation of GiNaC's symbolic objects. */
+/*
+ * GiNaC Copyright (C) 1999 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
#include <string>
#include <stdexcept>
-#include "ginac.h"
+#include "symbol.h"
+#include "lst.h"
#include "utils.h"
+#include "idx.h"
+#include "debugmsg.h"
+
+#ifndef NO_GINAC_NAMESPACE
+namespace GiNaC {
+#endif // ndef NO_GINAC_NAMESPACE
//////////
// default constructor, destructor, copy constructor assignment operator and helpers
//////////
-symbol::symbol() : basic(TINFO_SYMBOL)
+symbol::symbol() : basic(TINFO_symbol)
{
debugmsg("symbol default constructor",LOGLEVEL_CONSTRUCT);
serial=next_serial++;
// public
-symbol::symbol(string const & initname) : basic(TINFO_SYMBOL)
+symbol::symbol(string const & initname) : basic(TINFO_symbol)
{
debugmsg("symbol constructor from string",LOGLEVEL_CONSTRUCT);
name=initname;
return new symbol(*this);
}
+void symbol::print(ostream & os, unsigned upper_precedence) const
+{
+ debugmsg("symbol print",LOGLEVEL_PRINT);
+ os << name;
+}
+
+void symbol::printraw(ostream & os) const
+{
+ debugmsg("symbol printraw",LOGLEVEL_PRINT);
+ os << "symbol(" << "name=" << name << ",serial=" << serial
+ << ",hash=" << hashvalue << ",flags=" << flags << ")";
+}
+
+void symbol::printtree(ostream & os, unsigned indent) const
+{
+ debugmsg("symbol printtree",LOGLEVEL_PRINT);
+ os << string(indent,' ') << name << " (symbol): "
+ << "serial=" << serial
+ << ", hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")"
+ << ", flags=" << flags << endl;
+}
+
+void symbol::printcsrc(ostream & os, unsigned type, unsigned upper_precedence) const
+{
+ debugmsg("symbol print csrc", LOGLEVEL_PRINT);
+ os << name;
+}
+
bool symbol::info(unsigned inf) const
{
if (inf==info_flags::symbol) return true;
- if (inf==info_flags::polynomial || inf==info_flags::integer_polynomial || inf==info_flags::rational_polynomial || inf==info_flags::rational_function) {
+ if (inf==info_flags::polynomial ||
+ inf==info_flags::integer_polynomial ||
+ inf==info_flags::cinteger_polynomial ||
+ inf==info_flags::rational_polynomial ||
+ inf==info_flags::crational_polynomial ||
+ inf==info_flags::rational_function) {
return true;
} else {
return basic::info(inf);
ex symbol::coeff(symbol const & s, int const n) const
{
if (compare_same_type(s)==0) {
- return n==1 ? exONE() : exZERO();
+ return n==1 ? _ex1() : _ex0();
} else {
- return n==0 ? *this : exZERO();
+ return n==0 ? *this : _ex0();
}
}
ex symbol::subs(lst const & ls, lst const & lr) const
{
- ASSERT(ls.nops()==lr.nops());
-#ifdef DOASSERT
+ GINAC_ASSERT(ls.nops()==lr.nops());
+#ifdef DO_GINAC_ASSERT
for (int i=0; i<ls.nops(); i++) {
- ASSERT(is_ex_exactly_of_type(ls.op(i),symbol)||
+ GINAC_ASSERT(is_ex_exactly_of_type(ls.op(i),symbol)||
is_ex_of_type(ls.op(i),idx));
}
-#endif // def DOASSERT
+#endif // def DO_GINAC_ASSERT
for (int i=0; i<ls.nops(); i++) {
if (is_ex_exactly_of_type(ls.op(i),symbol)) {
int symbol::compare_same_type(basic const & other) const
{
- ASSERT(is_of_type(other,symbol));
+ GINAC_ASSERT(is_of_type(other,symbol));
const symbol *o = static_cast<const symbol *>(&other);
if (serial==o->serial) return 0;
return serial < o->serial ? -1 : 1;
bool symbol::is_equal_same_type(basic const & other) const
{
- ASSERT(is_of_type(other,symbol));
+ GINAC_ASSERT(is_of_type(other,symbol));
const symbol *o = static_cast<const symbol *>(&other);
return serial==o->serial;
}
{
if (asexinfop->is_assigned) {
asexinfop->is_assigned=0;
- asexinfop->assigned_expression=exZERO();
+ asexinfop->assigned_expression=_ex0();
}
setflag(status_flags::evaluated);
}
symbol::assigned_ex_info::assigned_ex_info(void) : is_assigned(0), refcount(1)
{
}
+
+#ifndef NO_GINAC_NAMESPACE
+} // namespace GiNaC
+#endif // ndef NO_GINAC_NAMESPACE