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);
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),
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)
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),
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
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);
//--------------------------------------------------------------------------
BitVector(file)
{
}
+DeltaVector::DeltaVector(std::FILE * file) :
+ BitVector(file)
+{
+}
+
DeltaVector::DeltaVector(DeltaEncoder& encoder, usint universe_size) :
BitVector(encoder, universe_size)
{
public:
DeltaVector(std::ifstream& file);
+ DeltaVector(std::FILE * file);
DeltaVector(DeltaEncoder& encoder, usint universe_size);
~DeltaVector();