LZ index support
[SXSI/TextCollection.git] / incbwt / bits / bitbuffer.h
index 572fa8a..1579622 100644 (file)
@@ -5,6 +5,7 @@
 #include <cstdlib>
 #include <fstream>
 #include <iostream>
+#include <cstring>  // defines std::memset, added by Kim
 
 #include "../misc/definitions.h"
 
@@ -21,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);
 
@@ -387,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),
@@ -432,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)