Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

98 lines
2.3 KiB

/*=========================================================================*\
Module: _refcnt.h
Copyright Microsoft Corporation 1997, All Rights Reserved.
Stolen from Storext.h
Description: Ref counted object defintion
\*=========================================================================*/
#ifndef _EX_REFCNT_H_
#define _EX_REFCNT_H_
/*==========================================================================*\
IRefCounted
Description: Your basic reference counting interface.
Note:
In most cases you shouldn't need to include this class as a base
class in your refcounted object. Instead you should just derive
derive your class directly from CRefCountedObject. You would only
use IRefCounted with objects that can be used used where the
code cannot or does not make assumptions on how the object
implements its refcounting. E.g. classes that forward refcounting
to parent classes or derive from two concrete refcounted base
classes.
\*==========================================================================*/
class IRefCounted
{
// NOT IMPLEMENTED
//
IRefCounted& operator=(const IRefCounted&);
public:
// CREATORS
//
virtual ~IRefCounted() = 0 {}
// MANIPULATORS
//
virtual void AddRef() = 0;
virtual void Release() = 0;
};
/*==========================================================================*\
CRefCountedObject
Description: Provide simple reference counting for internal objects.
NOTE: The ref-counting used here is NOT consistent with OLE/COM refcounting.
This class was meant to be used with auto_ref_ptr.
\*==========================================================================*/
class CRefCountedObject
{
private:
// NOT IMPLEMENTED
//
// Force an error in instances where a copy constructor
// was needed, but none was provided.
//
CRefCountedObject& operator=(const CRefCountedObject&);
CRefCountedObject(const CRefCountedObject&);
protected:
LONG m_cRef;
public:
CRefCountedObject() : m_cRef(0) {}
virtual ~CRefCountedObject() = 0 {}
void AddRef()
{
InterlockedIncrement(&m_cRef);
}
void Release()
{
if (0 == InterlockedDecrement(&m_cRef))
delete this;
}
};
#endif // !_EX_REFCNT_H_