Files
2022-10-26 12:25:11 +08:00

85 lines
1.4 KiB
C++

#ifndef _SOLAR_SLOT_SCLAXLOCK_HPP
#define _SOLAR_SLOT_SCLAXLOCK_HPP
#pragma once
template<typename _TYPE>
class SCLaxLock
{
_TYPE m_Count;
public:
SCLaxLock();
virtual ~SCLaxLock();
BOOL CanLock();
void EnterLock();
void LeaveLock();
BOOL IsLock();
void Clear();
};
template<typename _TYPE>
SCLaxLock<_TYPE>::SCLaxLock()
{
m_Count = 0;
}
template<typename _TYPE>
SCLaxLock<_TYPE>::~SCLaxLock()
{
m_Count = 0;
}
template<typename _TYPE>
BOOL SCLaxLock<_TYPE>::CanLock()
{
BOOST_STATIC_ASSERT(boost::is_integral<_TYPE>::value != false);
// (CHANGES) (100115) changes usage 'pow' function
if (m_Count < static_cast<_TYPE>(-1)) //if(m_Count < ::pow(2, sizeof(_TYPE)*8) - 1)
return TRUE;
return FALSE;
}
template<typename _TYPE>
void SCLaxLock<_TYPE>::EnterLock()
{
BOOST_STATIC_ASSERT(boost::is_integral<_TYPE>::value != false);
if (m_Count == static_cast<_TYPE>(-1)) //if(m_Count == ::pow(2, sizeof(_TYPE)*8) - 1)
{
ASSERT(FALSE);
return;
}
m_Count++;
}
template<typename _TYPE>
void SCLaxLock<_TYPE>::LeaveLock()
{
if(m_Count == 0)
{
ASSERT(FALSE);
return;
}
m_Count--;
}
template<typename _TYPE>
BOOL SCLaxLock<_TYPE>::IsLock()
{
if(m_Count > 0)
return TRUE;
return FALSE;
}
template<typename _TYPE>
void SCLaxLock<_TYPE>::Clear()
{
m_Count = 0;
}
#endif //_SOLAR_SLOT_SCLAXLOCK_HPP