X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fprint.cpp;h=b3fbb5421cc0c82e1a4a42d510afb855fa39d329;hp=2d3a936341b292e036f66f8f6cb7165ff34e6e61;hb=40234423820294740aa535a713c2784d1bb23351;hpb=66c0f31c678e6c1938d637636b230ea376c157c1 diff --git a/ginac/print.cpp b/ginac/print.cpp index 2d3a9363..b3fbb542 100644 --- a/ginac/print.cpp +++ b/ginac/print.cpp @@ -1,9 +1,9 @@ /** @file print.cpp * - * The methods .print() are responsible for the nice default-output of - * objects. All related helper-functions go in here as well. - * - * GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany + * Implementation of helper classes for expression output. */ + +/* + * GiNaC Copyright (C) 1999-2018 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 @@ -17,303 +17,80 @@ * * 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 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include - -#include "basic.h" -#include "ex.h" -#include "add.h" -#include "constant.h" -#include "expairseq.h" -#include "fail.h" -#include "indexed.h" -#include "inifcns.h" -#include "matrix.h" -#include "mul.h" -#include "ncmul.h" -#include "numeric.h" -#include "power.h" -#include "relational.h" -#include "series.h" -#include "symbol.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 -} +#include "print.h" -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 << "]]"; -} - -/* -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); -} - -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