NT4/private/utils/ulib/inc/bitvect.hxx
2020-09-30 17:12:29 +02:00

448 lines
5.4 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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.
Author:
David J. Gilman (davegi) 13-Jan-1991
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_