GiNaC 1.8.5
print.h
Go to the documentation of this file.
1
5/*
6 * GiNaC Copyright (C) 1999-2023 Johannes Gutenberg University Mainz, Germany
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23#ifndef GINAC_PRINT_H
24#define GINAC_PRINT_H
25
26#include "class_info.h"
27
28#include <iosfwd>
29#include <memory>
30#include <string>
31
32namespace GiNaC {
33
36public:
37 print_context_options(const char *n, const char *p, unsigned i)
38 : name(n), parent_name(p), id(i) {}
39
40 const char *get_name() const { return name; }
41 const char *get_parent_name() const { return parent_name; }
42 unsigned get_id() const { return id; }
43
44private:
45 const char *name;
46 const char *parent_name;
47 unsigned id;
48};
49
51
52
55public:
56 enum {
58 };
59};
60
61
63#define GINAC_DECLARE_PRINT_CONTEXT_COMMON(classname) \
64public: \
65 friend class function_options; \
66 friend class registered_class_options; \
67 static const GiNaC::print_context_class_info &get_class_info_static(); \
68 classname();
69
70#define GINAC_DECLARE_PRINT_CONTEXT_BASE(classname) \
71 GINAC_DECLARE_PRINT_CONTEXT_COMMON(classname) \
72 virtual const GiNaC::print_context_class_info &get_class_info() const { return classname::get_class_info_static(); } \
73 virtual const char *class_name() const { return classname::get_class_info_static().options.get_name(); } \
74 virtual classname * duplicate() const { return new classname(*this); } \
75private:
76
81#define GINAC_DECLARE_PRINT_CONTEXT(classname, supername) \
82 GINAC_DECLARE_PRINT_CONTEXT_COMMON(classname) \
83 typedef supername inherited; \
84 const GiNaC::print_context_class_info &get_class_info() const override { return classname::get_class_info_static(); } \
85 const char *class_name() const override { return classname::get_class_info_static().options.get_name(); } \
86 classname * duplicate() const override { return new classname(*this); } \
87private:
88
90#define GINAC_IMPLEMENT_PRINT_CONTEXT(classname, supername) \
91const GiNaC::print_context_class_info &classname::get_class_info_static() \
92{ \
93 static GiNaC::print_context_class_info reg_info = GiNaC::print_context_class_info(GiNaC::print_context_options(#classname, #supername, GiNaC::next_print_context_id++)); \
94 return reg_info; \
95}
96
97
98extern unsigned next_print_context_id;
99
100
103{
105public:
106 print_context(std::ostream &, unsigned options = 0);
107 virtual ~print_context() {}
108
109 std::ostream & s;
110 unsigned options;
111};
112
115{
117public:
118 print_dflt(std::ostream &, unsigned options = 0);
119};
120
123{
125public:
126 print_latex(std::ostream &, unsigned options = 0);
127};
128
131{
133public:
134 print_python(std::ostream &, unsigned options = 0);
135};
136
139{
141public:
142 print_python_repr(std::ostream &, unsigned options = 0);
143};
144
147{
149public:
150 print_tree(unsigned d);
151 print_tree(std::ostream &, unsigned options = 0, unsigned d = 4);
152
153 const unsigned delta_indent;
154};
155
158{
160public:
161 print_csrc(std::ostream &, unsigned options = 0);
162};
163
166{
168public:
169 print_csrc_float(std::ostream &, unsigned options = 0);
170};
171
174{
176public:
177 print_csrc_double(std::ostream &, unsigned options = 0);
178};
179
182{
184public:
185 print_csrc_cl_N(std::ostream &, unsigned options = 0);
186};
187
189template <class T>
190inline bool is_a(const print_context & obj)
191{ return dynamic_cast<const T *>(&obj) != nullptr; }
192
193
194class basic;
195
198public:
200 virtual print_functor_impl *duplicate() const = 0;
201 virtual void operator()(const basic & obj, const print_context & c, unsigned level) const = 0;
202};
203
205template <class T, class C>
207public:
208 typedef void (*F)(const T &, const C &, unsigned);
209
211 print_ptrfun_handler *duplicate() const override { return new print_ptrfun_handler(*this); }
212
213 void operator()(const basic & obj, const print_context & c, unsigned level) const override
214 {
215 // Call the supplied function
216 f(dynamic_cast<const T &>(obj), dynamic_cast<const C &>(c), level);
217 }
218
219private:
221};
222
224template <class T, class C>
226public:
227 typedef void (T::*F)(const C & c, unsigned level) const;
228
230 print_memfun_handler *duplicate() const override { return new print_memfun_handler(*this); }
231
232 void operator()(const basic & obj, const print_context & c, unsigned level) const override
233 {
234 // Call the supplied member function
235 return (dynamic_cast<const T &>(obj).*f)(dynamic_cast<const C &>(c), level);
236 }
237
238private:
240};
241
249public:
250 print_functor() : impl(nullptr) {}
251 print_functor(const print_functor & other) : impl(other.impl.get() ? other.impl->duplicate() : 0) {}
252 print_functor(std::unique_ptr<print_functor_impl> impl_) : impl(std::move(impl_)) {}
253
254 template <class T, class C>
255 print_functor(void f(const T &, const C &, unsigned)) : impl(new print_ptrfun_handler<T, C>(f)) {}
256
257 template <class T, class C>
258 print_functor(void (T::*f)(const C &, unsigned) const) : impl(new print_memfun_handler<T, C>(f)) {}
259
261 {
262 if (this != &other) {
263 print_functor_impl *p = other.impl.get();
264 impl.reset(p ? other.impl->duplicate() : nullptr);
265 }
266 return *this;
267 }
268
269 void operator()(const basic & obj, const print_context & c, unsigned level) const
270 {
271 (*impl)(obj, c, level);
272 }
273
274 bool is_valid() const { return impl.get(); }
275
276private:
277 std::unique_ptr<print_functor_impl> impl;
278};
279
280
281} // namespace GiNaC
282
283#endif // ndef GINAC_BASIC_H
This class is the ABC (abstract base class) of GiNaC's class hierarchy.
Definition: basic.h:105
This class stores information about a registered print_context class.
Definition: print.h:35
const char * get_parent_name() const
Definition: print.h:41
const char * name
Class name.
Definition: print.h:45
const char * get_name() const
Definition: print.h:40
unsigned id
ID number (assigned automatically).
Definition: print.h:47
print_context_options(const char *n, const char *p, unsigned i)
Definition: print.h:37
unsigned get_id() const
Definition: print.h:42
const char * parent_name
Name of superclass.
Definition: print.h:46
Base class for print_contexts.
Definition: print.h:103
print_context(std::ostream &, unsigned options=0)
Definition: print.cpp:44
unsigned options
option flags
Definition: print.h:110
std::ostream & s
stream to output to
Definition: print.h:109
virtual ~print_context()
Definition: print.h:107
Context for C source output using CLN numbers.
Definition: print.h:182
print_csrc_cl_N(std::ostream &, unsigned options=0)
Definition: print.cpp:91
Context for C source output using double precision.
Definition: print.h:174
print_csrc_double(std::ostream &, unsigned options=0)
Definition: print.cpp:86
Context for C source output using float precision.
Definition: print.h:166
print_csrc_float(std::ostream &, unsigned options=0)
Definition: print.cpp:81
Base context for C source output.
Definition: print.h:158
print_csrc(std::ostream &, unsigned options=0)
Definition: print.cpp:76
Context for default (ginsh-parsable) output.
Definition: print.h:115
print_dflt(std::ostream &, unsigned options=0)
Definition: print.cpp:49
Base class for print_functor handlers.
Definition: print.h:197
virtual ~print_functor_impl()
Definition: print.h:199
virtual print_functor_impl * duplicate() const =0
virtual void operator()(const basic &obj, const print_context &c, unsigned level) const =0
This class represents a print method for a certain algebraic class and print_context type.
Definition: print.h:248
print_functor(void f(const T &, const C &, unsigned))
Definition: print.h:255
print_functor(const print_functor &other)
Definition: print.h:251
bool is_valid() const
Definition: print.h:274
void operator()(const basic &obj, const print_context &c, unsigned level) const
Definition: print.h:269
print_functor(void(T::*f)(const C &, unsigned) const)
Definition: print.h:258
std::unique_ptr< print_functor_impl > impl
Definition: print.h:277
print_functor(std::unique_ptr< print_functor_impl > impl_)
Definition: print.h:252
print_functor & operator=(const print_functor &other)
Definition: print.h:260
Context for latex-parsable output.
Definition: print.h:123
print_latex(std::ostream &, unsigned options=0)
Definition: print.cpp:54
print_functor handler for member functions of class T, context type C
Definition: print.h:225
void(T::* F)(const C &c, unsigned level) const
Definition: print.h:227
print_memfun_handler * duplicate() const override
Definition: print.h:230
void operator()(const basic &obj, const print_context &c, unsigned level) const override
Definition: print.h:232
Flags to control the behavior of a print_context.
Definition: print.h:54
@ print_index_dimensions
print the dimensions of indices
Definition: print.h:57
print_functor handler for pointer-to-functions of class T, context type C
Definition: print.h:206
print_ptrfun_handler * duplicate() const override
Definition: print.h:211
void operator()(const basic &obj, const print_context &c, unsigned level) const override
Definition: print.h:213
void(* F)(const T &, const C &, unsigned)
Definition: print.h:208
Context for python-parsable output.
Definition: print.h:139
print_python_repr(std::ostream &, unsigned options=0)
Definition: print.cpp:64
Context for python pretty-print output.
Definition: print.h:131
print_python(std::ostream &, unsigned options=0)
Definition: print.cpp:59
Context for tree-like output for debugging.
Definition: print.h:147
print_tree(unsigned d)
Definition: print.cpp:71
const unsigned delta_indent
size of indentation step
Definition: print.h:153
Helper templates to provide per-class information for class hierarchies.
size_t n
Definition: factor.cpp:1432
size_t c
Definition: factor.cpp:757
Definition: add.cpp:38
unsigned next_print_context_id
Next free ID for print_context types.
Definition: print.cpp:30
bool is_a(const basic &obj)
Check if obj is a T, including base classes.
Definition: basic.h:313
class_info< print_context_options > print_context_class_info
Definition: print.h:50
Definition: ex.h:987
#define GINAC_DECLARE_PRINT_CONTEXT_BASE(classname)
Definition: print.h:70
#define GINAC_DECLARE_PRINT_CONTEXT(classname, supername)
Macro for inclusion in the declaration of a print_context class.
Definition: print.h:81

This page is part of the GiNaC developer's reference. It was generated automatically by doxygen. For an introduction, see the tutorial.