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