Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

PhxBitVector.h

Go to the documentation of this file.
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); // allocates buffer to fit bitCount bits
00036     explicit BitVector(const uint8_t* buffer, Bits bitCount); // incurs copy
00037     virtual ~BitVector();
00038 
00039     // copy / assignment
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     //    uint32_t uintBitsField(Bits bitIndex, Bits numBits);
00207 
00217     //    int32_t intBitsField(Bits bitIndex, Bits numBits);
00218 
00224     bool boolField(Bits bitIndex) const;
00225 
00247     //BitVector bitVectorField(Bits bitIndex);
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     //    void uintBitsField(Bits bitIndex, Bits numBits, uint32_t value);
00261     //    void intBitsField(Bits bitIndex, Bits numBits, int32_t value);
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     // no copy or assignment
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     // no copy or assignment
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 }; // namespace Phx
00647 
00648 #endif /* PHX_BITVECTOR_H */

Generated on Mon Jul 10 19:45:28 2006 for Phoenix OSFS by  doxygen 1.4.2