[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
6.3.3 Adding new output formats
Creating a new output format involves subclassing print_context
,
which is somewhat similar to adding a new algebraic class
(see section Adding classes). There is a macro GINAC_DECLARE_PRINT_CONTEXT
that needs to go into the class definition, and a corresponding macro
GINAC_IMPLEMENT_PRINT_CONTEXT
that has to appear at global scope.
Every print_context
class needs to provide a default constructor
and a constructor from an std::ostream
and an unsigned
options value.
Here is an example for a user-defined print_context
class:
class print_myformat : public print_dflt { GINAC_DECLARE_PRINT_CONTEXT(print_myformat, print_dflt) public: print_myformat(std::ostream & os, unsigned opt = 0) : print_dflt(os, opt) {} }; print_myformat::print_myformat() : print_dflt(std::cout) {} GINAC_IMPLEMENT_PRINT_CONTEXT(print_myformat, print_dflt) |
That's all there is to it. None of the actual expression output logic is implemented in this class. It merely serves as a selector for choosing a particular format. The algorithms for printing expressions in the new format are implemented as print methods, as described above.
print_myformat
is a subclass of print_dflt
, so it behaves
exactly like GiNaC's default output format:
{ symbol x("x"); ex e = pow(x, 2) + 1; // this prints "1+x^2" cout << e << endl; // this also prints "1+x^2" e.print(print_myformat()); cout << endl; ... } |
To fill print_myformat
with life, we need to supply appropriate
print methods with set_print_func()
, like this:
// This prints powers with '**' instead of '^'. See the LaTeX output // example above for explanations. void print_power_as_myformat(const power & p, const print_myformat & c, unsigned level) { unsigned power_prec = p.precedence(); if (level >= power_prec) c.s << '('; p.op(0).print(c, power_prec); c.s << "**"; p.op(1).print(c, power_prec); if (level >= power_prec) c.s << ')'; } { ... // install a new print method for power objects set_print_func<power, print_myformat>(print_power_as_myformat); // now this prints "1+x**2" e.print(print_myformat()); cout << endl; // but the default format is still "1+x^2" cout << e << endl; } |