Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
///////////////////////////////////////////////////////////////////////////////
//
// 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_
|