Added SWCSA
[SXSI/TextCollection.git] / incbwt / sasamples.h
1 #ifndef SASAMPLES_H
2 #define SASAMPLES_H
3
4 #include <fstream>
5
6 #include "misc/definitions.h"
7 #include "bits/bitbuffer.h"
8 #include "bits/deltavector.h"
9
10
11 namespace CSA
12 {
13
14
15 class SASamples
16 {
17   public:
18     const static usint BLOCK_SIZE = 16;
19
20     SASamples(std::ifstream& sample_file, usint sample_rate);
21     SASamples(usint* array, usint data_size, usint sample_rate);
22     ~SASamples();
23
24     // Destroys contents of index and increment.
25     // We assume index and increment have same sample rate.
26     SASamples(SASamples& index, SASamples& increment, usint* positions, usint number_of_positions);
27
28     void writeTo(std::ofstream& sample_file);
29
30     // Returns i such that SA[i] = value.
31     // If SA[i] is not sampled, returns the next sampled value. (Don't try!)
32     // Value is actual 0-based suffix array value.
33     // Returns size if value is too large.
34     usint inverseSA(usint value);
35
36     // Returns the value of ith sample in suffix array order.
37     inline usint getSample(usint i)
38     {
39       return std::min(this->samples->readItem(i) * this->rate, this->size - 1);
40     }
41
42     // Returns (ind, sample number) where ind >= index or (size, ???).
43     pair_type getFirstSampleAfter(usint index);
44
45     inline usint getSampleRate() { return this->rate; }
46     inline usint getNumberOfSamples() { return this->items; }
47
48     usint reportSize();
49
50   private:
51     usint integer_bits;
52     usint rate, size, items;
53
54     DeltaVector* indexes;
55
56     FastBitBuffer* samples;
57     FastBitBuffer* inverse_samples;
58
59     void buildInverseSamples();
60
61     // Note: contents of original samples are deleted.
62     void mergeSamples(SASamples& index, SASamples& increment, usint* positions, usint n);
63 };
64
65
66 } // namespace CSA
67
68
69 #endif // SASAMPLES_H