352 lines
7.8 KiB
C++
352 lines
7.8 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// 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));
|
|
}
|
|
|