* Oops, forgot to cvs add the two new files in last commit.
[ginac.git] / ginac / utils.cpp
1 /** @file utils.cpp
2  *
3  *  Implementation of several small and furry utilities needed within GiNaC
4  *  but not of any interest to the user of the library. */
5
6 /*
7  *  GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or
12  *  (at your option) any later version.
13  *
14  *  This program is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *  GNU General Public License for more details.
18  *
19  *  You should have received a copy of the GNU General Public License
20  *  along with this program; if not, write to the Free Software
21  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  */
23
24 #include "ex.h"
25 #include "numeric.h"
26 #include "utils.h"
27 #include "version.h"
28
29 namespace GiNaC {
30
31 /* Version information buried into the library */
32 const int version_major = GINACLIB_MAJOR_VERSION;
33 const int version_minor = GINACLIB_MINOR_VERSION;
34 const int version_micro = GINACLIB_MICRO_VERSION;
35
36
37 /** ctor for pole_error exception class. */
38 pole_error::pole_error(const std::string& what_arg, int degree)
39         : domain_error(what_arg), deg(degree) { }
40
41 /** Return the degree of the pole_error exception class. */
42 int pole_error::degree() const
43 {
44         return deg;
45 }
46
47 // some compilers (e.g. cygwin) define a macro log2, causing confusion
48 #ifndef log2
49 /** Integer binary logarithm */
50 unsigned log2(unsigned n)
51 {
52         unsigned k;
53         for (k = 0; n > 1; n >>= 1)
54                 ++k;
55         return k;
56 }
57 #endif
58
59
60 //////////
61 // flyweight chest of numbers is initialized here:
62 //////////
63
64 /** How many static objects were created?  Only the first one must create
65  *  the static flyweights on the heap. */
66 int library_init::count = 0;
67
68 // static numeric -120
69 const numeric *_num_120_p;
70 const numeric &_num_120 = *_num_120_p;
71 const ex _ex_120 = _num_120;
72
73 // static numeric -60
74 const numeric *_num_60_p;
75 const numeric &_num_60 = *_num_60_p;
76 const ex _ex_60 = _num_60;
77
78 // static numeric -48
79 const numeric *_num_48_p;
80 const numeric &_num_48 = *_num_48_p;
81 const ex _ex_48 = _num_48;
82
83 // static numeric -30
84 const numeric *_num_30_p;
85 const numeric &_num_30 = *_num_30_p;
86 const ex _ex_30 = _num_30;
87
88 // static numeric -25
89 const numeric *_num_25_p;
90 const numeric &_num_25 = *_num_25_p;
91 const ex _ex_25 = _num_25;
92
93 // static numeric -24
94 const numeric *_num_24_p;
95 const numeric &_num_24 = *_num_24_p;
96 const ex _ex_24 = _num_24;
97
98 // static numeric -20
99 const numeric *_num_20_p;
100 const numeric &_num_20 = *_num_20_p;
101 const ex _ex_20 = _num_20;
102
103 // static numeric -18
104 const numeric *_num_18_p;
105 const numeric &_num_18 = *_num_18_p;
106 const ex _ex_18 = _num_18;
107
108 // static numeric -15
109 const numeric *_num_15_p;
110 const numeric &_num_15 = *_num_15_p;
111 const ex _ex_15 = _num_15;
112
113 // static numeric -12
114 const numeric *_num_12_p;
115 const numeric &_num_12 = *_num_12_p;
116 const ex _ex_12 = _num_12;
117
118 // static numeric -11
119 const numeric *_num_11_p;
120 const numeric &_num_11 = *_num_11_p;
121 const ex _ex_11 = _num_11;
122
123 // static numeric -10
124 const numeric *_num_10_p;
125 const numeric &_num_10 = *_num_10_p;
126 const ex _ex_10 = _num_10;
127
128 // static numeric -9
129 const numeric *_num_9_p;
130 const numeric &_num_9 = *_num_9_p;
131 const ex _ex_9 = _num_9;
132
133 // static numeric -8
134 const numeric *_num_8_p;
135 const numeric &_num_8 = *_num_8_p;
136 const ex _ex_8 = _num_8;
137
138 // static numeric -7
139 const numeric *_num_7_p;
140 const numeric &_num_7 = *_num_7_p;
141 const ex _ex_7 = _num_7;
142
143 // static numeric -6
144 const numeric *_num_6_p;
145 const numeric &_num_6 = *_num_6_p;
146 const ex _ex_6 = _num_6;
147
148 // static numeric -5
149 const numeric *_num_5_p;
150 const numeric &_num_5 = *_num_5_p;
151 const ex _ex_5 = _num_5;
152
153 // static numeric -4
154 const numeric *_num_4_p;
155 const numeric &_num_4 = *_num_4_p;
156 const ex _ex_4 = _num_4;
157
158 // static numeric -3
159 const numeric *_num_3_p;
160 const numeric &_num_3 = *_num_3_p;
161 const ex _ex_3 = _num_3;
162
163 // static numeric -2
164 const numeric *_num_2_p;
165 const numeric &_num_2 = *_num_2_p;
166 const ex _ex_2 = _num_2;
167
168 // static numeric -1
169 const numeric *_num_1_p;
170 const numeric &_num_1 = *_num_1_p;
171 const ex _ex_1 = _num_1;
172
173 // static numeric -1/2
174 const numeric *_num_1_2_p;
175 const numeric &_num_1_2= *_num_1_2_p;
176 const ex _ex_1_2= _num_1_2;
177
178 // static numeric -1/3
179 const numeric *_num_1_3_p;
180 const numeric &_num_1_3= *_num_1_3_p;
181 const ex _ex_1_3= _num_1_3;
182
183 // static numeric -1/4
184 const numeric *_num_1_4_p;
185 const numeric &_num_1_4= *_num_1_4_p;
186 const ex _ex_1_4= _num_1_4;
187
188 // static numeric 0
189 const numeric *_num0_p;
190 const basic *_num0_bp;
191 const numeric &_num0 = *_num0_p;
192 const ex _ex0 = _num0;
193
194 // static numeric 1/4
195 const numeric *_num1_4_p;
196 const numeric &_num1_4 = *_num1_4_p;
197 const ex _ex1_4 = _num1_4;
198
199 // static numeric 1/3
200 const numeric *_num1_3_p;
201 const numeric &_num1_3 = *_num1_3_p;
202 const ex _ex1_3 = _num1_3;
203
204 // static numeric 1/2
205 const numeric *_num1_2_p;
206 const numeric &_num1_2 = *_num1_2_p;
207 const ex _ex1_2 = _num1_2;
208
209 // static numeric 1
210 const numeric *_num1_p;
211 const numeric &_num1 = *_num1_p;
212 const ex _ex1 = _num1;
213
214 // static numeric 2
215 const numeric *_num2_p;
216 const numeric &_num2 = *_num2_p;
217 const ex _ex2 = _num2;
218
219 // static numeric 3
220 const numeric *_num3_p;
221 const numeric &_num3 = *_num3_p;
222 const ex _ex3 = _num3;
223
224 // static numeric 4
225 const numeric *_num4_p;
226 const numeric &_num4 = *_num4_p;
227 const ex _ex4 = _num4;
228
229 // static numeric 5
230 const numeric *_num5_p;
231 const numeric &_num5 = *_num5_p;
232 const ex _ex5 = _num5;
233
234 // static numeric 6
235 const numeric *_num6_p;
236 const numeric &_num6 = *_num6_p;
237 const ex _ex6 = _num6;
238
239 // static numeric 7
240 const numeric *_num7_p;
241 const numeric &_num7 = *_num7_p;
242 const ex _ex7 = _num7;
243
244 // static numeric 8
245 const numeric *_num8_p;
246 const numeric &_num8 = *_num8_p;
247 const ex _ex8 = _num8;
248
249 // static numeric 9
250 const numeric *_num9_p;
251 const numeric &_num9 = *_num9_p;
252 const ex _ex9 = _num9;
253
254 // static numeric 10
255 const numeric *_num10_p;
256 const numeric &_num10 = *_num10_p;
257 const ex _ex10 = _num10;
258
259 // static numeric 11
260 const numeric *_num11_p;
261 const numeric &_num11 = *_num11_p;
262 const ex _ex11 = _num11;
263
264 // static numeric 12
265 const numeric *_num12_p;
266 const numeric &_num12 = *_num12_p;
267 const ex _ex12 = _num12;
268
269 // static numeric 15
270 const numeric *_num15_p;
271 const numeric &_num15 = *_num15_p;
272 const ex _ex15 = _num15;
273
274 // static numeric 18
275 const numeric *_num18_p;
276 const numeric &_num18 = *_num18_p;
277 const ex _ex18 = _num18;
278
279 // static numeric 20
280 const numeric *_num20_p;
281 const numeric &_num20 = *_num20_p;
282 const ex _ex20 = _num20;
283
284 // static numeric 24
285 const numeric *_num24_p;
286 const numeric &_num24 = *_num24_p;
287 const ex _ex24 = _num24;
288
289 // static numeric 25
290 const numeric *_num25_p;
291 const numeric &_num25 = *_num25_p;
292 const ex _ex25 = _num25;
293
294 // static numeric 30
295 const numeric *_num30_p;
296 const numeric &_num30 = *_num30_p;
297 const ex _ex30 = _num30;
298
299 // static numeric 48
300 const numeric *_num48_p;
301 const numeric &_num48 = *_num48_p;
302 const ex _ex48 = _num48;
303
304 // static numeric 60
305 const numeric *_num60_p;
306 const numeric &_num60 = *_num60_p;
307 const ex _ex60 = _num60;
308
309 // static numeric 120
310 const numeric *_num120_p;
311 const numeric &_num120 = *_num120_p;
312 const ex _ex120 = _num120;
313
314 /** Ctor of static initialization helpers.  The fist call to this is going
315  *  to initialize the library, the others do nothing. */
316 library_init::library_init()
317 {
318         if (count++==0) {
319                 _num_120_p= reinterpret_cast<const numeric*>(&((new numeric(-120))->setflag(status_flags::dynallocated)));
320                 _num_60_p = reinterpret_cast<const numeric*>(&((new numeric(-60))->setflag(status_flags::dynallocated)));
321                 _num_48_p = reinterpret_cast<const numeric*>(&((new numeric(-48))->setflag(status_flags::dynallocated)));
322                 _num_30_p = reinterpret_cast<const numeric*>(&((new numeric(-30))->setflag(status_flags::dynallocated)));
323                 _num_25_p = reinterpret_cast<const numeric*>(&((new numeric(-25))->setflag(status_flags::dynallocated)));
324                 _num_24_p = reinterpret_cast<const numeric*>(&((new numeric(-24))->setflag(status_flags::dynallocated)));
325                 _num_20_p = reinterpret_cast<const numeric*>(&((new numeric(-20))->setflag(status_flags::dynallocated)));
326                 _num_18_p = reinterpret_cast<const numeric*>(&((new numeric(-18))->setflag(status_flags::dynallocated)));
327                 _num_15_p = reinterpret_cast<const numeric*>(&((new numeric(-15))->setflag(status_flags::dynallocated)));
328                 _num_12_p = reinterpret_cast<const numeric*>(&((new numeric(-12))->setflag(status_flags::dynallocated)));
329                 _num_11_p = reinterpret_cast<const numeric*>(&((new numeric(-11))->setflag(status_flags::dynallocated)));
330                 _num_10_p = reinterpret_cast<const numeric*>(&((new numeric(-10))->setflag(status_flags::dynallocated)));
331                 _num_9_p  = reinterpret_cast<const numeric*>(&((new numeric(-9))->setflag(status_flags::dynallocated)));
332                 _num_8_p  = reinterpret_cast<const numeric*>(&((new numeric(-8))->setflag(status_flags::dynallocated)));
333                 _num_7_p  = reinterpret_cast<const numeric*>(&((new numeric(-7))->setflag(status_flags::dynallocated)));
334                 _num_6_p  = reinterpret_cast<const numeric*>(&((new numeric(-6))->setflag(status_flags::dynallocated)));
335                 _num_5_p  = reinterpret_cast<const numeric*>(&((new numeric(-5))->setflag(status_flags::dynallocated)));
336                 _num_4_p  = reinterpret_cast<const numeric*>(&((new numeric(-4))->setflag(status_flags::dynallocated)));
337                 _num_3_p  = reinterpret_cast<const numeric*>(&((new numeric(-3))->setflag(status_flags::dynallocated)));
338                 _num_2_p  = reinterpret_cast<const numeric*>(&((new numeric(-2))->setflag(status_flags::dynallocated)));
339                 _num_1_p  = reinterpret_cast<const numeric*>(&((new numeric(-1))->setflag(status_flags::dynallocated)));
340                 _num_1_2_p= reinterpret_cast<const numeric*>(&((new numeric(-1,2))->setflag(status_flags::dynallocated)));
341                 _num_1_3_p= reinterpret_cast<const numeric*>(&((new numeric(-1,3))->setflag(status_flags::dynallocated)));
342                 _num_1_4_p= reinterpret_cast<const numeric*>(&((new numeric(-1,4))->setflag(status_flags::dynallocated)));
343                 _num0_p   = reinterpret_cast<const numeric*>(&((new numeric(0))->setflag(status_flags::dynallocated)));
344                 _num0_bp  = _num0_p;
345                 _num1_4_p = reinterpret_cast<const numeric*>(&((new numeric(1,4))->setflag(status_flags::dynallocated)));
346                 _num1_3_p = reinterpret_cast<const numeric*>(&((new numeric(1,3))->setflag(status_flags::dynallocated)));
347                 _num1_2_p = reinterpret_cast<const numeric*>(&((new numeric(1,2))->setflag(status_flags::dynallocated)));
348                 _num1_p   = reinterpret_cast<const numeric*>(&((new numeric(1))->setflag(status_flags::dynallocated)));
349                 _num2_p   = reinterpret_cast<const numeric*>(&((new numeric(2))->setflag(status_flags::dynallocated)));
350                 _num3_p   = reinterpret_cast<const numeric*>(&((new numeric(3))->setflag(status_flags::dynallocated)));
351                 _num4_p   = reinterpret_cast<const numeric*>(&((new numeric(4))->setflag(status_flags::dynallocated)));
352                 _num5_p   = reinterpret_cast<const numeric*>(&((new numeric(5))->setflag(status_flags::dynallocated)));
353                 _num6_p   = reinterpret_cast<const numeric*>(&((new numeric(6))->setflag(status_flags::dynallocated)));
354                 _num7_p   = reinterpret_cast<const numeric*>(&((new numeric(7))->setflag(status_flags::dynallocated)));
355                 _num8_p   = reinterpret_cast<const numeric*>(&((new numeric(8))->setflag(status_flags::dynallocated)));
356                 _num9_p   = reinterpret_cast<const numeric*>(&((new numeric(9))->setflag(status_flags::dynallocated)));
357                 _num10_p  = reinterpret_cast<const numeric*>(&((new numeric(10))->setflag(status_flags::dynallocated)));
358                 _num11_p  = reinterpret_cast<const numeric*>(&((new numeric(11))->setflag(status_flags::dynallocated)));
359                 _num12_p  = reinterpret_cast<const numeric*>(&((new numeric(12))->setflag(status_flags::dynallocated)));
360                 _num15_p  = reinterpret_cast<const numeric*>(&((new numeric(15))->setflag(status_flags::dynallocated)));
361                 _num18_p  = reinterpret_cast<const numeric*>(&((new numeric(18))->setflag(status_flags::dynallocated)));
362                 _num20_p  = reinterpret_cast<const numeric*>(&((new numeric(20))->setflag(status_flags::dynallocated)));
363                 _num24_p  = reinterpret_cast<const numeric*>(&((new numeric(24))->setflag(status_flags::dynallocated)));
364                 _num25_p  = reinterpret_cast<const numeric*>(&((new numeric(25))->setflag(status_flags::dynallocated)));
365                 _num30_p  = reinterpret_cast<const numeric*>(&((new numeric(30))->setflag(status_flags::dynallocated)));
366                 _num48_p  = reinterpret_cast<const numeric*>(&((new numeric(48))->setflag(status_flags::dynallocated)));
367                 _num60_p  = reinterpret_cast<const numeric*>(&((new numeric(60))->setflag(status_flags::dynallocated)));
368                 _num120_p = reinterpret_cast<const numeric*>(&((new numeric(120))->setflag(status_flags::dynallocated)));
369
370                 // Initialize print context class info (this is not strictly necessary
371                 // but we do it anyway to make print_context_class_info::dump_hierarchy()
372                 // output the whole hierarchy whether or not the classes are actually
373                 // used)
374                 print_context::get_class_info_static();
375                 print_dflt::get_class_info_static();
376                 print_latex::get_class_info_static();
377                 print_python::get_class_info_static();
378                 print_python_repr::get_class_info_static();
379                 print_tree::get_class_info_static();
380                 print_csrc::get_class_info_static();
381                 print_csrc_float::get_class_info_static();
382                 print_csrc_double::get_class_info_static();
383                 print_csrc_cl_N::get_class_info_static();
384         }
385 }
386
387
388 /** Dtor of static initialization helpers.  The last call to this is going
389  *  to shut down the library, the others do nothing. */
390 library_init::~library_init()
391 {
392         if (--count==0) {
393                 // In theory, we would have to clean up here.  But since we were
394                 // only initializing memory in the ctor and that memory is reclaimed
395                 // anyways by the OS when the program exits, we skip this.
396         }
397 }
398
399 // comment skeleton for header files
400
401
402 // member functions
403
404         // default constructor, destructor, copy constructor and assignment operator
405         // none
406
407         // other constructors
408         // none
409
410         // functions overriding virtual functions from base classes
411         // none
412         
413         // new virtual functions which can be overridden by derived classes
414         // none
415
416         // non-virtual functions in this class
417         // none
418
419 // member variables
420 // none
421         
422
423
424 // comment skeleton for implementation files
425
426
427 //////////
428 // default constructor, destructor, copy constructor and assignment operator
429 //////////
430
431 // public
432 // protected
433
434 //////////
435 // other constructors
436 //////////
437
438 // public
439 // none
440
441 //////////
442 // functions overriding virtual functions from base classes
443 //////////
444
445 // public
446 // protected
447 // none
448
449 //////////
450 // new virtual functions which can be overridden by derived classes
451 //////////
452
453 // public
454 // protected
455 // none
456
457 //////////
458 // non-virtual functions in this class
459 //////////
460
461 // public
462 // protected
463 // none
464
465 //////////
466 // static member variables
467 //////////
468
469 // protected
470 // private
471 // none
472
473
474 } // namespace GiNaC