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
00017 class BitVector {
00018 public:
00019 typedef uint32_t Bits;
00020 typedef uint32_t Bytes;
00021
00022 class InputFile;
00023 class OutputFile;
00024
00025 explicit BitVector(Bits bitCount = 16);
00026 explicit BitVector(const uint8_t* buffer, Bits bitCount);
00027 virtual ~BitVector();
00028
00029
00030 BitVector(const BitVector&);
00031 const BitVector& operator=(const BitVector&);
00032
00037 uint8_t* data() { return mData; }
00038 const uint8_t* data() const { return mData; }
00039
00049 Bits bitCount() const { return mBitCount; }
00050
00070 void bitCount(Bits bitCount);
00071
00080 Bytes byteCount(void) const { return (bitCount() + 7) >> 3; }
00081
00094 Bytes dataSize(void) const { return mDataSize; }
00095
00107 void dataSize(Bytes dataSize);
00108
00121 Bits nextIndex(void) const { return mNextIndex; }
00122
00129 String stringField(Bits bitIndex);
00130
00137 double doubleField(Bits bitIndex);
00138
00145 float floatField(Bits bitIndex);
00146
00153 uint64_t uint64Field(Bits bitIndex);
00154
00161 uint32_t uint32Field(Bits bitIndex);
00162
00169 uint16_t uint16Field(Bits bitIndex);
00170
00177 uint8_t uint8Field(Bits bitIndex);
00178
00185 int64_t int64Field(Bits bitIndex) { return (int64_t)uint64Field(bitIndex); }
00186
00193 int32_t int32Field(Bits bitIndex) { return (int32_t)uint32Field(bitIndex); }
00194
00201 int16_t int16Field(Bits bitIndex) { return (int16_t)uint16Field(bitIndex); }
00202
00209 int8_t int8Field(Bits bitIndex) { return (int8_t)uint8Field(bitIndex); }
00210
00222
00223
00234
00235
00242 bool boolField(Bits bitIndex);
00243
00266
00267
00268 void stringField(Bits bitIndex, const String& value);
00269 void doubleField(Bits bitIndex, double value);
00270 void floatField(Bits bitIndex, float value);
00271 void uint64Field(Bits bitIndex, uint64_t value);
00272 void uint32Field(Bits bitIndex, uint32_t value);
00273 void uint16Field(Bits bitIndex, uint16_t value);
00274 void uint8Field(Bits bitIndex, uint8_t value);
00275 void int64Field(Bits bitIndex, int64_t value) { uint64Field(bitIndex, (uint64_t)value); }
00276 void int32Field(Bits bitIndex, int32_t value) { uint32Field(bitIndex, (uint32_t)value); }
00277 void int16Field(Bits bitIndex, int16_t value) { uint16Field(bitIndex, (uint16_t)value); }
00278 void int8Field(Bits bitIndex, int8_t value) { uint8Field(bitIndex, (uint8_t)value); }
00279
00280
00281 void boolField(Bits bitIndex, bool value);
00282
00283 private:
00284 void resizeBuffer(Bits bitCount);
00285
00286 uint8_t* mData;
00287 Bytes mDataSize;
00288
00289 Bits mBitCount;
00290 Bits mNextIndex;
00291 };
00292
00296 class BitVector::InputFile {
00297 public:
00307 InputFile(const String& fileName);
00308
00312 virtual ~InputFile();
00313
00328 BitVector newBitVector(void);
00329
00338 uint32_t bitVectorCount(void) const { return mBitVectorCount; }
00339
00347 uint32_t bitVectorCountMax(void) const { return mBitVectorCountMax; }
00348
00349 private:
00350 std::ifstream mFile;
00351 uint32_t mBitVectorCount;
00352 uint32_t mBitVectorCountMax;
00353 };
00354
00358 class BitVector::OutputFile {
00359 public:
00360
00370 OutputFile(const String& fileName);
00371
00375 virtual ~OutputFile();
00376
00381 void newBitVector(const BitVector& bitVector);
00382
00389 uint32_t bitVectorCount(void) const { return mBitVectorCount; }
00390
00391 private:
00392 std::ofstream mFile;
00393 uint32_t mBitVectorCount;
00394 };
00395
00396 };
00397
00398 #endif