Added FILE* functionality
authornvalimak <nvalimak@3cdefd35-fc62-479d-8e8d-bae585ffb9ca>
Fri, 29 May 2009 14:33:54 +0000 (14:33 +0000)
committernvalimak <nvalimak@3cdefd35-fc62-479d-8e8d-bae585ffb9ca>
Fri, 29 May 2009 14:33:54 +0000 (14:33 +0000)
git-svn-id: svn+ssh://idea.nguyen.vg/svn/sxsi/trunk/TextCollection@414 3cdefd35-fc62-479d-8e8d-bae585ffb9ca

incbwt/bits/bitbuffer.h
incbwt/bits/bitvector.cpp
incbwt/bits/bitvector.h
incbwt/bits/deltavector.cpp
incbwt/bits/deltavector.h

index 1da3fab..1579622 100644 (file)
@@ -22,11 +22,13 @@ class GenericBitBuffer
     GenericBitBuffer(usint _items, usint item_size);
     GenericBitBuffer(std::ifstream& file, usint words);
     GenericBitBuffer(std::ifstream& file, usint _items, usint item_size);
+    GenericBitBuffer(std::FILE* file, usint _items, usint item_size);
     GenericBitBuffer(Data* buffer, usint words);
     GenericBitBuffer(Data* buffer, usint _items, usint item_size);
     ~GenericBitBuffer();
 
     void writeBuffer(std::ofstream& file, bool erase = true);
+    void writeBuffer(std::FILE * file, bool erase = true);
     void readBuffer(std::ifstream& file, usint words, bool erase = true);
     void setBuffer(Data* buffer, usint words);
 
@@ -388,6 +390,21 @@ GenericBitBuffer<Data>::GenericBitBuffer(std::ifstream& file, usint _items, usin
   file.read((char*)this->data, this->size * sizeof(Data));
 }
 
+template<class Data>
+GenericBitBuffer<Data>::GenericBitBuffer(std::FILE* file, usint _items, usint item_size) :
+  size(BITS_TO_WORDS(_items * item_size)),
+  pos(0),
+  bits(DATA_BITS),
+  item_bits(item_size),
+  items(_items),
+  current(0),
+  free_buffer(true)
+{
+  this->data = new Data[this->size];
+  memset(this->data, 0, this->size * sizeof(Data));
+  std::fread(this->data, sizeof(Data), this->size, file);
+}
+
 template<class Data>
 GenericBitBuffer<Data>::GenericBitBuffer(Data* buffer, usint words) :
   size(words),
@@ -433,6 +450,14 @@ GenericBitBuffer<Data>::writeBuffer(std::ofstream& file, bool erase)
   this->reset(erase);
 }
 
+template<class Data>
+void
+GenericBitBuffer<Data>::writeBuffer(std::FILE* file, bool erase)
+{
+    std::fwrite(this->data, sizeof(Data), this->size, file);
+    this->reset(erase);
+}
+
 template<class Data>
 void
 GenericBitBuffer<Data>::readBuffer(std::ifstream& file, usint words, bool erase)
index b76fa9d..b2ed324 100644 (file)
@@ -26,6 +26,25 @@ BitVector::BitVector(std::ifstream& file) :
   this->indexForSelect();
 }
 
+BitVector::BitVector(std::FILE * file) :
+  rank_index(0), select_index(0)
+{
+    std::fread(&(this->size), sizeof(this->size), 1, file);
+    std::fread(&(this->items), sizeof(this->items), 1, file);
+    std::fread(&(this->number_of_blocks), sizeof(this->number_of_blocks), 1, file);
+    std::fread(&(this->block_size), sizeof(this->block_size), 1, file);
+
+  this->array = new usint[this->block_size * this->number_of_blocks];
+  std::fread(this->array, sizeof(usint), this->block_size * this->number_of_blocks, file);
+  this->buffer = new FastBitBuffer(this->array, this->block_size);
+
+  this->integer_bits = length(this->size);
+  this->samples = new FastBitBuffer(file, 2 * (this->number_of_blocks + 1), this->integer_bits);
+
+  this->indexForRank();
+  this->indexForSelect();
+}
+
 BitVector::BitVector(VectorEncoder& encoder, usint universe_size) :
   size(universe_size), items(encoder.items),
   block_size(encoder.block_size),
@@ -87,6 +106,18 @@ BitVector::writeTo(std::ofstream& file)
   this->samples->writeBuffer(file, false);
 }
 
+void
+BitVector::writeTo(FILE* file)
+{
+    std::fwrite(&(this->size), sizeof(this->size), 1, file);
+    std::fwrite(&(this->items), sizeof(this->items), 1, file);
+    std::fwrite(&(this->number_of_blocks), sizeof(this->number_of_blocks), 1, file);
+    std::fwrite(&(this->block_size), sizeof(this->block_size), 1, file);
+    std::fwrite(this->array, sizeof(usint), this->block_size * this->number_of_blocks, file);
+    this->samples->writeBuffer(file, false);
+}
+
+
 //--------------------------------------------------------------------------
 
 usint
index fb3db90..486aefb 100644 (file)
@@ -59,10 +59,12 @@ class BitVector
     const static usint INDEX_RATE = 5;
 
     BitVector(std::ifstream& file);
+    BitVector(std::FILE* file);
     BitVector(VectorEncoder& encoder, usint universe_size);
     ~BitVector();
 
     void writeTo(std::ofstream& file);
+    void writeTo(std::FILE* file);
 
 //--------------------------------------------------------------------------
 
index 4aa02a1..a543f6b 100644 (file)
@@ -11,6 +11,11 @@ DeltaVector::DeltaVector(std::ifstream& file) :
   BitVector(file)
 {
 }
+DeltaVector::DeltaVector(std::FILE * file) :
+  BitVector(file)
+{
+}
+
 
 DeltaVector::DeltaVector(DeltaEncoder& encoder, usint universe_size) :
   BitVector(encoder, universe_size)
index e0692d6..28334fe 100644 (file)
@@ -32,6 +32,7 @@ class DeltaVector : public BitVector
 {
   public:
     DeltaVector(std::ifstream& file);
+    DeltaVector(std::FILE * file);
     DeltaVector(DeltaEncoder& encoder, usint universe_size);
     ~DeltaVector();