00001 #ifndef PHX_BITVECTOR_H
00002 #define PHX_BITVECTOR_H
00003
00004 #include <Phx/PhxConfig.h>
00005 #include <Phx/PhxTypes.h>
00006 #include <fstream>
00007
00015 namespace Phx {
00016
00025 class BitVector {
00026 public:
00027 typedef uint32_t Bits;
00028 typedef uint32_t Bytes;
00029
00030 class InputStream;
00031 class OutputStream;
00032 class InputFile;
00033 class OutputFile;
00034
00035 explicit BitVector(Bits bitCount = 16);
00036 explicit BitVector(const uint8_t* buffer, Bits bitCount);
00037 virtual ~BitVector();
00038
00039
00040 BitVector(const BitVector&);
00041 const BitVector& operator=(const BitVector&);
00042
00047 uint8_t* data() { return mData; }
00048 const uint8_t* data() const { return mData; }
00049
00059 Bits bitCount() const { return mBitCount; }
00060
00080 void bitCount(Bits bitCount);
00081
00090 Bytes byteCount(void) const { return (bitCount() + 7) >> 3; }
00091
00104 Bytes dataSize(void) const { return mDataSize; }
00105
00117 void dataSize(Bytes dataSize);
00118
00124 String stringField(Bits bitIndex) const;
00125
00131 double doubleField(Bits bitIndex) const;
00132
00138 float floatField(Bits bitIndex) const;
00139
00145 uint64_t uint64Field(Bits bitIndex) const;
00146
00152 uint32_t uint32Field(Bits bitIndex) const;
00153
00159 uint16_t uint16Field(Bits bitIndex) const;
00160
00166 uint8_t uint8Field(Bits bitIndex) const;
00167
00173 int64_t int64Field(Bits bitIndex) const { return (int64_t)uint64Field(bitIndex); }
00174
00180 int32_t int32Field(Bits bitIndex) const { return (int32_t)uint32Field(bitIndex); }
00181
00187 int16_t int16Field(Bits bitIndex) const { return (int16_t)uint16Field(bitIndex); }
00188
00194 int8_t int8Field(Bits bitIndex) const { return (int8_t)uint8Field(bitIndex); }
00195
00206
00207
00217
00218
00224 bool boolField(Bits bitIndex) const;
00225
00247
00248
00249 void stringField(Bits bitIndex, const String& value);
00250 void doubleField(Bits bitIndex, double value);
00251 void floatField(Bits bitIndex, float value);
00252 void uint64Field(Bits bitIndex, uint64_t value);
00253 void uint32Field(Bits bitIndex, uint32_t value);
00254 void uint16Field(Bits bitIndex, uint16_t value);
00255 void uint8Field(Bits bitIndex, uint8_t value);
00256 void int64Field(Bits bitIndex, int64_t value) { uint64Field(bitIndex, (uint64_t)value); }
00257 void int32Field(Bits bitIndex, int32_t value) { uint32Field(bitIndex, (uint32_t)value); }
00258 void int16Field(Bits bitIndex, int16_t value) { uint16Field(bitIndex, (uint16_t)value); }
00259 void int8Field(Bits bitIndex, int8_t value) { uint8Field(bitIndex, (uint8_t)value); }
00260
00261
00262 void boolField(Bits bitIndex, bool value);
00263
00264 private:
00265 void resizeBuffer(Bits bitCount);
00266
00267 uint8_t* mData;
00268 Bytes mDataSize;
00269
00270 Bits mBitCount;
00271 };
00272
00273
00282 class BitVector::InputStream {
00283 public:
00292 InputStream(const BitVector* bitVector) :
00293 mBitVector(bitVector), mReadIndex(0) {
00294 if (!mBitVector) {
00295 std::clog << "BitVector::InputStream: NULL bit vector." << std::endl;
00296 throw RangeException();
00297 }
00298 }
00299
00304 const BitVector& bitVector(void) const { return *mBitVector; }
00305
00310 Bits readIndex(void) const { return mReadIndex; }
00311
00320 void readIndex(Bits readIndex) { mReadIndex = readIndex; }
00321
00329 bool endOfStream(void) { return mReadIndex >= mBitVector->bitCount(); }
00330
00331
00332 InputStream& operator>>(String& s) {
00333 s = mBitVector->stringField(mReadIndex);
00334 mReadIndex += sizeof(char) * 8 * (s.size()+1);
00335 return *this;
00336 }
00337
00338 InputStream& operator>>(double& s) {
00339 s = mBitVector->doubleField(mReadIndex);
00340 mReadIndex += sizeof(double)*8;
00341 return *this;
00342 }
00343
00344 InputStream& operator>>(float& s) {
00345 s = mBitVector->floatField(mReadIndex);
00346 mReadIndex += sizeof(float)*8;
00347 return *this;
00348 }
00349
00350 InputStream& operator>>(uint64_t& s) {
00351 s = mBitVector->uint64Field(mReadIndex);
00352 mReadIndex += sizeof(uint64_t)*8;
00353 return *this;
00354 }
00355
00356 InputStream& operator>>(uint32_t& s) {
00357 s = mBitVector->uint32Field(mReadIndex);
00358 mReadIndex += sizeof(uint32_t)*8;
00359 return *this;
00360 }
00361
00362 InputStream& operator>>(uint16_t& s) {
00363 s = mBitVector->uint16Field(mReadIndex);
00364 mReadIndex += sizeof(uint16_t)*8;
00365 return *this;
00366 }
00367
00368 InputStream& operator>>(uint8_t& s) {
00369 s = mBitVector->uint8Field(mReadIndex);
00370 mReadIndex += sizeof(uint8_t)*8;
00371 return *this;
00372 }
00373
00374 InputStream& operator>>(int64_t& s) {
00375 s = mBitVector->int64Field(mReadIndex);
00376 mReadIndex += sizeof(int64_t)*8;
00377 return *this;
00378 }
00379
00380 InputStream& operator>>(int32_t& s) {
00381 s = mBitVector->int32Field(mReadIndex);
00382 mReadIndex += sizeof(int32_t)*8;
00383 return *this;
00384 }
00385
00386 InputStream& operator>>(int16_t& s) {
00387 s = mBitVector->int16Field(mReadIndex);
00388 mReadIndex += sizeof(int16_t)*8;
00389 return *this;
00390 }
00391
00392 InputStream& operator>>(int8_t& s) {
00393 s = mBitVector->int8Field(mReadIndex);
00394 mReadIndex += sizeof(int8_t)*8;
00395 return *this;
00396 }
00397
00398 InputStream& operator>>(bool& s) {
00399 s = mBitVector->boolField(mReadIndex);
00400 mReadIndex += 1;
00401 return *this;
00402 }
00403
00404 private:
00405 const BitVector* mBitVector;
00406 Bits mReadIndex;
00407
00408
00409 InputStream(InputStream& is);
00410 InputStream& operator=(InputStream&);
00411 };
00412
00421 class BitVector::OutputStream {
00422 public:
00431 OutputStream(BitVector* bitVector) :
00432 mBitVector(bitVector), mWriteIndex(0) {
00433 if (!mBitVector) {
00434 std::clog << "BitVector::OutputStream: NULL bit vector." << std::endl;
00435 throw RangeException();
00436 }
00437 }
00438
00443 BitVector& bitVector(void) { return *mBitVector; }
00444
00449 Bits writeIndex(void) const { return mWriteIndex; }
00450
00459 void writeIndex(Bits writeIndex) { mWriteIndex = writeIndex; }
00460
00461
00462 OutputStream& operator<<(const String& s) {
00463 mBitVector->stringField(mWriteIndex,s);
00464 mWriteIndex += sizeof(char) * 8 * (s.size()+1);
00465 return *this;
00466 }
00467
00468 OutputStream& operator<<(double s) {
00469 mBitVector->doubleField(mWriteIndex,s);
00470 mWriteIndex += sizeof(double)*8;
00471 return *this;
00472 }
00473
00474 OutputStream& operator<<(float s) {
00475 mBitVector->floatField(mWriteIndex,s);
00476 mWriteIndex += sizeof(float)*8;
00477 return *this;
00478 }
00479
00480 OutputStream& operator<<(uint64_t s) {
00481 mBitVector->uint64Field(mWriteIndex,s);
00482 mWriteIndex += sizeof(uint64_t)*8;
00483 return *this;
00484 }
00485
00486 OutputStream& operator<<(uint32_t s) {
00487 mBitVector->uint32Field(mWriteIndex,s);
00488 mWriteIndex += sizeof(uint32_t)*8;
00489 return *this;
00490 }
00491
00492 OutputStream& operator<<(uint16_t s) {
00493 mBitVector->uint16Field(mWriteIndex,s);
00494 mWriteIndex += sizeof(uint16_t)*8;
00495 return *this;
00496 }
00497
00498 OutputStream& operator<<(uint8_t s) {
00499 mBitVector->uint8Field(mWriteIndex,s);
00500 mWriteIndex += sizeof(uint8_t)*8;
00501 return *this;
00502 }
00503
00504 OutputStream& operator<<(int64_t s) {
00505 mBitVector->int64Field(mWriteIndex,s);
00506 mWriteIndex += sizeof(int64_t)*8;
00507 return *this;
00508 }
00509
00510 OutputStream& operator<<(int32_t s) {
00511 mBitVector->int32Field(mWriteIndex,s);
00512 mWriteIndex += sizeof(int32_t)*8;
00513 return *this;
00514 }
00515
00516 OutputStream& operator<<(int16_t s) {
00517 mBitVector->int16Field(mWriteIndex,s);
00518 mWriteIndex += sizeof(int16_t)*8;
00519 return *this;
00520 }
00521
00522 OutputStream& operator<<(int8_t s) {
00523 mBitVector->int8Field(mWriteIndex,s);
00524 mWriteIndex += sizeof(int8_t)*8;
00525 return *this;
00526 }
00527
00528 OutputStream& operator<<(bool s) {
00529 mBitVector->boolField(mWriteIndex,s);
00530 mWriteIndex += 1;
00531 return *this;
00532 }
00533
00534 private:
00535 BitVector* mBitVector;
00536 Bits mWriteIndex;
00537
00538
00539 OutputStream(OutputStream& is);
00540 OutputStream& operator=(OutputStream&);
00541 };
00542
00546 class BitVector::InputFile {
00547 public:
00557 InputFile(const String& fileName);
00558
00562 virtual ~InputFile();
00563
00578 BitVector newBitVector(void);
00579
00588 uint32_t bitVectorCount(void) const { return mBitVectorCount; }
00589
00597 uint32_t bitVectorCountMax(void) const { return mBitVectorCountMax; }
00598
00599 private:
00600 std::ifstream mFile;
00601 uint32_t mBitVectorCount;
00602 uint32_t mBitVectorCountMax;
00603 };
00604
00608 class BitVector::OutputFile {
00609 public:
00610
00620 OutputFile(const String& fileName);
00621
00625 virtual ~OutputFile();
00626
00631 void newBitVector(const BitVector& bitVector);
00632
00639 uint32_t bitVectorCount(void) const { return mBitVectorCount; }
00640
00641 private:
00642 std::ofstream mFile;
00643 uint32_t mBitVectorCount;
00644 };
00645
00646 };
00647
00648 #endif