windows-nt/Source/XPSP1/NT/sdktools/iasinfdb/bitvec.h
2020-09-26 16:20:57 +08:00

137 lines
2.7 KiB
C++

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1998-1999, Microsoft Corp. All rights reserved.
//
// FILE
//
// BitVec.h
//
// SYNOPSIS
//
// This file implements the class BitVector
//
// MODIFICATION HISTORY
//
// 02/09/1998 Original version.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef _BITVEC_H_
#define _BITVEC_H_
///////////////////////////////////////////////////////////////////////////////
//
// CLASS
//
// BitVector
//
// DESCRIPTION
//
// Very simple bit vector optimized for use by the CSimpleTable class.
//
///////////////////////////////////////////////////////////////////////////////
class BitVector
{
public:
// Type used to store bits.
typedef unsigned long Bucket;
BitVector()
: numBuckets(0), numSet(0), bits(NULL) { }
~BitVector()
{
delete[] bits;
}
// Returns true if any bits are set.
bool any() const
{
return numSet != 0;
}
// Returns the number of bits set.
size_t count() const
{
return numSet;
}
// Returns true if no bits are set.
bool none() const
{
return numSet == 0;
}
// Clears all bits.
void reset()
{
if (any())
{
memset(bits, 0, numBuckets * sizeof(Bucket));
numSet = 0;
}
}
// Resizes the bitvector to have room for at least 'n' bits. Also clears
// any existing bits.
bool resize(size_t n)
{
size_t newBuckets = (n + sizeof(Bucket) - 1)/sizeof(Bucket);
if (newBuckets >= numBuckets)
{
numBuckets = newBuckets;
delete[] bits;
bits = new (std::nothrow) Bucket[numBuckets];
if ( !bits )
{
return false;
}
}
memset(bits, 0, numBuckets * sizeof(Bucket));
numSet = 0;
return true;
}
// Sets the given bit.
void set(size_t i)
{
if (!test(i))
{
++numSet;
getBucket(i) |= getBit(i);
}
}
// Returns true if the given bit is set.
bool test(size_t i) const
{
return (getBucket(i) & getBit(i)) != 0;
}
protected:
// Return the bit for a given index.
static Bucket getBit(size_t i)
{ return (Bucket)1 << (i % sizeof(Bucket)); }
// Return the bucket for a given index.
Bucket& getBucket(size_t i) const
{ return bits[i / sizeof(Bucket)]; }
size_t numBuckets; // Number of bit buckets.
size_t numSet; // Number of bits currently set.
Bucket* bits; // Array of bit buckets.
// Not implemented.
BitVector(const BitVector&);
BitVector& operator=(const BitVector&);
};
#endif // _BITVEC_H_