+ this->samples = sample_buffer.getReadBuffer();
+ this->buildInverseSamples();
+}
+
+SASamples::SASamples(uint* inverse, DeltaVector* end_points, usint data_size, usint sample_rate) :
+ rate(sample_rate),
+ items(0)
+{
+ usint sequences = end_points->getNumberOfItems();
+
+ DeltaVector::Iterator iter(*(end_points));
+
+ // Determine the samples, insert them into a vector, and sort them.
+ usint start = 0, end = iter.select(0); // Closed range in padded collection.
+ usint seq_start = 0, seq_end = end; // Closed range in inverse SA.
+ std::vector<pair_type>* vec = new std::vector<pair_type>();
+ for(usint i = 0; i < sequences; i++)
+ {
+ for(usint j = seq_start; j <= seq_end; j += this->rate)
+ {
+ vec->push_back(pair_type(inverse[j] - sequences - 1, this->items));
+ this->items++;
+ }
+ start = nextMultipleOf(this->rate, end);
+ end = iter.selectNext();
+ seq_start = seq_end + 2;
+ seq_end = seq_start + end - start;
+ }
+ #ifdef MULTITHREAD_SUPPORT
+ #ifdef _GLIBCXX_PARALLEL
+ std::sort(vec->begin(), vec->end(), __gnu_parallel::sequential_tag());
+ #else
+ std::sort(vec->begin(), vec->end(), mcstl::sequential_tag());
+ #endif
+ #else
+ std::sort(vec->begin(), vec->end());
+ #endif
+
+ // Compress the samples.
+ this->integer_bits = length(this->items - 1);
+ this->size = end + 1;
+ WriteBuffer sample_buffer(this->items, this->integer_bits);
+ DeltaEncoder encoder(INDEX_BLOCK_SIZE);
+ for(usint i = 0; i < this->items; i++)
+ {
+ pair_type sample = (*vec)[i];
+ encoder.setBit(sample.first);
+ sample_buffer.writeItem(sample.second);
+ }
+ delete vec;