X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fprint.h;h=4a56da894780f0bfd27852d6d02e2530c9fbde7e;hp=6b80d488dded42fbacb017bf8ad7bb53e6c0568b;hb=12abd5eb38a5c4ad6eb74201df2977b4abad3f52;hpb=052d42fd9eb8b7e59eff497da98e1f58cde413a4 diff --git a/ginac/print.h b/ginac/print.h index 6b80d488..4a56da89 100644 --- a/ginac/print.h +++ b/ginac/print.h @@ -3,7 +3,7 @@ * Definition of helper classes for expression output. */ /* - * GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2015 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,21 +17,20 @@ * * 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 */ -#ifndef __GINAC_PRINT_H__ -#define __GINAC_PRINT_H__ +#ifndef GINAC_PRINT_H +#define GINAC_PRINT_H + +#include "class_info.h" #include -#include #include - -#include "class_info.h" +#include namespace GiNaC { - /** This class stores information about a registered print_context class. */ class print_context_options { public: @@ -69,19 +68,23 @@ public: \ typedef supername inherited; \ friend class function_options; \ friend class registered_class_options; \ -private: \ - static GiNaC::print_context_class_info reg_info; \ public: \ - virtual const GiNaC::print_context_class_info &get_class_info() const { return reg_info; } \ - virtual const char *class_name() const { return reg_info.options.get_name(); } \ + static const GiNaC::print_context_class_info &get_class_info_static(); \ + 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(); \ - classname * duplicate() const { return new classname(*this); } \ + virtual classname * duplicate() const { return new classname(*this); } \ private: /** Macro for inclusion in the implementation of each print_context class. */ #define GINAC_IMPLEMENT_PRINT_CONTEXT(classname, supername) \ - GiNaC::print_context_class_info classname::reg_info = GiNaC::print_context_class_info(print_context_options(#classname, #supername, next_print_context_id++)); +const GiNaC::print_context_class_info &classname::get_class_info_static() \ +{ \ + static GiNaC::print_context_class_info reg_info = GiNaC::print_context_class_info(GiNaC::print_context_options(#classname, #supername, GiNaC::next_print_context_id++)); \ + return reg_info; \ +} + extern unsigned next_print_context_id; @@ -212,7 +215,7 @@ private: template class print_memfun_handler : public print_functor_impl { public: - typedef void (T::*F)(const C & c, unsigned level); + typedef void (T::*F)(const C & c, unsigned level) const; print_memfun_handler(F f_) : f(f_) {} print_memfun_handler *duplicate() const { return new print_memfun_handler(*this); } @@ -243,7 +246,7 @@ public: print_functor(void f(const T &, const C &, unsigned)) : impl(new print_ptrfun_handler(f)) {} template - print_functor(void (T::*f)(const C &, unsigned)) : impl(new print_memfun_handler(f)) {} + print_functor(void (T::*f)(const C &, unsigned) const) : impl(new print_memfun_handler(f)) {} print_functor & operator=(const print_functor & other) { @@ -268,4 +271,4 @@ private: } // namespace GiNaC -#endif // ndef __GINAC_BASIC_H__ +#endif // ndef GINAC_BASIC_H