X-Git-Url: https://ginac.de/ginac.git//ginac.git?a=blobdiff_plain;f=ginac%2Fprint.h;h=0f5af0ce44807e67bf5b1fcd4bf02aafa4bfa14e;hb=4f0b17af13eb5f7f34fdab171c6d630a77badb3d;hp=067c3b409bbe3620ae43dd91381e82573cc90586;hpb=695f6ae955ec530cded8f21efd5569df39447f76;p=ginac.git diff --git a/ginac/print.h b/ginac/print.h index 067c3b40..0f5af0ce 100644 --- a/ginac/print.h +++ b/ginac/print.h @@ -3,7 +3,7 @@ * Definition of helper classes for expression output. */ /* - * GiNaC Copyright (C) 1999-2005 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2020 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: @@ -60,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() \ @@ -93,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() {} @@ -180,7 +188,7 @@ public: /** Check if obj is a T, including base classes. */ template inline bool is_a(const print_context & obj) -{ return dynamic_cast(&obj) != 0; } +{ return dynamic_cast(&obj) != nullptr; } class basic; @@ -200,9 +208,9 @@ public: typedef void (*F)(const T &, const C &, unsigned); print_ptrfun_handler(F f_) : f(f_) {} - print_ptrfun_handler *duplicate() const { return new print_ptrfun_handler(*this); } + print_ptrfun_handler *duplicate() const override { return new print_ptrfun_handler(*this); } - void operator()(const basic & obj, const print_context & c, unsigned level) const + void operator()(const basic & obj, const print_context & c, unsigned level) const override { // Call the supplied function f(dynamic_cast(obj), dynamic_cast(c), level); @@ -216,12 +224,12 @@ 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); } + print_memfun_handler *duplicate() const override { return new print_memfun_handler(*this); } - void operator()(const basic & obj, const print_context & c, unsigned level) const + void operator()(const basic & obj, const print_context & c, unsigned level) const override { // Call the supplied member function return (dynamic_cast(obj).*f)(dynamic_cast(c), level); @@ -239,21 +247,21 @@ private: * implements the actual function call. */ class print_functor { public: - print_functor() : impl(0) {} + print_functor() : impl(nullptr) {} print_functor(const print_functor & other) : impl(other.impl.get() ? other.impl->duplicate() : 0) {} - print_functor(std::auto_ptr impl_) : impl(impl_) {} + print_functor(std::unique_ptr impl_) : impl(std::move(impl_)) {} template 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) { if (this != &other) { print_functor_impl *p = other.impl.get(); - impl.reset(p ? other.impl->duplicate() : 0); + impl.reset(p ? other.impl->duplicate() : nullptr); } return *this; } @@ -266,10 +274,10 @@ public: bool is_valid() const { return impl.get(); } private: - std::auto_ptr impl; + std::unique_ptr impl; }; } // namespace GiNaC -#endif // ndef __GINAC_BASIC_H__ +#endif // ndef GINAC_BASIC_H