+ // Storage type
+ const static char TYPE_PLAIN_TEXT = 0;
+ const static char TYPE_LZ_INDEX = 1;
+
+ // Call DeleteText() for each pointer returned by GetText()
+ // to avoid possible memory leaks.
+ virtual uchar * GetText(TextCollection::DocId docId) const = 0;
+ virtual uchar * GetText(TextCollection::DocId i, TextCollection::DocId j) const = 0;
+ virtual void DeleteText(uchar *) const = 0;
+
+ static TextStorage * Load(FILE *file);
+ virtual void Save(FILE *file) const = 0;
+
+ virtual ~TextStorage()
+ {
+ delete offsets_;
+ offsets_ = 0;
+ }
+
+ TextCollection::DocId DocIdAtTextPos(TextCollection::TextPosition i) const
+ {
+ assert(i < n_);
+ return offsets_->rank(i)-1;
+ }
+
+ TextCollection::TextPosition TextStartPos(TextCollection::DocId i) const
+ {
+ assert(i < (TextCollection::DocId)numberOfTexts_);
+ return offsets_->select(i);
+ }
+
+ bool IsEndmarker(TextCollection::TextPosition i) const
+ {
+ assert(i < n_);
+ if (i >= n_ - 1)
+ return true;
+ return offsets_->isSet(i+1);
+ }
+
+
+protected: