| 42 | 
  | 
#ifndef UTILS_BITSET_HPP | 
| 43 | 
  | 
#define UTILS_BITSET_HPP | 
| 44 | 
  | 
 | 
| 45 | 
< | 
#include <functional> | 
| 45 | 
> | 
#include <iostream> | 
| 46 | 
  | 
#include <vector> | 
| 47 | 
  | 
namespace oopse { | 
| 48 | 
  | 
 | 
| 80 | 
  | 
 | 
| 81 | 
  | 
        /** Returns true if no bits are set to true */ | 
| 82 | 
  | 
        bool none(); | 
| 83 | 
+ | 
 | 
| 84 | 
+ | 
        int firstOffBit() { return !bitset_[0] ? 0 : nextOffBit(0); } | 
| 85 | 
  | 
         | 
| 86 | 
  | 
        /** Returns the index of the first bit that is set to false that occurs on or after the specified starting index.*/ | 
| 87 | 
< | 
        int nextOffBit(int fromIndex);  | 
| 88 | 
< | 
          | 
| 87 | 
> | 
        int nextOffBit(int fromIndex) const;  | 
| 88 | 
> | 
 | 
| 89 | 
> | 
        int firstOnBit() { return bitset_[0] ? 0 : nextOnBit(0); } | 
| 90 | 
> | 
         | 
| 91 | 
  | 
        /** Returns the index of the first bit that is set to true that occurs on or after the specified starting index. */ | 
| 92 | 
< | 
        int nextOnBit(int fromIndex);  | 
| 92 | 
> | 
        int nextOnBit(int fromIndex) const;  | 
| 93 | 
  | 
         | 
| 94 | 
  | 
        /** Performs a logical AND of this target bit set with the argument bit set. */ | 
| 95 | 
  | 
        void andOperator (const BitSet& bs); | 
| 122 | 
  | 
        BitSet& operator&= (const BitSet &bs) {  andOperator (bs); return *this; } | 
| 123 | 
  | 
        BitSet& operator|= (const BitSet &bs) { orOperator (bs); return *this; } | 
| 124 | 
  | 
        BitSet& operator^= (const BitSet &bs) { xorOperator (bs); return *this; } | 
| 125 | 
< | 
        bool operator[] (int bitIndex) {  return bitset_[bitIndex];  } | 
| 126 | 
< | 
 | 
| 125 | 
> | 
        BitSet& operator-= (const BitSet &bs) {  | 
| 126 | 
> | 
            BitSet tmp = *this ^ bs; | 
| 127 | 
> | 
            *this &= tmp; | 
| 128 | 
> | 
            return *this; | 
| 129 | 
> | 
        } | 
| 130 | 
> | 
         | 
| 131 | 
> | 
        bool operator[] (int bitIndex)  const {  return bitset_[bitIndex];  } | 
| 132 | 
  | 
        friend BitSet operator| (const BitSet& bs1, const BitSet& bs2); | 
| 133 | 
  | 
        friend BitSet operator& (const BitSet& bs1, const BitSet& bs2); | 
| 134 | 
  | 
        friend BitSet operator^ (const BitSet& bs1, const BitSet& bs2); | 
| 135 | 
+ | 
        friend BitSet operator- (const BitSet& bs1, const BitSet& bs2); | 
| 136 | 
+ | 
         | 
| 137 | 
  | 
        friend bool operator== (const BitSet & bs1, const BitSet &bs2); | 
| 138 | 
  | 
 | 
| 139 | 
  | 
        friend std::istream& operator>> ( std::istream&, const BitSet& bs); | 
| 150 | 
  | 
        std::vector<char> bitset_; | 
| 151 | 
  | 
}; | 
| 152 | 
  | 
 | 
| 142 | 
– | 
template<typename T> | 
| 143 | 
– | 
struct logical_xor :public std::binary_function<T, T, bool> { | 
| 144 | 
– | 
    double operator()(T x, T y) { return x ^ y; } | 
| 145 | 
– | 
}; | 
| 153 | 
  | 
 | 
| 154 | 
  | 
} | 
| 155 | 
  | 
#endif |