--- bitfield.h.orig Wed Sep 8 16:10:51 2004 +++ bitfield.h Sat Nov 12 12:58:02 2005 @@ -14,6 +14,7 @@ inline void _recalc(); inline void _setall(unsigned char* buf); + inline void _set(size_t idx); public: BitField(); --- bitfield.cpp.orig Wed Sep 8 16:10:51 2004 +++ bitfield.cpp Sun Nov 13 11:47:08 2005 @@ -143,8 +143,10 @@ size_t s = nset; for( ; i < nbytes - 1; i++ ) b[i] = ~b[i]; - if( nbits % nbytes ){ - for( i = 8 * (nbytes - 1); i < nbits; i++ ) if( _isset(i) ) UnSet(i); else Set(i); +//dnh if( nbits % nbytes ){ +//consider nbits=10 (nbytes=2).... + if( nbits % 8 ){ + for( i = 8 * (nbytes - 1); i < nbits; i++ ) if( _isset(i) ) UnSet(i); else _set(i); }else b[nbytes - 1] = ~b[nbytes - 1]; @@ -152,6 +154,16 @@ } } +// _set() sets the bit but doesn't increment nset or set the isfull case. +// Use instead of Set() when you know nset is incorrect and will be corrected +// afterward (as in Invert or by _recalc), +// and either bitfield won't get full or you'll _recalc() afterward to fix it. +void BitField::_set(size_t idx) +{ + if( idx < nbits && !_isfull() && !_isset(idx) ) + b[idx / 8] |= BIT_HEX[idx % 8]; +} + void BitField::Comb(const BitField &bf) { size_t i;