6 #include "misc/utils.h"
13 SASamples::SASamples(std::ifstream& sample_file, usint sample_rate) :
16 this->indexes = new DeltaVector(sample_file);
18 this->size = indexes->getSize();
19 this->items = indexes->getNumberOfItems();
20 this->integer_bits = length(this->items - 1);
22 this->samples = new FastBitBuffer(sample_file, this->items, this->integer_bits);
23 this->buildInverseSamples();
26 SASamples::SASamples(usint* array, usint data_size, usint sample_rate) :
30 this->items = (this->size - 1) / this->rate + 1;
31 this->integer_bits = length(this->items - 1);
33 this->samples = new FastBitBuffer(this->items, this->integer_bits);
34 DeltaEncoder encoder(SASamples::BLOCK_SIZE);
35 for(usint i = 0; i < this->size; i++)
37 if(array[i] % rate == 0)
40 this->samples->writeItem(array[i] / sample_rate);
43 this->indexes = new DeltaVector(encoder, this->size);
45 this->buildInverseSamples();
48 SASamples::SASamples(SASamples& index, SASamples& increment, usint* positions, usint number_of_positions) :
50 size(index.size + increment.size),
51 items(index.items + increment.items)
53 this->mergeSamples(index, increment, positions, number_of_positions);
57 index.inverse_samples = 0;
58 increment.indexes = 0;
59 increment.samples = 0;
60 increment.inverse_samples = 0;
62 this->buildInverseSamples();
65 SASamples::~SASamples()
69 delete this->inverse_samples;
73 SASamples::writeTo(std::ofstream& sample_file)
75 this->indexes->writeTo(sample_file);
76 this->samples->writeBuffer(sample_file, false);
79 //--------------------------------------------------------------------------
82 SASamples::inverseSA(usint value)
84 if(value >= this->size) { return this->size; }
85 usint i = this->inverse_samples->readItem(value / this->rate);
86 return this->indexes->select(i);
90 SASamples::getFirstSampleAfter(usint index)
92 if(index >= this->size) { return pair_type(this->size, this->size); }
94 return this->indexes->valueAfter(index);
97 //--------------------------------------------------------------------------
100 SASamples::reportSize()
102 usint bytes = sizeof(*this) - sizeof(this->indexes);
103 bytes += this->indexes->reportSize();
104 bytes += this->samples->reportSize();
105 bytes += this->inverse_samples->reportSize();
109 //--------------------------------------------------------------------------
112 SASamples::buildInverseSamples()
114 this->inverse_samples = new FastBitBuffer(this->items, this->integer_bits);
115 this->samples->goToItem(0);
116 for(usint i = 0; i < this->items; i++)
118 this->inverse_samples->goToItem(this->samples->readItem());
119 this->inverse_samples->writeItem(i);
124 //--------------------------------------------------------------------------
128 SASamples::mergeSamples(SASamples& index, SASamples& increment, usint* positions, usint n)
130 DeltaVector* first = index.indexes;
131 DeltaVector* second = increment.indexes;
132 FastBitBuffer* first_samples = index.samples;
133 FastBitBuffer* second_samples = increment.samples;
135 usint first_bit = first->select(0);
136 bool first_finished = false;
137 usint second_bit = second->select(0);
138 usint sum = index.items;
139 first_samples->goToItem(0);
140 second_samples->goToItem(0);
142 DeltaEncoder encoder(SASamples::BLOCK_SIZE);
143 this->integer_bits = length(this->items - 1);
144 this->samples = new FastBitBuffer(this->items, this->integer_bits);
145 for(usint i = 0; i < n; i++, first_bit++)
147 while(!first_finished && first_bit < positions[i])
149 encoder.setBit(first_bit);
150 this->samples->writeItem(first_samples->readItem());
153 first_bit = first->selectNext() + i;
157 first_finished = true;
161 if(i == second_bit) // positions[i] is one
163 encoder.setBit(positions[i]);
164 this->samples->writeItem(second_samples->readItem() + sum);
165 second_bit = second->selectNext();
169 while(!first_finished)
171 encoder.setBit(first_bit);
172 this->samples->writeItem(first_samples->readItem());
173 if(!first->hasNext()) { break; }
174 first_bit = first->selectNext() + n;
177 delete index.indexes;
178 delete index.samples;
179 delete index.inverse_samples;
180 delete increment.indexes;
181 delete increment.samples;
182 delete increment.inverse_samples;
184 this->indexes = new DeltaVector(encoder, size);