windows-nt/Source/XPSP1/NT/com/rpc/runtime/mtrt/compflag.hxx
2020-09-26 16:20:57 +08:00

91 lines
2 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1990 - 2000
//
// File: CompFlag.hxx
//
//--------------------------------------------------------------------------
/* --------------------------------------------------------------------
File : CompFlag.hxx
Title : Implementation of a flag set.
History :
KamenM - 01/04/2000 - Created.
-------------------------------------------------------------------- */
#ifndef __COMPFLAG_HXX__
#define __COMPFLAG_HXX__
class CompositeFlags
{
public:
inline CompositeFlags(void)
{
Flags = 0;
}
inline void SetFlagUnsafe(unsigned int FlagConstant)
{
Flags |= FlagConstant;
}
inline void SetFlagWithMutex(unsigned int FlagConstant, MUTEX *Mutex)
{
Mutex->Request();
SetFlagUnsafe(FlagConstant);
Mutex->Clear();
}
inline void SetFlagInterlocked(unsigned int FlagConstant)
{
unsigned int NewFlags, OldFlags;
do
{
OldFlags = Flags;
NewFlags = Flags | FlagConstant;
}
while (InterlockedCompareExchange((long *)&Flags, NewFlags, OldFlags) != (long)OldFlags);
}
inline void ClearFlagUnsafe(unsigned int FlagConstant)
{
Flags &= ~FlagConstant;
}
inline void ClearFlagWithMutex(unsigned int FlagConstant, MUTEX *Mutex)
{
Mutex->Request();
ClearFlagUnsafe(FlagConstant);
Mutex->Clear();
}
inline void ClearFlagInterlocked(unsigned int FlagConstant)
{
unsigned int NewFlags, OldFlags;
do
{
OldFlags = Flags;
NewFlags = Flags & (~FlagConstant);
}
while (InterlockedCompareExchange((long *)&Flags, NewFlags, OldFlags) != (long)OldFlags);
}
inline BOOL GetFlag(unsigned int FlagConstant)
{
return (Flags & FlagConstant);
}
private:
unsigned int Flags;
};
#endif // __COMPFLAG_HXX__