From: nvalimak Date: Fri, 29 May 2009 14:33:54 +0000 (+0000) Subject: Added FILE* functionality X-Git-Url: http://git.nguyen.vg/gitweb/?p=SXSI%2FTextCollection.git;a=commitdiff_plain;h=f3f5b4a7e58ca81c9542ac50f0103af37f13f662 Added FILE* functionality git-svn-id: svn+ssh://idea.nguyen.vg/svn/sxsi/trunk/TextCollection@414 3cdefd35-fc62-479d-8e8d-bae585ffb9ca --- diff --git a/incbwt/bits/bitbuffer.h b/incbwt/bits/bitbuffer.h index 1da3fab..1579622 100644 --- a/incbwt/bits/bitbuffer.h +++ b/incbwt/bits/bitbuffer.h @@ -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::GenericBitBuffer(std::ifstream& file, usint _items, usin file.read((char*)this->data, this->size * sizeof(Data)); } +template +GenericBitBuffer::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 GenericBitBuffer::GenericBitBuffer(Data* buffer, usint words) : size(words), @@ -433,6 +450,14 @@ GenericBitBuffer::writeBuffer(std::ofstream& file, bool erase) this->reset(erase); } +template +void +GenericBitBuffer::writeBuffer(std::FILE* file, bool erase) +{ + std::fwrite(this->data, sizeof(Data), this->size, file); + this->reset(erase); +} + template void GenericBitBuffer::readBuffer(std::ifstream& file, usint words, bool erase) diff --git a/incbwt/bits/bitvector.cpp b/incbwt/bits/bitvector.cpp index b76fa9d..b2ed324 100644 --- a/incbwt/bits/bitvector.cpp +++ b/incbwt/bits/bitvector.cpp @@ -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 diff --git a/incbwt/bits/bitvector.h b/incbwt/bits/bitvector.h index fb3db90..486aefb 100644 --- a/incbwt/bits/bitvector.h +++ b/incbwt/bits/bitvector.h @@ -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); //-------------------------------------------------------------------------- diff --git a/incbwt/bits/deltavector.cpp b/incbwt/bits/deltavector.cpp index 4aa02a1..a543f6b 100644 --- a/incbwt/bits/deltavector.cpp +++ b/incbwt/bits/deltavector.cpp @@ -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) diff --git a/incbwt/bits/deltavector.h b/incbwt/bits/deltavector.h index e0692d6..28334fe 100644 --- a/incbwt/bits/deltavector.h +++ b/incbwt/bits/deltavector.h @@ -32,6 +32,7 @@ class DeltaVector : public BitVector { public: DeltaVector(std::ifstream& file); + DeltaVector(std::FILE * file); DeltaVector(DeltaEncoder& encoder, usint universe_size); ~DeltaVector();