Debug swcsa
[SXSI/TextCollection.git] / Tools.h
1 /*
2  * Collection of basic tools and defines
3  */
4
5
6 #ifndef _TOOLS_H_
7 #define _TOOLS_H_
8
9 #include <iostream>
10 #include <fstream>
11 #include <cstdlib>
12 #include <ctime>
13 #include <climits>
14
15 // Generates an error if __WORDSIZE is not defined
16 #ifndef __WORDSIZE
17 #error Missing definition of __WORDSIZE; Please define __WORDSIZE in Tools.h!
18 #endif
19
20 // Check word length on GNU C/C++:
21 // __WORDSIZE should be defined in <bits/wordsize.h>, which is #included from <limits.h>
22 #if __WORDSIZE == 64
23 #   define W 64
24 #else
25 #   define W 32
26 #endif
27
28 #ifndef WW
29 #define WW (W*2)
30 #endif
31
32 #ifndef Wminusone
33 #define Wminusone (W-1)
34 #endif
35
36 #ifndef uchar
37 #define uchar unsigned char
38 #endif
39 #ifndef ulong
40 #define ulong unsigned long
41 #endif
42
43 #define myminofthree(x,y,z) (x)<(y)?((x)<(z)?(x):(z)):(y)<(z)?(y):(z)
44
45
46 class Tools
47 {
48 private:
49     static time_t startTime;
50 public:
51     static void StartTimer();
52     static double GetTime();
53     static uchar * GetRandomString(unsigned, unsigned, unsigned &);
54     static void PrintBitSequence(ulong *, ulong);
55     static uchar * GetFileContents(char *, ulong =0);
56     static ulong * bp2bitstream(uchar *);
57     static unsigned FloorLog2(ulong);
58     static unsigned CeilLog2(ulong);
59     static unsigned bits (ulong);
60
61     static inline void SetField(ulong *A, register unsigned len, register ulong index, register ulong x) 
62     {
63         ulong i = index * len / W, 
64                  j = index * len - i * W;
65         ulong mask = (j+len < W ? ~0lu << (j+len) : 0) 
66                         | (W-j < W ? ~0lu >> (W-j) : 0);
67         A[i] = (A[i] & mask) | x << j;
68         if (j + len > W) 
69         {
70             mask = ((~0lu) << (len + j - W));  
71             A[i+1] = (A[i+1] & mask)| x >> (W - j);
72         }     
73     }
74     
75     static inline ulong GetField(ulong *A, register unsigned len, register ulong index) 
76     {
77         register ulong i = index * len / W, 
78                        j = index * len - W * i, 
79                        result;
80         if (j + len <= W)
81             result = (A[i] << (W - j - len)) >> (W - len);
82         else 
83         {
84             result = A[i] >> j;
85             result = result | (A[i+1] << (WW - j - len)) >> (W - len);
86         }
87         return result;
88     }
89        
90     
91     static inline ulong GetVariableField(ulong *A, register unsigned len, register ulong index) 
92     {
93        register ulong i=index/W, j=index-W*i, result;
94        if (j+len <= W)
95        result = (A[i] << (W-j-len)) >> (W-len);
96        else {
97              result = A[i] >> j;
98              result = result | (A[i+1] << (WW-j-len)) >> (W-len);
99           }
100        return result;
101     }
102
103     static inline void SetVariableField(ulong *A, register unsigned len, register ulong index, register ulong x) {
104         ulong i=index/W, 
105                     j=index-i*W;
106         ulong mask = (j+len < W ? ~0lu << (j+len) : 0) 
107                         | (W-j < W ? ~0lu >> (W-j) : 0);
108         A[i] = (A[i] & mask) | x << j;
109         if (j+len>W) {
110             mask = ((~0lu) << (len+j-W));  
111             A[i+1] = (A[i+1] & mask)| x >> (W-j);
112         } 
113     }
114
115
116 };
117
118 #endif