#ifndef _SOLAR_SLOT_SCLAXLOCK_HPP #define _SOLAR_SLOT_SCLAXLOCK_HPP #pragma once template class SCLaxLock { _TYPE m_Count; public: SCLaxLock(); virtual ~SCLaxLock(); BOOL CanLock(); void EnterLock(); void LeaveLock(); BOOL IsLock(); void Clear(); }; template SCLaxLock<_TYPE>::SCLaxLock() { m_Count = 0; } template SCLaxLock<_TYPE>::~SCLaxLock() { m_Count = 0; } template 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 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 void SCLaxLock<_TYPE>::LeaveLock() { if(m_Count == 0) { ASSERT(FALSE); return; } m_Count--; } template BOOL SCLaxLock<_TYPE>::IsLock() { if(m_Count > 0) return TRUE; return FALSE; } template void SCLaxLock<_TYPE>::Clear() { m_Count = 0; } #endif //_SOLAR_SLOT_SCLAXLOCK_HPP