Added FILE* functionality
[SXSI/TextCollection.git] / incbwt / bits / bitbuffer.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)