- prepared for 1.0.13 release
[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(void) 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 numeric &_num0 = *_num0_p;
191 const ex _ex0 = _num0;
192
193 // static numeric 1/4
194 const numeric *_num1_4_p;
195 const numeric &_num1_4 = *_num1_4_p;
196 const ex _ex1_4 = _num1_4;
197
198 // static numeric 1/3
199 const numeric *_num1_3_p;
200 const numeric &_num1_3 = *_num1_3_p;
201 const ex _ex1_3 = _num1_3;
202
203 // static numeric 1/2
204 const numeric *_num1_2_p;
205 const numeric &_num1_2 = *_num1_2_p;
206 const ex _ex1_2 = _num1_2;
207
208 // static numeric 1
209 const numeric *_num1_p;
210 const numeric &_num1 = *_num1_p;
211 const ex _ex1 = _num1;
212
213 // static numeric 2
214 const numeric *_num2_p;
215 const numeric &_num2 = *_num2_p;
216 const ex _ex2 = _num2;
217
218 // static numeric 3
219 const numeric *_num3_p;
220 const numeric &_num3 = *_num3_p;
221 const ex _ex3 = _num3;
222
223 // static numeric 4
224 const numeric *_num4_p;
225 const numeric &_num4 = *_num4_p;
226 const ex _ex4 = _num4;
227
228 // static numeric 5
229 const numeric *_num5_p;
230 const numeric &_num5 = *_num5_p;
231 const ex _ex5 = _num5;
232
233 // static numeric 6
234 const numeric *_num6_p;
235 const numeric &_num6 = *_num6_p;
236 const ex _ex6 = _num6;
237
238 // static numeric 7
239 const numeric *_num7_p;
240 const numeric &_num7 = *_num7_p;
241 const ex _ex7 = _num7;
242
243 // static numeric 8
244 const numeric *_num8_p;
245 const numeric &_num8 = *_num8_p;
246 const ex _ex8 = _num8;
247
248 // static numeric 9
249 const numeric *_num9_p;
250 const numeric &_num9 = *_num9_p;
251 const ex _ex9 = _num9;
252
253 // static numeric 10
254 const numeric *_num10_p;
255 const numeric &_num10 = *_num10_p;
256 const ex _ex10 = _num10;
257
258 // static numeric 11
259 const numeric *_num11_p;
260 const numeric &_num11 = *_num11_p;
261 const ex _ex11 = _num11;
262
263 // static numeric 12
264 const numeric *_num12_p;
265 const numeric &_num12 = *_num12_p;
266 const ex _ex12 = _num12;
267
268 // static numeric 15
269 const numeric *_num15_p;
270 const numeric &_num15 = *_num15_p;
271 const ex _ex15 = _num15;
272
273 // static numeric 18
274 const numeric *_num18_p;
275 const numeric &_num18 = *_num18_p;
276 const ex _ex18 = _num18;
277
278 // static numeric 20
279 const numeric *_num20_p;
280 const numeric &_num20 = *_num20_p;
281 const ex _ex20 = _num20;
282
283 // static numeric 24
284 const numeric *_num24_p;
285 const numeric &_num24 = *_num24_p;
286 const ex _ex24 = _num24;
287
288 // static numeric 25
289 const numeric *_num25_p;
290 const numeric &_num25 = *_num25_p;
291 const ex _ex25 = _num25;
292
293 // static numeric 30
294 const numeric *_num30_p;
295 const numeric &_num30 = *_num30_p;
296 const ex _ex30 = _num30;
297
298 // static numeric 48
299 const numeric *_num48_p;
300 const numeric &_num48 = *_num48_p;
301 const ex _ex48 = _num48;
302
303 // static numeric 60
304 const numeric *_num60_p;
305 const numeric &_num60 = *_num60_p;
306 const ex _ex60 = _num60;
307
308 // static numeric 120
309 const numeric *_num120_p;
310 const numeric &_num120 = *_num120_p;
311 const ex _ex120 = _num120;
312
313 /** Ctor of static initialization helpers.  The fist call to this is going
314  *  to initialize the library, the others do nothing. */
315 library_init::library_init()
316 {
317         if (count++==0) {
318                 _num_120_p= reinterpret_cast<const numeric*>(&((new numeric(-120))->setflag(status_flags::dynallocated)));
319                 _num_60_p = reinterpret_cast<const numeric*>(&((new numeric(-60))->setflag(status_flags::dynallocated)));
320                 _num_48_p = reinterpret_cast<const numeric*>(&((new numeric(-48))->setflag(status_flags::dynallocated)));
321                 _num_30_p = reinterpret_cast<const numeric*>(&((new numeric(-30))->setflag(status_flags::dynallocated)));
322                 _num_25_p = reinterpret_cast<const numeric*>(&((new numeric(-25))->setflag(status_flags::dynallocated)));
323                 _num_24_p = reinterpret_cast<const numeric*>(&((new numeric(-24))->setflag(status_flags::dynallocated)));
324                 _num_20_p = reinterpret_cast<const numeric*>(&((new numeric(-20))->setflag(status_flags::dynallocated)));
325                 _num_18_p = reinterpret_cast<const numeric*>(&((new numeric(-18))->setflag(status_flags::dynallocated)));
326                 _num_15_p = reinterpret_cast<const numeric*>(&((new numeric(-15))->setflag(status_flags::dynallocated)));
327                 _num_12_p = reinterpret_cast<const numeric*>(&((new numeric(-12))->setflag(status_flags::dynallocated)));
328                 _num_11_p = reinterpret_cast<const numeric*>(&((new numeric(-11))->setflag(status_flags::dynallocated)));
329                 _num_10_p = reinterpret_cast<const numeric*>(&((new numeric(-10))->setflag(status_flags::dynallocated)));
330                 _num_9_p  = reinterpret_cast<const numeric*>(&((new numeric(-9))->setflag(status_flags::dynallocated)));
331                 _num_8_p  = reinterpret_cast<const numeric*>(&((new numeric(-8))->setflag(status_flags::dynallocated)));
332                 _num_7_p  = reinterpret_cast<const numeric*>(&((new numeric(-7))->setflag(status_flags::dynallocated)));
333                 _num_6_p  = reinterpret_cast<const numeric*>(&((new numeric(-6))->setflag(status_flags::dynallocated)));
334                 _num_5_p  = reinterpret_cast<const numeric*>(&((new numeric(-5))->setflag(status_flags::dynallocated)));
335                 _num_4_p  = reinterpret_cast<const numeric*>(&((new numeric(-4))->setflag(status_flags::dynallocated)));
336                 _num_3_p  = reinterpret_cast<const numeric*>(&((new numeric(-3))->setflag(status_flags::dynallocated)));
337                 _num_2_p  = reinterpret_cast<const numeric*>(&((new numeric(-2))->setflag(status_flags::dynallocated)));
338                 _num_1_p  = reinterpret_cast<const numeric*>(&((new numeric(-1))->setflag(status_flags::dynallocated)));
339                 _num_1_2_p= reinterpret_cast<const numeric*>(&((new numeric(-1,2))->setflag(status_flags::dynallocated)));
340                 _num_1_3_p= reinterpret_cast<const numeric*>(&((new numeric(-1,3))->setflag(status_flags::dynallocated)));
341                 _num_1_4_p= reinterpret_cast<const numeric*>(&((new numeric(-1,4))->setflag(status_flags::dynallocated)));
342                 _num0_p   = reinterpret_cast<const numeric*>(&((new numeric(0))->setflag(status_flags::dynallocated)));
343                 _num1_4_p = reinterpret_cast<const numeric*>(&((new numeric(1,4))->setflag(status_flags::dynallocated)));
344                 _num1_3_p = reinterpret_cast<const numeric*>(&((new numeric(1,3))->setflag(status_flags::dynallocated)));
345                 _num1_2_p = reinterpret_cast<const numeric*>(&((new numeric(1,2))->setflag(status_flags::dynallocated)));
346                 _num1_p   = reinterpret_cast<const numeric*>(&((new numeric(1))->setflag(status_flags::dynallocated)));
347                 _num2_p   = reinterpret_cast<const numeric*>(&((new numeric(2))->setflag(status_flags::dynallocated)));
348                 _num3_p   = reinterpret_cast<const numeric*>(&((new numeric(3))->setflag(status_flags::dynallocated)));
349                 _num4_p   = reinterpret_cast<const numeric*>(&((new numeric(4))->setflag(status_flags::dynallocated)));
350                 _num5_p   = reinterpret_cast<const numeric*>(&((new numeric(5))->setflag(status_flags::dynallocated)));
351                 _num6_p   = reinterpret_cast<const numeric*>(&((new numeric(6))->setflag(status_flags::dynallocated)));
352                 _num7_p   = reinterpret_cast<const numeric*>(&((new numeric(7))->setflag(status_flags::dynallocated)));
353                 _num8_p   = reinterpret_cast<const numeric*>(&((new numeric(8))->setflag(status_flags::dynallocated)));
354                 _num9_p   = reinterpret_cast<const numeric*>(&((new numeric(9))->setflag(status_flags::dynallocated)));
355                 _num10_p  = reinterpret_cast<const numeric*>(&((new numeric(10))->setflag(status_flags::dynallocated)));
356                 _num11_p  = reinterpret_cast<const numeric*>(&((new numeric(11))->setflag(status_flags::dynallocated)));
357                 _num12_p  = reinterpret_cast<const numeric*>(&((new numeric(12))->setflag(status_flags::dynallocated)));
358                 _num15_p  = reinterpret_cast<const numeric*>(&((new numeric(15))->setflag(status_flags::dynallocated)));
359                 _num18_p  = reinterpret_cast<const numeric*>(&((new numeric(18))->setflag(status_flags::dynallocated)));
360                 _num20_p  = reinterpret_cast<const numeric*>(&((new numeric(20))->setflag(status_flags::dynallocated)));
361                 _num24_p  = reinterpret_cast<const numeric*>(&((new numeric(24))->setflag(status_flags::dynallocated)));
362                 _num25_p  = reinterpret_cast<const numeric*>(&((new numeric(25))->setflag(status_flags::dynallocated)));
363                 _num30_p  = reinterpret_cast<const numeric*>(&((new numeric(30))->setflag(status_flags::dynallocated)));
364                 _num48_p  = reinterpret_cast<const numeric*>(&((new numeric(48))->setflag(status_flags::dynallocated)));
365                 _num60_p  = reinterpret_cast<const numeric*>(&((new numeric(60))->setflag(status_flags::dynallocated)));
366                 _num120_p = reinterpret_cast<const numeric*>(&((new numeric(120))->setflag(status_flags::dynallocated)));
367         }
368 }
369
370
371 /** Dtor of static initialization helpers.  The last call to this is going
372  *  to shut down the library, the others do nothing. */
373 library_init::~library_init()
374 {
375         if (--count==0) {
376                 // In theory, we would have to clean up here.  But since we were
377                 // only initializing memory in the ctor and that memory is reclaimed
378                 // anyways by the OS when the program exits, we skip this.
379         }
380 }
381
382 // comment skeleton for header files
383
384
385 // member functions
386
387         // default ctor, dtor, copy ctor, assignment operator and helpers
388         // none
389
390         // other ctors
391         // none
392
393         // functions overriding virtual functions from base classes
394         // none
395         
396         // new virtual functions which can be overridden by derived classes
397         // none
398
399         // non-virtual functions in this class
400         // none
401
402 // member variables
403 // none
404         
405
406
407 // comment skeleton for implementation files
408
409
410 //////////
411 // default ctor, dtor, copy ctor, assignment operator and helpers
412 //////////
413
414 // public
415 // protected
416
417 //////////
418 // other ctors
419 //////////
420
421 // public
422 // none
423
424 //////////
425 // functions overriding virtual functions from base classes
426 //////////
427
428 // public
429 // protected
430 // none
431
432 //////////
433 // new virtual functions which can be overridden by derived classes
434 //////////
435
436 // public
437 // protected
438 // none
439
440 //////////
441 // non-virtual functions in this class
442 //////////
443
444 // public
445 // protected
446 // none
447
448 //////////
449 // static member variables
450 //////////
451
452 // protected
453 // private
454 // none
455
456
457 } // namespace GiNaC