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.
443 lines
5.8 KiB
443 lines
5.8 KiB
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
bitvect.hxx
|
|
|
|
Abstract:
|
|
|
|
This module contains the definition for the BITVECTOR class. BITVECTOR
|
|
is a concrete class which implements a bit array.
|
|
|
|
Environment:
|
|
|
|
ULIB, User Mode
|
|
|
|
Notes:
|
|
|
|
BITVECTOR is an implementation of a general purpose bit
|
|
vector. It is based around an abstract type called PT
|
|
(Primitive Type) to increase it's portability. BITVECTORs
|
|
can be created of arbitrary size. If required they will
|
|
allocate memory to maintain the bits or will use a memory
|
|
buffer supplied by the client. This allows the client to
|
|
superimpose a bit vector onto a predefined buffer (e.g. onto
|
|
a SECBUF).
|
|
|
|
--*/
|
|
#if ! defined ( _BITVECTOR_ )
|
|
|
|
#define _BITVECTOR_
|
|
|
|
DECLARE_CLASS( BITVECTOR );
|
|
|
|
|
|
// extern ERRSTACK *perrstk; // pointer to error stack
|
|
|
|
//
|
|
// BITVECTOR allocation increment - Primitive Type
|
|
//
|
|
|
|
DEFINE_TYPE( ULONG, PT );
|
|
|
|
//
|
|
// BIT values
|
|
//
|
|
|
|
enum BIT {
|
|
SET = 1,
|
|
RESET = 0
|
|
};
|
|
|
|
//
|
|
// Invalid bit count
|
|
//
|
|
|
|
extern CONST PT InvalidBitCount;
|
|
|
|
class BITVECTOR : public OBJECT {
|
|
|
|
public:
|
|
|
|
ULIB_EXPORT
|
|
DECLARE_CONSTRUCTOR( BITVECTOR );
|
|
|
|
DECLARE_CAST_MEMBER_FUNCTION( BITVECTOR );
|
|
|
|
NONVIRTUAL
|
|
ULIB_EXPORT
|
|
~BITVECTOR (
|
|
);
|
|
|
|
NONVIRTUAL
|
|
ULIB_EXPORT
|
|
BOOLEAN
|
|
Initialize (
|
|
IN PT Size DEFAULT 0,
|
|
IN BIT InitialValue DEFAULT RESET,
|
|
IN PPT Memory DEFAULT NULL
|
|
);
|
|
|
|
NONVIRTUAL
|
|
PCPT
|
|
GetBuf (
|
|
) CONST;
|
|
|
|
NONVIRTUAL
|
|
BOOLEAN
|
|
IsBitSet (
|
|
IN PT Index
|
|
) CONST;
|
|
|
|
NONVIRTUAL
|
|
PT
|
|
QueryCountSet (
|
|
) CONST;
|
|
|
|
NONVIRTUAL
|
|
PT
|
|
QuerySize (
|
|
) CONST;
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
ResetAll (
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
ResetBit (
|
|
IN PT Index
|
|
);
|
|
|
|
NONVIRTUAL
|
|
ULIB_EXPORT
|
|
VOID
|
|
ResetBit (
|
|
IN PT Index,
|
|
IN PT Count
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
SetAll (
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
SetBit (
|
|
IN PT Index
|
|
);
|
|
|
|
NONVIRTUAL
|
|
ULIB_EXPORT
|
|
VOID
|
|
SetBit (
|
|
IN PT Index,
|
|
IN PT Count
|
|
);
|
|
|
|
NONVIRTUAL
|
|
ULIB_EXPORT
|
|
PT
|
|
SetSize (
|
|
IN PT Size,
|
|
IN BIT InitialValue DEFAULT RESET
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
ToggleBit (
|
|
IN PT Index,
|
|
IN PT Count DEFAULT 1
|
|
);
|
|
|
|
private:
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
Construct (
|
|
);
|
|
|
|
NONVIRTUAL
|
|
ULIB_EXPORT
|
|
PT
|
|
ComputeCountSet (
|
|
) CONST;
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
Destroy (
|
|
);
|
|
|
|
VOID
|
|
NONVIRTUAL
|
|
InitAll (
|
|
IN PT InitialValue
|
|
);
|
|
|
|
// Note that these three member data items cannot
|
|
// be static because they are used in INLINE functions
|
|
// that are called from outside the DLL.
|
|
|
|
PT _BitsPerPT;
|
|
PT _IndexShiftCount;
|
|
PT _BitPositionMask;
|
|
|
|
STATIC
|
|
CONST
|
|
BYTE _BitsSetLookUp[ 256 ];
|
|
|
|
PPT _BitVector;
|
|
PT _PTCount;
|
|
BOOLEAN _FreeBitVector;
|
|
|
|
};
|
|
|
|
INLINE
|
|
PCPT
|
|
BITVECTOR::GetBuf (
|
|
) CONST
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Returns the underlying bit vector.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
PCPT - Returns a pointer to the underlying bitvector.
|
|
|
|
--*/
|
|
|
|
{
|
|
return( _BitVector );
|
|
}
|
|
|
|
INLINE
|
|
PT
|
|
BITVECTOR::QuerySize (
|
|
) CONST
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Returns the number of bits in this BITVECTOR.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
PT
|
|
|
|
--*/
|
|
|
|
{
|
|
return( _PTCount * _BitsPerPT );
|
|
}
|
|
|
|
INLINE
|
|
VOID
|
|
BITVECTOR::InitAll (
|
|
IN PT InitialValue
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialize each element in the internal bit vector to the
|
|
supplied bit pattern.
|
|
|
|
Arguments:
|
|
|
|
InitialValue - Supplies the pattern for each element.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
DebugAssert( _BitVector != NULL );
|
|
|
|
memset(( PVOID ) _BitVector,
|
|
( int ) InitialValue, ( size_t ) ( sizeof( PT ) * _PTCount ));
|
|
}
|
|
|
|
INLINE
|
|
VOID
|
|
BITVECTOR::SetAll (
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Set (to one) all of the bits in this BITVECTOR.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
InitAll(( PT ) ~0 );
|
|
}
|
|
|
|
INLINE
|
|
VOID
|
|
BITVECTOR::ResetAll (
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Reset (to zero) all of the bits in this BITVECTOR.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
InitAll(( PT ) 0 );
|
|
}
|
|
|
|
INLINE
|
|
BOOLEAN
|
|
BITVECTOR::IsBitSet (
|
|
IN PT Index
|
|
) CONST
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Determine if the bit at the supplied index is set.
|
|
|
|
Arguments:
|
|
|
|
Index - Supplies the index to the bit of interest.
|
|
|
|
Return Value:
|
|
|
|
BOOLEAN - Returns TRUE if the bit of interest is set.
|
|
|
|
--*/
|
|
|
|
{
|
|
DebugAssert( _BitVector != NULL );
|
|
DebugAssert( Index < ( _PTCount * _BitsPerPT ));
|
|
|
|
return (_BitVector[Index >> _IndexShiftCount] &
|
|
(1 << (Index & _BitPositionMask))) ? TRUE : FALSE;
|
|
}
|
|
|
|
INLINE
|
|
VOID
|
|
BITVECTOR::SetBit (
|
|
IN PT Index
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Set the bit at the supplied index.
|
|
|
|
Arguments:
|
|
|
|
Index - Supplies the index to the bit of interest.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
DebugAssert( _BitVector != NULL );
|
|
DebugAssert( Index < ( _PTCount * _BitsPerPT ));
|
|
|
|
_BitVector[Index >> _IndexShiftCount] |=
|
|
(1 << (Index & _BitPositionMask));
|
|
}
|
|
|
|
INLINE
|
|
VOID
|
|
BITVECTOR::ResetBit (
|
|
IN PT Index
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Reset the bit at the supplied index.
|
|
|
|
Arguments:
|
|
|
|
Index - Supplies the index to the bit of interest.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
DebugAssert( _BitVector != NULL );
|
|
DebugAssert( Index < ( _PTCount * _BitsPerPT ));
|
|
|
|
_BitVector[Index >> _IndexShiftCount] &=
|
|
~(1 << (Index & _BitPositionMask));
|
|
}
|
|
|
|
INLINE
|
|
PT
|
|
BITVECTOR::QueryCountSet (
|
|
) CONST
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Determine the number of bits set in this BITVECTOR.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
PT - Returns the number of set bits.
|
|
|
|
--*/
|
|
{
|
|
return ComputeCountSet();
|
|
}
|
|
|
|
#endif // _BITVECTOR_
|