X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fprint.cpp;h=263aa5137211cf0ea0790cb62457b78a03b4af61;hp=e17292a6d9757350c5202e1e507e4a158391b8b8;hb=c8feefe95a6c219195aea22050f17e2294656f32;hpb=b075df9ab3eb2ebf0b5108caaeedd66526d95e58 diff --git a/ginac/print.cpp b/ginac/print.cpp index e17292a6..263aa513 100644 --- a/ginac/print.cpp +++ b/ginac/print.cpp @@ -1,287 +1,96 @@ /** @file print.cpp * - * The methods .print() are responsible for the nice default-output of - * objects. All related helper-functions go in here as well. */ - -#include - -#include "ginac.h" - -void ex::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("ex print",LOGLEVEL_PRINT); - ASSERT(bp!=0); - bp->print(os,upper_precedence); -} - -void ex::dbgprint(void) const -{ - debugmsg("ex dbgprint",LOGLEVEL_PRINT); - ASSERT(bp!=0); - bp->dbgprint(); -} - -void basic::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("basic print",LOGLEVEL_PRINT); - os << "[basic object]"; -} - -void basic::dbgprint(void) const -{ - print(cerr); - cerr << endl; -} - -void symbol::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("symbol print",LOGLEVEL_PRINT); - os << name; -} - -void constant::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("constant print",LOGLEVEL_PRINT); - os << name; -} - -void power::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("power print",LOGLEVEL_PRINT); -#if 1 - if (precedence<=upper_precedence) os << "("; - basis.print(os,precedence); - os << "^"; - exponent.print(os,precedence); - if (precedence<=upper_precedence) os << ")"; -#else - os << "pow(" << basis << "," << exponent << ")"; -#endif -} - -void fail::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("fail print",LOGLEVEL_PRINT); - os << "FAIL"; -} - -void expairseq::printpair(ostream & os, expair const & p, unsigned upper_precedence) const -{ - os << "[["; - p.rest.bp->print(os,precedence); - os << ","; - p.coeff.bp->print(os,precedence); - os << "]]"; -} + * Implementation of helper classes for expression output. */ /* -void expairseq::printseq(ostream & os, char delim, unsigned this_precedence, - unsigned upper_precedence) const -{ - if (this_precedence<=upper_precedence) os << "("; - epvector::const_iterator itt,it,it_last,it_start; - it_last=seq.end(); - --it_last; - it_start=seq.begin(); - - switch (delim) { - case '+': - for (it=seq.begin(); it!=it_last; ++it) { - itt = it +1; - expair const & k = *itt; - printpair(os,*it, this_precedence); - if (((is_ex_of_type(k.rest, numeric)) && (k.coeff*k.rest > 0) ) || ((!is_ex_of_type(k.rest, numeric)) && (k.coeff >0))){ - os << "+"; - } - } - printpair(os,*it,this_precedence); - break; - - case '*': - for (it = it_last ; it!=it_start; --it) { - if ((*it).rest.is_equal(exMINUSONE()) && - (*it).coeff.is_equal(exONE())) { - os << "-"; - } else { - printpair(os, *it,this_precedence); - os << delim; - } - } - printpair(os,*it,this_precedence); - break; - default: - clog << "Nobody expects the Spanish Inquisition: " - << "deliminator unknown!" << endl; - } - if (this_precedence<=upper_precedence) os << ")"; -} -*/ - -void expairseq::printseq(ostream & os, char delim, unsigned this_precedence, - unsigned upper_precedence) const -{ - if (this_precedence<=upper_precedence) os << "("; - epvector::const_iterator it,it_last; - it_last=seq.end(); - --it_last; - for (it=seq.begin(); it!=it_last; ++it) { - printpair(os,*it,this_precedence); - os << delim; - } - printpair(os,*it,this_precedence); - if (!overall_coeff.is_equal(default_overall_coeff())) { - os << delim << overall_coeff; - } - if (this_precedence<=upper_precedence) os << ")"; -} - -void expairseq::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("expairseq print",LOGLEVEL_PRINT); - os << "[["; - printseq(os,',',precedence,upper_precedence); - os << "]]"; -} - -void add::printpair(ostream & os, expair const & p, unsigned upper_precedence) const -{ - os << "("; - if (p.coeff == -1) { - os << "-"; - } else { - if (p.coeff != 1) { - os << p.coeff; - os << "*"; - } - } - os << p.rest; - os << ")"; -} - -void add::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("add print",LOGLEVEL_PRINT); - if (precedence<=upper_precedence) os << "("; - bool first=true; - for (epvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) { - if (!first) { - if (cit->coeff > 0) os << '+'; - } else { - first=false; - } - if (cit->coeff == -1) { - os << "-"; - } else { - if (cit->coeff != 1) { - (cit->coeff).print(os,precedence); - os << "*"; - } - } - os << cit->rest; - } - if (!overall_coeff.is_zero()) { - if (overall_coeff > 0) os << '+'; - os << overall_coeff; - } - if (precedence<=upper_precedence) os << ")"; -} - -void mul::printpair(ostream & os, expair const & p, unsigned upper_precedence) const -{ - os << "("; - if (p.coeff.compare(exONE())==0) { - p.rest.print(os,upper_precedence); - } else { - // outer parens around ex needed for broken gcc-2.95 parser: - (ex(power(p.rest,p.coeff))).print(os,upper_precedence); - } - os << ")"; -} - -void mul::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("mul print",LOGLEVEL_PRINT); - if (precedence<=upper_precedence) os << "("; - bool first=true; - if (!overall_coeff.is_equal(exONE())) { - overall_coeff.print(os,precedence); - first=false; - } - for (epvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) { - if (!first) { - os << '*'; - } else { - first=false; - } - recombine_pair_to_ex(*cit).print(os,precedence); - } - if (precedence<=upper_precedence) os << ")"; -} - -void ncmul::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("ncmul print",LOGLEVEL_PRINT); - printseq(os,'(','%',')',precedence,upper_precedence); -} - -/*void function::print(ostream & os, unsigned upper_precedence) const - *{ - * debugmsg("function print",LOGLEVEL_PRINT); - * os << name; - * printseq(os,'(',',',')',exprseq::precedence,function::precedence); - *}*/ - -void series::print(ostream &os, unsigned upper_precedence) const -{ - debugmsg("symbol print", LOGLEVEL_PRINT); - convert_to_poly().print(os, upper_precedence); -} + * GiNaC Copyright (C) 1999-2003 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 + */ -void relational::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("relational print",LOGLEVEL_PRINT); - if (precedence<=upper_precedence) os << "("; - lh.print(os,precedence); - switch (o) { - case equal: - os << "=="; - break; - case not_equal: - os << "!="; - break; - case less: - os << "<"; - break; - case less_or_equal: - os << "<="; - break; - case greater: - os << ">"; - break; - case greater_or_equal: - os << ">="; - break; - default: - os << "(INVALID RELATIONAL OPERATOR)"; - } - rh.print(os,precedence); - if (precedence<=upper_precedence) os << ")"; -} +#include -void matrix::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("matrix print",LOGLEVEL_PRINT); - os << "[[ "; - for (int r=0; r