|
@@ -121,22 +121,19 @@ public:
|
|
|
class Iterator {
|
|
class Iterator {
|
|
|
public:
|
|
public:
|
|
|
Iterator(const Iterator& other) : m_val(other.m_val), m_bit(other.m_bit) {}
|
|
Iterator(const Iterator& other) : m_val(other.m_val), m_bit(other.m_bit) {}
|
|
|
- Iterator(IntTy val, int bit) : m_val(val), m_bit(bit) {}
|
|
|
|
|
|
|
+ Iterator(IntTy val) : m_val(val), m_bit(0) {}
|
|
|
Iterator& operator=(Iterator other) {
|
|
Iterator& operator=(Iterator other) {
|
|
|
new (this) Iterator(other);
|
|
new (this) Iterator(other);
|
|
|
return *this;
|
|
return *this;
|
|
|
}
|
|
}
|
|
|
int operator*() {
|
|
int operator*() {
|
|
|
- return m_bit;
|
|
|
|
|
|
|
+ return m_bit + ComputeLsb();
|
|
|
}
|
|
}
|
|
|
Iterator& operator++() {
|
|
Iterator& operator++() {
|
|
|
- if (m_val == 0) {
|
|
|
|
|
- m_bit = -1;
|
|
|
|
|
- } else {
|
|
|
|
|
- int bit = LeastSignificantSetBit(m_val);
|
|
|
|
|
- m_val &= ~(1 << bit);
|
|
|
|
|
- m_bit = bit;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ int lsb = ComputeLsb();
|
|
|
|
|
+ m_val >>= lsb + 1;
|
|
|
|
|
+ m_bit += lsb + 1;
|
|
|
|
|
+ m_has_lsb = false;
|
|
|
return *this;
|
|
return *this;
|
|
|
}
|
|
}
|
|
|
Iterator operator++(int _) {
|
|
Iterator operator++(int _) {
|
|
@@ -145,15 +142,24 @@ public:
|
|
|
return other;
|
|
return other;
|
|
|
}
|
|
}
|
|
|
bool operator==(Iterator other) const {
|
|
bool operator==(Iterator other) const {
|
|
|
- return m_bit == other.m_bit;
|
|
|
|
|
|
|
+ return m_val == other.m_val;
|
|
|
}
|
|
}
|
|
|
bool operator!=(Iterator other) const {
|
|
bool operator!=(Iterator other) const {
|
|
|
- return m_bit != other.m_bit;
|
|
|
|
|
|
|
+ return m_val != other.m_val;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
private:
|
|
|
|
|
+ int ComputeLsb() {
|
|
|
|
|
+ if (!m_has_lsb) {
|
|
|
|
|
+ m_lsb = LeastSignificantSetBit(m_val);
|
|
|
|
|
+ m_has_lsb = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ return m_lsb;
|
|
|
|
|
+ }
|
|
|
IntTy m_val;
|
|
IntTy m_val;
|
|
|
int m_bit;
|
|
int m_bit;
|
|
|
|
|
+ int m_lsb = -1;
|
|
|
|
|
+ bool m_has_lsb = false;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
BitSet() : m_val(0) {}
|
|
BitSet() : m_val(0) {}
|
|
@@ -221,11 +227,10 @@ public:
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Iterator begin() const {
|
|
Iterator begin() const {
|
|
|
- Iterator it(m_val, 0);
|
|
|
|
|
- return ++it;
|
|
|
|
|
|
|
+ return Iterator(m_val);
|
|
|
}
|
|
}
|
|
|
Iterator end() const {
|
|
Iterator end() const {
|
|
|
- return Iterator(m_val, -1);
|
|
|
|
|
|
|
+ return Iterator(0);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
IntTy m_val;
|
|
IntTy m_val;
|