vtf-logo

BitVec.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 #ifndef _included_BitVec_h
00004 #define _included_BitVec_h
00005 
00011 #include "DAGHDefaults.h"
00012 
00013 #include <cassert>
00014 
00015 #ifndef ByteWidth
00016 #define ByteWidth (8)
00017 #endif
00018 
00019 /* typedef int char BitVecType; */
00020 typedef int BitVecType;
00021 
00022 #ifndef MaxBitVecSlots
00023 #define MaxBitVecSlots (4)
00024 #endif 
00025 
00036 class BitVec
00037   {
00038 
00039    int length;
00040    short int slots;
00041    short int slot_width;
00042    BitVecType bvec[MaxBitVecSlots];
00043 
00044 private:
00045 
00046    inline int GetSlot(const int loc) const
00047         {return loc/slot_width;}
00048    inline int MaskBit(const int loc) const
00049         {return (int)1 << (slot_width-(loc%slot_width)-1);}
00050 
00051 public:
00052 
00053    inline BitVec()
00054         : length(0), slots(0)
00055         {slot_width = (sizeof(BitVecType)*ByteWidth);}
00056 
00059    BitVec(const int len);
00060    BitVec(BitVec const &other)
00061         : length(other.length), slots(other.slots), 
00062        slot_width(other.slot_width)       
00063   { for(register int i=0;i<slots;i++) bvec[i] = other.bvec[i]; }
00064 
00065 
00066    inline ~BitVec() {}
00067 
00069    BitVec const &operator= (BitVec const &other);
00070 
00071    int operator==(BitVec const &other) const;
00072    int operator!=(BitVec const &other) const;
00073    int operator>(BitVec const &other) const;
00074    int operator<(BitVec const &other) const;
00075    int operator>=(BitVec const &other) const;
00076    int operator<=(BitVec const &other) const;
00077 
00078    inline int TestBit(const int loc) const
00079      {
00080        assert(loc >= 0 && loc < length);
00081        return(bvec[GetSlot(loc)] & MaskBit(loc));
00082      }
00083    inline void SetBit(const int loc)
00084      {
00085        assert(loc >= 0 && loc < length);
00086        bvec[GetSlot(loc)] |= MaskBit(loc);
00087      }
00088    inline void UnsetBit(const int loc)
00089      {
00090        assert(loc >= 0 && loc < length);
00091        bvec[GetSlot(loc)] &= ~MaskBit(loc);
00092      }
00093    inline void ToggleBit(const int loc)
00094      {
00095        assert(loc >= 0 && loc < length);
00096        bvec[GetSlot(loc)] ^= MaskBit(loc);
00097      }
00100    void SwapBit(const int loc1, const int loc2);
00101 
00103    int IsolateBit(const int loc, const int num=1) const;
00104 
00105    inline void ResetVec(void)
00106      { register int i; for(i=0;i<slots;i++) bvec[i] = 0;}
00107 
00108    inline void SetVec(void)        
00109      { register int i; for(i=0;i<slots;i++) bvec[i] = (2<<slot_width) - 1; }
00110 
00111 
00112 
00113    inline int GetLength(void) const
00114         {return length;}
00115    inline int GetSlotWidth(void) const
00116         {return slot_width;}
00117    inline int GetSlots(void) const
00118         {return slots;}
00119 
00120   };
00121 
00122 #endif

Generated on Fri Aug 24 13:00:28 2007 for AMROC's Hierachical Data Structures - by  doxygen 1.4.7