CluE  1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
dynamicbitset.h
Go to the documentation of this file.
1 #ifndef DYNAMICBITSET_H
2 #define DYNAMICBITSET_H
3 
4 #include <vector>
5 
6 namespace CluE
7 {
8 
15 template<typename T = long long> class DynamicBitset
16 {
17 static_assert(std::is_integral<T>::value, "T has to be an integral type");
18 
19 public:
25  DynamicBitset(unsigned long long numberOfBits);
26 
31  bool operator[](size_t position) const;
32 
39  void set(size_t position, bool value);
40 
44  unsigned long long count();
45 
46 private:
47  const unsigned long long numberOfBits;
48  const int sizeOfT;
49  std::vector<T> bitvector;
50 };
51 
52 
53 template<typename T> DynamicBitset<T>::DynamicBitset(unsigned long long numberOfBits) :
54  numberOfBits(numberOfBits),
55  sizeOfT(sizeof(T) * 8),
56  bitvector(numberOfBits / sizeOfT + (numberOfBits % sizeOfT == 0 ? 0 : 1))
57 {
58 }
59 
60 template<typename T> bool DynamicBitset<T>::operator [](size_t position) const
61 {
62  size_t index = position / sizeOfT;
63  int offset = position % sizeOfT;
64  return (bitvector[index] >> offset) & 1;
65 }
66 
67 template<typename T> void DynamicBitset<T>::set(size_t position, bool value)
68 {
69  size_t index = position / sizeOfT;
70  int offset = position % sizeOfT;
71  if(value)
72  bitvector[index] |= T(1) << offset;
73  else
74  bitvector[index] &= ~(T(1) << offset);
75 }
76 
77 //TODO Improve performance
78 template<typename T> unsigned long long DynamicBitset<T>::count()
79 {
80  unsigned long long setBits = 0;
81  for(unsigned long long i = 0; i < numberOfBits; i++)
82  {
83  if((*this)[i])
84  setBits++;
85  }
86  return setBits;
87 }
88 
89 }
90 
91 #endif
bool operator[](size_t position) const
Read access to the (position+1)-th bit.
Definition: dynamicbitset.h:60
unsigned long long count()
Number of set bits.
Definition: dynamicbitset.h:78
DynamicBitset(unsigned long long numberOfBits)
Constructs a bitset which maintains numberOfBits bits.
Definition: dynamicbitset.h:53
const unsigned long long numberOfBits
Definition: dynamicbitset.h:47
Dynamic bitset similiar to boost::dynamic_bitset.
Definition: dynamicbitset.h:15
void set(size_t position, bool value)
Write access to the (position+1)-th bit.
Definition: dynamicbitset.h:67
std::vector< T > bitvector
Definition: dynamicbitset.h:49