#include "TextCollection.h"
#include "Tools.h"
+
#include "incbwt/bits/deltavector.h"
+// Re-define word size to ulong:
+#undef W
+#if __WORDSIZE == 64
+# define W 64
+#else
+# define W 32
+#endif
+
#include <cassert>
#include <stdexcept>
virtual ~TextStorage()
{
+ delete offit_;
+ offit_ = 0;
delete offsets_;
- offsets_ = 0;
+ offsets_ = 0;
}
TextCollection::DocId DocIdAtTextPos(TextCollection::TextPosition i) const
{
assert(i < n_);
- return offsets_->rank(i)-1;
+ return offit_->rank(i)-1;
}
TextCollection::TextPosition TextStartPos(TextCollection::DocId i) const
{
assert(i < (TextCollection::DocId)numberOfTexts_);
- return offsets_->select(i);
+ return offit_->select(i);
}
bool IsEndmarker(TextCollection::TextPosition i) const
assert(i < n_);
if (i >= n_ - 1)
return true;
- return offsets_->isSet(i+1);
+ return offit_->isSet(i+1);
}
const static CSA::usint DV_BLOCK_SIZE = 32;
TextStorage(uchar const * text, TextPosition n)
- : n_(n), offsets_(0), numberOfTexts_(0)
+ : n_(n), offsets_(0), offit_(0), numberOfTexts_(0)
{
// Delta encoded bitvector of text offsets.
CSA::DeltaEncoder encoder(DV_BLOCK_SIZE);
offsets_ = new CSA::DeltaVector(encoder, n_);
- numberOfTexts_ = offsets_->rank(n_ - 1);
+ offit_ = new CSA::DeltaVector::Iterator(*(offsets_));
+ numberOfTexts_ = offit_->rank(n_ - 1);
}
TextStorage(std::FILE *);
TextPosition n_;
CSA::DeltaVector *offsets_;
+ CSA::DeltaVector::Iterator *offit_;
TextPosition numberOfTexts_;
};
{
assert(docId < (TextCollection::DocId)numberOfTexts_);
- TextPosition offset = offsets_->select(docId);
+ TextPosition offset = offit_->select(docId);
return &text_[offset];
}
assert(i < (TextCollection::DocId)numberOfTexts_);
assert(j < (TextCollection::DocId)numberOfTexts_);
- TextPosition offset = offsets_->select(i);
+ TextPosition offset = offit_->select(i);
return &text_[offset];
}