isomatch
dyn_bitset.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <cstdlib>
4 #include <exception>
5 #include <string>
6 
18 class DynBitset {
19  private:
20  typedef long unsigned Word;
21 
22  public:
25  class SizeMismatch : public std::exception {};
26 
27  class Reference {
28  friend class DynBitset;
29  public:
31  Reference& operator=(bool);
33  Reference& operator=(const Reference&);
34 
36  inline bool operator~() const {
37  return ~(*this);
38  }
39 
41  inline operator bool() const {
42  return (*word) & (1lu << pos);
43  }
44 
47  (*word) ^= (1lu << pos);
48  return *this;
49  }
50 
52  inline void set() {
53  (*word) |= (1lu << pos);
54  }
55 
57  void reset() {
58  (*word) &= ~(1lu << pos);
59  }
60 
61  private:
62  Reference(DynBitset::Word* word, size_t pos)
63  : word(word), pos(pos) {}
64 
65  DynBitset::Word* word;
66  size_t pos;
67  };
68  friend class Reference;
69 
70  // === Constructors and default operations ===
71 
73  DynBitset(size_t size);
74  DynBitset(const DynBitset& oth);
75  ~DynBitset();
76  void operator=(const DynBitset& oth);
77  DynBitset& operator=(DynBitset&& oth) = delete;
78  private:
80  DynBitset(size_t size, Word* words);
81  DynBitset(DynBitset&& oth);
82 
83  public:
84  // === Other methods ===
85 
86  inline size_t size() const { return size_; }
87 
89  inline bool operator[](size_t pos) const {
90  return (data[pos/word_size]) & (1lu << (pos % word_size));
91  }
92 
94  Reference operator[](size_t pos);
95 
97  DynBitset& operator &=(const DynBitset& oth);
98 
100  DynBitset& operator|=(const DynBitset& oth);
101 
103  DynBitset& operator^=(const DynBitset& oth);
104 
106  DynBitset& flip();
107 
109  DynBitset operator &(const DynBitset& oth) const;
110 
112  DynBitset operator|(const DynBitset& oth) const;
113 
115  DynBitset operator^(const DynBitset& oth) const;
116 
118  DynBitset operator~() const;
119 
121  void reset();
122 
124  bool any() const;
125 
127  bool anyOver(size_t pos) const;
128 
130 
132  int singleBit() const;
133 
135  std::string dump() const;
136 
137  private:
138  inline void checkSize(const DynBitset& oth) const {
139  if(size_ != oth.size_)
140  throw SizeMismatch();
141  }
142 
143  inline size_t nbWords() const {
144  return (size_ + word_size - 1) / word_size;
145  }
146 
149  int whichBit(Word word, int offset = 0) const;
150 
151  const size_t size_;
152  Word* data;
153 
154  constexpr static size_t word_size = sizeof(Word) * 8;
155 };
Definition: dyn_bitset.h:27
void operator=(const DynBitset &oth)
Definition: dyn_bitset.cpp:53
DynBitset operator&(const DynBitset &oth) const
Bitwise AND of two DynBitsets.
Definition: dyn_bitset.cpp:98
Reference & flip()
In-place flips the bit.
Definition: dyn_bitset.h:46
void reset()
Sets all bits to false.
Definition: dyn_bitset.cpp:125
bool operator~() const
Flips and returns the bit.
Definition: dyn_bitset.h:36
std::string dump() const
Dumps the DynBitset to an hex representation.
Definition: dyn_bitset.cpp:176
int singleBit() const
Checks if a single bit is set.
Definition: dyn_bitset.cpp:164
Definition: dyn_bitset.h:25
DynBitset & operator^=(const DynBitset &oth)
In-place bitwise xor.
Definition: dyn_bitset.cpp:76
DynBitset(size_t size)
size is expressed in bits. Initializes to zeroes.
Definition: dyn_bitset.cpp:23
friend class Reference
Definition: dyn_bitset.h:68
DynBitset & flip()
In-place bitwise flip.
Definition: dyn_bitset.cpp:83
bool operator[](size_t pos) const
Constant bit access operator.
Definition: dyn_bitset.h:89
bool anyOver(size_t pos) const
Checks if any bit above the posth (incl.) is true.
Definition: dyn_bitset.cpp:137
void reset()
Resets the bit (slightly faster than = false)
Definition: dyn_bitset.h:57
~DynBitset()
Definition: dyn_bitset.cpp:49
bool any() const
Checks if any bit is true.
Definition: dyn_bitset.cpp:130
DynBitset & operator&=(const DynBitset &oth)
Definition: dyn_bitset.cpp:62
Definition: dyn_bitset.h:18
DynBitset & operator|=(const DynBitset &oth)
In-place bitwise or.
Definition: dyn_bitset.cpp:69
DynBitset operator^(const DynBitset &oth) const
Bitwise XOR of two DynBitsets.
Definition: dyn_bitset.cpp:112
DynBitset operator~() const
Bitwise flip.
Definition: dyn_bitset.cpp:119
DynBitset operator|(const DynBitset &oth) const
Bitwise OR of two DynBitsets.
Definition: dyn_bitset.cpp:105
size_t size() const
Definition: dyn_bitset.h:86