X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fprint.cpp;h=1daede807571ce6add7fef1d438af4dde35f253b;hp=f75ad933ee29517f15b9959cfa57282886ac6e0b;hb=68fdf425abf14d016d5f95ee7b9d06a19a3c5926;hpb=487e5659efe401683eee0381b0d23f967ffffc3c diff --git a/ginac/print.cpp b/ginac/print.cpp index f75ad933..1daede80 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,298 +22,53 @@ #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 "print.h" -void ex::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("ex print",LOGLEVEL_PRINT); - ASSERT(bp!=0); - bp->print(os,upper_precedence); -} +namespace GiNaC { -void ex::dbgprint(void) const -{ - debugmsg("ex dbgprint",LOGLEVEL_PRINT); - ASSERT(bp!=0); - bp->dbgprint(); -} +print_context::print_context() + : s(std::cout), options(0) {} +print_context::print_context(std::ostream & os, unsigned opt) + : s(os), options(opt) {} -void basic::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("basic print",LOGLEVEL_PRINT); - os << "[basic object]"; -} +print_latex::print_latex() + : print_context(std::cout) {} +print_latex::print_latex(std::ostream & os, unsigned opt) + : print_context(os, opt) {} -void basic::dbgprint(void) const -{ - print(cerr); - cerr << endl; -} +print_python::print_python() + : print_context(std::cout) {} +print_python::print_python(std::ostream & os, unsigned opt) + : print_context(os, opt) {} -void symbol::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("symbol print",LOGLEVEL_PRINT); - os << name; -} +print_python_repr::print_python_repr() + : print_context(std::cout) {} +print_python_repr::print_python_repr(std::ostream & os, unsigned opt) + : print_context(os, opt) {} -void constant::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("constant print",LOGLEVEL_PRINT); - os << name; -} +print_tree::print_tree(unsigned d) + : print_context(std::cout), delta_indent(d) {} +print_tree::print_tree(std::ostream & os, unsigned opt, unsigned d) + : print_context(os, opt), delta_indent(d) {} -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 -} +print_csrc::print_csrc() + : print_context(std::cout) {} +print_csrc::print_csrc(std::ostream & os, unsigned opt) + : print_context(os, opt) {} -void fail::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("fail print",LOGLEVEL_PRINT); - os << "FAIL"; -} +print_csrc_float::print_csrc_float() + : print_csrc(std::cout) {} +print_csrc_float::print_csrc_float(std::ostream & os, unsigned opt) + : print_csrc(os, opt) {} -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 << "]]"; -} +print_csrc_double::print_csrc_double() + : print_csrc(std::cout) {} +print_csrc_double::print_csrc_double(std::ostream & os, unsigned opt) + : print_csrc(os, opt) {} -/* -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 << ")"; -} +print_csrc_cl_N::print_csrc_cl_N() + : print_csrc(std::cout) {} +print_csrc_cl_N::print_csrc_cl_N(std::ostream & os, unsigned opt) + : print_csrc(os, opt) {} -void matrix::print(ostream & os, unsigned upper_precedence) const -{ - debugmsg("matrix print",LOGLEVEL_PRINT); - os << "[[ "; - for (int r=0; r