windows-nt/Source/XPSP1/NT/inetsrv/query/cindex/set.hxx
2020-09-26 16:20:57 +08:00

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));
}