X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fprint.cpp;h=263aa5137211cf0ea0790cb62457b78a03b4af61;hp=f90a40ce89fa86aa9acb01e3ca15bd37ff70ad47;hb=f78b1f296310b5f1c01b74c9fb10dd33af2a8f4a;hpb=c349526385abdaca21fabc53d23b603d4510abe0 diff --git a/ginac/print.cpp b/ginac/print.cpp index f90a40ce..263aa513 100644 --- a/ginac/print.cpp +++ b/ginac/print.cpp @@ -1,10 +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. */ + * Implementation of helper classes for expression output. */ /* - * GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany + * 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 @@ -23,240 +22,75 @@ #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" -#include "debugmsg.h" +#include "print.h" namespace GiNaC { -void ex::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("ex print",LOGLEVEL_PRINT); - GINAC_ASSERT(bp!=0); - bp->print(os,upper_precedence); -} - -void ex::dbgprint(void) const -{ - debugmsg("ex dbgprint",LOGLEVEL_PRINT); - GINAC_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 (precedence<=upper_precedence) os << "("; - basis.print(os,precedence); - os << "^"; - exponent.print(os,precedence); - if (precedence<=upper_precedence) os << ")"; -} - -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 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::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("add print",LOGLEVEL_PRINT); - if (precedence<=upper_precedence) os << "("; - numeric coeff; - bool first=true; - for (epvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) { - coeff = ex_to_numeric(cit->coeff); - if (!first) { - if (coeff.csgn()==-1) os << '-'; else os << '+'; - } else { - if (coeff.csgn()==-1) os << '-'; - first=false; - } - if (!coeff.is_equal(numONE()) && - !coeff.is_equal(numMINUSONE())) { - if (coeff.csgn()==-1) - (numMINUSONE()*coeff).print(os, precedence); - else - coeff.print(os, precedence); - os << '*'; - } - os << cit->rest; - } - // print the overall numeric coefficient, if present: - if (!overall_coeff.is_zero()) { - if (overall_coeff > 0) os << '+'; - os << overall_coeff; - } - if (precedence<=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; - // first print the overall numeric coefficient: - if (ex_to_numeric(overall_coeff).csgn()==-1) os << '-'; - if (!overall_coeff.is_equal(exONE()) && - !overall_coeff.is_equal(exMINUSONE())) { - if (ex_to_numeric(overall_coeff).csgn()==-1) - (numMINUSONE()*overall_coeff).print(os, precedence); - else - overall_coeff.print(os, precedence); - os << '*'; - } - // then proceed with the remaining factors: - 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 << ")"; -} - -void matrix::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("matrix print",LOGLEVEL_PRINT); - os << "[[ "; - for (int r=0; r