00001
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
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