Source code of Windows XP (NT5)
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.
|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1991 - 1992.
//
// File: SET.HXX
//
// Contents: Bit set
//
// Classes: CSimpleSet, CSet
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
#pragma once
#define EOS (-1)
#define SET_SIZE (MAX_PERS_ID + 1)
typedef unsigned int set_t;
#define SIMPLE_SET_SIZE (8 * sizeof(set_t))
//+---------------------------------------------------------------------------
//
// Class: CSimpleSet
//
// Purpose: Fast bit set, building block of CSet
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
class CSimpleSet { public:
CSimpleSet();
void Add ( int i );
void Remove ( int i );
BOOL Contains ( int i ) const;
int FirstElement () const;
BOOL IsEmpty() const;
void Clear();
void Fill();
private:
set_t _mask(int i) const;
set_t _bitset; };
//+---------------------------------------------------------------------------
//
// Member: CSimpleSet::CSimpleSet, public
//
// Synopsis: Constructor, makes empty set
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
inline CSimpleSet::CSimpleSet () { Clear(); }
//+---------------------------------------------------------------------------
//
// Member: CSimpleSet::Add, public
//
// Synopsis: Adds element to set
//
// Arguments: [i] -- element to be added
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
inline void CSimpleSet::Add ( int i ) { _bitset |= _mask(i); }
//+---------------------------------------------------------------------------
//
// Member: CSimpleSet::Remove, public
//
// Synopsis: Removes element from set
//
// Arguments: [i] -- element
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
inline void CSimpleSet::Remove ( int i ) { _bitset &= ~_mask(i); }
//+---------------------------------------------------------------------------
//
// Member: CSimpleSet::Contains, public
//
// Synopsis: Checks if set contains element [i]
//
// Arguments: [i] -- element
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
inline BOOL CSimpleSet::Contains ( int i ) const { return _bitset & _mask(i); }
//+---------------------------------------------------------------------------
//
// Member: CSimpleSet::IsEmpty, public
//
// Synopsis: Checks if set is empty
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
inline BOOL CSimpleSet::IsEmpty() const { return _bitset == 0; }
//+---------------------------------------------------------------------------
//
// Member: CSimpleSet::Clear, public
//
// Synopsis: Removes all elements from set
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
inline void CSimpleSet::Clear() { _bitset = 0; }
//+---------------------------------------------------------------------------
//
// Member: CSimpleSet::Fill, public
//
// Synopsis: Fills the set
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
inline void CSimpleSet::Fill() { _bitset = set_t( -1); }
//+---------------------------------------------------------------------------
//
// Member: CSimpleSet::_mask, private
//
// Synopsis: Creates a bit mask corresponding to element [i]
//
// Arguments: [i] -- element
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
inline set_t CSimpleSet::_mask(int i) const { ciAssert ( i < SIMPLE_SET_SIZE ); return ((set_t) 1) << i; }
//+---------------------------------------------------------------------------
//
// Class: CSet
//
// Purpose: Bit Set of fixed size
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
#define SET_ENTRIES (( SET_SIZE + SIMPLE_SET_SIZE - 1 ) / SIMPLE_SET_SIZE )
class CSet { public:
CSet();
CSet ( CSet& s );
void Fill();
CSet& operator= ( CSet& s );
void Add ( int i );
BOOL Contains ( int i ) const;
void Remove ( int i );
BOOL IsEmpty() const;
int FirstElement() const;
void Clear();
private:
unsigned _count() const;
int _index(int i) const;
int _offset( int i) const;
CSimpleSet _aSimpleSet[SET_ENTRIES]; };
//+---------------------------------------------------------------------------
//
// Member: CSet::CSet, public
//
// Synopsis: Constructor, makes empty set
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
inline CSet::CSet() {}
//+---------------------------------------------------------------------------
//
// Member: CSet::_count, private
//
// Synopsis: Returns the number of simple sets in the set
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
inline unsigned CSet::_count() const { return SET_ENTRIES; }
//+---------------------------------------------------------------------------
//
// Member: CSet::_index, private
//
// Synopsis: Returns index into array of simple sets
//
// Arguments: [i] -- set element
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
inline int CSet::_index(int i) const { return i / SIMPLE_SET_SIZE; }
//+---------------------------------------------------------------------------
//
// Member: CSet::_offset, private
//
// Synopsis: Returns offset into particular simple set
//
// Arguments: [i] -- set element
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
inline int CSet::_offset( int i) const { return i % SIMPLE_SET_SIZE; }
//+---------------------------------------------------------------------------
//
// Member: CSet::Add, public
//
// Synopsis: Adds element to set
//
// Arguments: [i] -- element to be added
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
inline void CSet::Add ( int i ) { _aSimpleSet[_index(i)].Add(_offset(i)); }
//+---------------------------------------------------------------------------
//
// Member: CSet::Contains, public
//
// Synopsis: Checks if set contains element [i]
//
// Arguments: [i] -- element
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
inline BOOL CSet::Contains ( int i ) const { return _aSimpleSet[_index(i)].Contains(_offset(i)); }
//+---------------------------------------------------------------------------
//
// Member: CSet::Remove, public
//
// Synopsis: Removes element from set
//
// Arguments: [i] -- element
//
// History: 01-Nov-91 BartoszM Created.
//
//----------------------------------------------------------------------------
inline void CSet::Remove ( int i ) { _aSimpleSet[_index(i)].Remove(_offset(i)); }
|