#include "tsmartpointer.h"
#include "tthreadmessage.h"
//-------------------------------------------------------------------
namespace
{
//-------------------------------------------------------------------
typedef TAtomicVar *TAtomicVarPtr;
const int maxClassCode = 200;
TAtomicVarPtr instanceCounts[maxClassCode + 1];
//-------------------------------------------------------------------
inline TAtomicVar &getInstanceCounter(TINT32 classCode)
{
assert(0 <= classCode && classCode <= maxClassCode);
TAtomicVarPtr &instanceCountPtr = instanceCounts[classCode];
if (instanceCountPtr == 0) {
static TThread::Mutex mutex;
TThread::MutexLocker g(&mutex);
if (instanceCountPtr == 0)
instanceCountPtr = new TAtomicVar();
}
assert(instanceCountPtr);
return *instanceCountPtr;
}
//-------------------------------------------------------------------
} // namespace
//-------------------------------------------------------------------
#ifdef INSTANCE_COUNT_ENABLED
const TINT32 TSmartObject::m_unknownClassCode = 0;
#endif
void TSmartObject::incrementInstanceCount()
{
#ifdef INSTANCE_COUNT_ENABLED
TAtomicVar &instanceCount = getInstanceCounter(m_classCodeRef);
++instanceCount;
#else
assert(0);
#endif
}
//-------------------------------------------------------------------
void TSmartObject::decrementInstanceCount()
{
#ifdef INSTANCE_COUNT_ENABLED
TAtomicVar &instanceCount = getInstanceCounter(m_classCodeRef);
assert(instanceCount > 0);
--instanceCount;
#else
assert(0);
#endif
}
//-------------------------------------------------------------------
TINT32 TSmartObject::getInstanceCount(ClassCode
#ifdef INSTANCE_COUNT_ENABLED
code
#endif
)
{
#ifdef INSTANCE_COUNT_ENABLED
TAtomicVar &instanceCount = getInstanceCounter(code);
return instanceCount;
#else
assert(0);
return 0;
#endif
}
//-------------------------------------------------------------------