#include "tsmartpointer.h"
#include "tthread.h"
//-------------------------------------------------------------------
namespace
{
//-------------------------------------------------------------------
typedef TAtomicVar *TAtomicVarPtr;
const int maxClassCode = 100;
TAtomicVarPtr instanceCounts[maxClassCode + 1];
//-------------------------------------------------------------------
inline TAtomicVar &getInstanceCounter(long classCode)
{
assert(0 <= classCode && classCode <= maxClassCode);
TAtomicVarPtr &instanceCountPtr = instanceCounts[classCode];
if (instanceCountPtr == 0) {
static TThread::Mutex mutex;
TThread::ScopedLock g(mutex);
if (instanceCountPtr == 0)
instanceCountPtr = new TAtomicVar();
}
assert(instanceCountPtr);
return *instanceCountPtr;
}
//-------------------------------------------------------------------
} // namespace
//-------------------------------------------------------------------
const long TSmartObject::m_unknownClassCode = 0;
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
}
//-------------------------------------------------------------------
long TSmartObject::getInstanceCount(ClassCode code)
{
#ifdef INSTANCE_COUNT_ENABLED
TAtomicVar &instanceCount = getInstanceCounter(code);
return instanceCount;
#else
assert(0);
return 0;
#endif
}
//-------------------------------------------------------------------