X-Git-Url: https://ginac.de/ginac.git//ginac.git?a=blobdiff_plain;ds=sidebyside;f=ginac%2Fprint.h;h=27f69afa934074720e7e05c141b788e79b39abb5;hb=ec64e556734484ca3c518e6de95b26be61bedee7;hp=675219b664580de6aa8d03fb1050ccdd1220dc30;hpb=9413cd14faaf2980de3884915e22a5beda068ecc;p=ginac.git diff --git a/ginac/print.h b/ginac/print.h index 675219b6..27f69afa 100644 --- a/ginac/print.h +++ b/ginac/print.h @@ -3,7 +3,7 @@ * Definition of helper classes for expression output. */ /* - * GiNaC Copyright (C) 1999-2016 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2019 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 @@ -59,24 +59,33 @@ public: }; -/** Macro for inclusion in the declaration of a print_context class. - * It declares some functions that are common to all classes derived - * from 'print_context' as well as all required stuff for the GiNaC - * registry. */ -#define GINAC_DECLARE_PRINT_CONTEXT(classname, supername) \ +/** Common part of GINAC_DECLARE_PRINT_CONTEXT_BASE and GINAC_DECLARE_PRINT_CONTEXT_DERIVED. */ +#define GINAC_DECLARE_PRINT_CONTEXT_COMMON(classname) \ public: \ - typedef supername inherited; \ friend class function_options; \ friend class registered_class_options; \ -public: \ static const GiNaC::print_context_class_info &get_class_info_static(); \ + classname(); + +#define GINAC_DECLARE_PRINT_CONTEXT_BASE(classname) \ + GINAC_DECLARE_PRINT_CONTEXT_COMMON(classname) \ virtual const GiNaC::print_context_class_info &get_class_info() const { return classname::get_class_info_static(); } \ virtual const char *class_name() const { return classname::get_class_info_static().options.get_name(); } \ - \ - classname(); \ virtual classname * duplicate() const { return new classname(*this); } \ private: +/** Macro for inclusion in the declaration of a print_context class. + * It declares some functions that are common to all classes derived + * from 'print_context' as well as all required stuff for the GiNaC + * registry. */ +#define GINAC_DECLARE_PRINT_CONTEXT(classname, supername) \ + GINAC_DECLARE_PRINT_CONTEXT_COMMON(classname) \ + typedef supername inherited; \ + const GiNaC::print_context_class_info &get_class_info() const override { return classname::get_class_info_static(); } \ + const char *class_name() const override { return classname::get_class_info_static().options.get_name(); } \ + classname * duplicate() const override { return new classname(*this); } \ +private: + /** Macro for inclusion in the implementation of each print_context class. */ #define GINAC_IMPLEMENT_PRINT_CONTEXT(classname, supername) \ const GiNaC::print_context_class_info &classname::get_class_info_static() \ @@ -92,7 +101,7 @@ extern unsigned next_print_context_id; /** Base class for print_contexts. */ class print_context { - GINAC_DECLARE_PRINT_CONTEXT(print_context, void) + GINAC_DECLARE_PRINT_CONTEXT_BASE(print_context) public: print_context(std::ostream &, unsigned options = 0); virtual ~print_context() {}