Add parenthesis around << (j+len) to avoid
[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 #define WW (W*2)
29 #define Wminusone (W-1)
30
31 #ifndef uchar
32 #define uchar unsigned char
33 #endif
34 #ifndef ulong
35 #define ulong unsigned long
36 #endif
37
38
39 class Tools
40 {
41 private:
42     static time_t startTime;
43 public:
44     static void StartTimer();
45     static double GetTime();
46     static uchar * GetRandomString(unsigned, unsigned, unsigned &);
47     static void PrintBitSequence(ulong *, ulong);
48     static uchar * GetFileContents(char *, ulong =0);
49     static ulong * bp2bitstream(uchar *);
50     static unsigned FloorLog2(ulong);
51     static unsigned CeilLog2(ulong);
52     static unsigned bits (ulong);
53
54     static inline void SetField(ulong *A, register unsigned len, register ulong index, register ulong x) 
55     {
56         ulong i = index * len / W, 
57                  j = index * len - i * W;
58         ulong mask = (j+len < W ? ~0lu << (j+len) : 0) 
59                         | (W-j < W ? ~0lu >> (W-j) : 0);
60         A[i] = (A[i] & mask) | x << j;
61         if (j + len > W) 
62         {
63             mask = ((~0lu) << (len + j - W));  
64             A[i+1] = (A[i+1] & mask)| x >> (W - j);
65         }     
66     }
67     
68     static inline ulong GetField(ulong *A, register unsigned len, register ulong index) 
69     {
70         register ulong i = index * len / W, 
71                        j = index * len - W * i, 
72                        result;
73         if (j + len <= W)
74             result = (A[i] << (W - j - len)) >> (W - len);
75         else 
76         {
77             result = A[i] >> j;
78             result = result | (A[i+1] << (WW - j - len)) >> (W - len);
79         }
80         return result;
81     }
82        
83     
84     static inline ulong GetVariableField(ulong *A, register unsigned len, register ulong index) 
85     {
86        register ulong i=index/W, j=index-W*i, result;
87        if (j+len <= W)
88        result = (A[i] << (W-j-len)) >> (W-len);
89        else {
90              result = A[i] >> j;
91              result = result | (A[i+1] << (WW-j-len)) >> (W-len);
92           }
93        return result;
94     }
95
96     static inline void SetVariableField(ulong *A, register unsigned len, register ulong index, register ulong x) {
97         ulong i=index/W, 
98                     j=index-i*W;
99         ulong mask = (j+len < W ? ~0lu << (j+len) : 0) 
100                         | (W-j < W ? ~0lu >> (W-j) : 0);
101         A[i] = (A[i] & mask) | x << j;
102         if (j+len>W) {
103             mask = ((~0lu) << (len+j-W));  
104             A[i+1] = (A[i+1] & mask)| x >> (W-j);
105         } 
106     }
107
108
109 };
110
111 #endif