DYT/Tool/3rdParty_x64/include/dcmtk/dcmimgle/diobjcou.h
2024-11-22 23:19:31 +08:00

118 lines
2.0 KiB
C++

/*
*
* Copyright (C) 1996-2011, OFFIS e.V.
* All rights reserved. See COPYRIGHT file for details.
*
* This software and supporting documentation were developed by
*
* OFFIS e.V.
* R&D Division Health
* Escherweg 2
* D-26121 Oldenburg, Germany
*
*
* Module: dcmimgle
*
* Author: Joerg Riesmeier
*
* Purpose: DicomObjectCounter (Header)
*
*/
#ifndef DIOBJCOU_H
#define DIOBJCOU_H
#include "dcmtk/config/osconfig.h"
#ifdef WITH_THREADS
#include "dcmtk/ofstd/ofthread.h"
#endif
#include "dcmtk/dcmimgle/didefine.h"
/*---------------------*
* class declaration *
*---------------------*/
/** Class to count number of instances (objects created from a certain class).
* used to manage more than one reference to an object in a secure way.
*/
class DCMTK_DCMIMGLE_EXPORT DiObjectCounter
{
public:
/** add a reference.
* Increase the internal counter by 1.
*/
inline void addReference()
{
#ifdef WITH_THREADS
theMutex.lock();
#endif
++Counter;
#ifdef WITH_THREADS
theMutex.unlock();
#endif
}
/** remove a reference.
* Decrease the internal counter by 1 and delete the object only if the counter is zero.
*/
inline void removeReference()
{
#ifdef WITH_THREADS
theMutex.lock();
#endif
if (--Counter == 0)
{
#ifdef WITH_THREADS
theMutex.unlock();
#endif
delete this;
#ifdef WITH_THREADS
} else {
theMutex.unlock();
#endif
}
}
protected:
/** constructor.
* Internal counter is initialized with 1.
*/
DiObjectCounter()
: Counter(1)
#ifdef WITH_THREADS
,theMutex()
#endif
{
}
/** destructor
*/
virtual ~DiObjectCounter()
{
}
private:
/// internal counter
unsigned long Counter;
#ifdef WITH_THREADS
/** if compiled for multi-thread operation, the Mutex protecting
* access to the value of this object.
*/
OFMutex theMutex;
#endif
};
#endif