| 42 | 
  | 
#ifndef UTILS_BITSET_HPP | 
| 43 | 
  | 
#define UTILS_BITSET_HPP | 
| 44 | 
  | 
 | 
| 45 | 
+ | 
#include <iostream> | 
| 46 | 
  | 
#include <functional> | 
| 47 | 
  | 
#include <vector> | 
| 48 | 
  | 
namespace oopse { | 
| 56 | 
  | 
        /** */ | 
| 57 | 
  | 
        BitSet() {} | 
| 58 | 
  | 
        /** */ | 
| 59 | 
< | 
        BitSet(int nbits) {  bitset_.resize(nbits);  } | 
| 59 | 
> | 
        BitSet(int nbits) : bitset_(nbits) {clearAll(); } | 
| 60 | 
  | 
 | 
| 61 | 
  | 
        /** Returns the number of bits set to true in this BitSet.  */ | 
| 62 | 
  | 
        int countBits(); | 
| 81 | 
  | 
 | 
| 82 | 
  | 
        /** Returns true if no bits are set to true */ | 
| 83 | 
  | 
        bool none(); | 
| 84 | 
+ | 
 | 
| 85 | 
+ | 
        int firstOffBit() { return !bitset_[0] ? 0 : nextOffBit(0); } | 
| 86 | 
  | 
         | 
| 87 | 
  | 
        /** Returns the index of the first bit that is set to false that occurs on or after the specified starting index.*/ | 
| 88 | 
< | 
        int nextOffBit(int fromIndex);  | 
| 89 | 
< | 
          | 
| 88 | 
> | 
        int nextOffBit(int fromIndex) const;  | 
| 89 | 
> | 
 | 
| 90 | 
> | 
        int firstOnBit() { return bitset_[0] ? 0 : nextOnBit(0); } | 
| 91 | 
> | 
         | 
| 92 | 
  | 
        /** Returns the index of the first bit that is set to true that occurs on or after the specified starting index. */ | 
| 93 | 
< | 
        int nextOnBit(int fromIndex);  | 
| 93 | 
> | 
        int nextOnBit(int fromIndex) const;  | 
| 94 | 
  | 
         | 
| 95 | 
  | 
        /** Performs a logical AND of this target bit set with the argument bit set. */ | 
| 96 | 
  | 
        void andOperator (const BitSet& bs); | 
| 110 | 
  | 
        void setRangeOff(int fromIndex, int toIndex) {  setBits(fromIndex, toIndex, false);  }         | 
| 111 | 
  | 
 | 
| 112 | 
  | 
        /** Sets all of the bits in this BitSet to false. */ | 
| 113 | 
< | 
        void clear() {  setRangeOff(0, size());  }          | 
| 113 | 
> | 
        void clearAll() {  setRangeOff(0, size());  }          | 
| 114 | 
> | 
 | 
| 115 | 
> | 
        void setAll() {  setRangeOn(0, size());  }         | 
| 116 | 
  | 
         | 
| 117 | 
  | 
        /** Returns the number of bits of space actually in use by this BitSet to represent bit values. */ | 
| 118 | 
  | 
        int size() const {  return bitset_.size();  } | 
| 119 | 
  | 
 | 
| 120 | 
  | 
        /** Changes the size of BitSet*/ | 
| 121 | 
< | 
        void resize(int nbits) {  bitset_.resize(nbits);  } | 
| 121 | 
> | 
        void resize(int nbits); | 
| 122 | 
  | 
         | 
| 123 | 
  | 
        BitSet& operator&= (const BitSet &bs) {  andOperator (bs); return *this; } | 
| 124 | 
  | 
        BitSet& operator|= (const BitSet &bs) { orOperator (bs); return *this; } | 
| 125 | 
  | 
        BitSet& operator^= (const BitSet &bs) { xorOperator (bs); return *this; } | 
| 126 | 
< | 
        bool operator[] (int bitIndex) {  return bitset_[bitIndex];  } | 
| 120 | 
< | 
 | 
| 126 | 
> | 
        bool operator[] (int bitIndex)  const {  return bitset_[bitIndex];  } | 
| 127 | 
  | 
        friend BitSet operator| (const BitSet& bs1, const BitSet& bs2); | 
| 128 | 
  | 
        friend BitSet operator& (const BitSet& bs1, const BitSet& bs2); | 
| 129 | 
  | 
        friend BitSet operator^ (const BitSet& bs1, const BitSet& bs2); |