- switched to automake build environment
[ginac.git] / ginac / utils.h
1 /** @file utils.h
2  *
3  *  Interface to several small and furry utilities. */
4
5 #ifndef _UTILS_H_
6 #define _UTILS_H_
7
8 #include <strstream>
9 #include <string>
10 #include "config.h"
11
12 template<class T>
13 string ToString(T const & t)
14 {
15     char buf[256];
16     ostrstream(buf,sizeof(buf)) << t << ends;
17     return buf;
18 }
19
20 unsigned log2(unsigned n);
21
22 int compare_pointers(void const * a, void const * b);
23
24 #define DYNCONSTCAST(FINALTYPE,BASICTYPE,EXPRESSION) \
25     dynamic_cast<FINALTYPE>(const_cast<BASICTYPE>(EXPRESSION))
26
27 // modified from stl_algo.h: always do com(*first1,*first2) instead of comp(*first2,*first1)
28 template <class InputIterator1, class InputIterator2, class OutputIterator,
29           class Compare>
30 OutputIterator mymerge(InputIterator1 first1, InputIterator1 last1,
31                        InputIterator2 first2, InputIterator2 last2,
32                        OutputIterator result, Compare comp) {
33   while (first1 != last1 && first2 != last2) {
34     if (comp(*first1, *first2)) {
35       *result = *first1;
36       ++first1;
37     }
38     else {
39       *result = *first2;
40       ++first2;
41     }
42     ++result;
43   }
44   return copy(first2, last2, copy(first1, last1, result));
45 }
46
47 // like merge(), but three lists with *last2<*first3
48 template <class InputIterator1, class InputIterator2, class InputIterator3,
49           class OutputIterator, class Compare>
50 OutputIterator mymerge3(InputIterator1 first1, InputIterator1 last1,
51                         InputIterator2 first2, InputIterator2 last2,
52                         InputIterator3 first3, InputIterator3 last3,
53                         OutputIterator result, Compare comp) {
54   while (first1 != last1 && first2 != last2) {
55     if (comp(*first1, *first2)) {
56       *result = *first1;
57       ++first1;
58     }
59     else {
60       *result = *first2;
61       ++first2;
62     }
63     ++result;
64   }
65
66   if (first1==last1) {
67     // list1 empty, copy rest of list2, then list3
68     return copy(first3, last3, copy(first2, last2, result));
69   } else {
70     // list2 empty, merge rest of list1 with list3
71     return mymerge(first1,last1,first3,last3,result,comp);
72   }
73 }
74
75 #endif // ndef _UTILS_H_