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.
|
|
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1998-1999 Microsoft Corporation
//
// Module Name:
// SmartPointer.h
//
// Description:
// Smart pointer template class
//
// Author:
// Galen Barbee (galenb) 19-Oct-1998
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#ifndef __SMARTPOINTER_H__
#define __SMARTPOINTER_H__
/////////////////////////////////////////////////////////////////////////////
//+++
//
// class: CSmartPtr
//
// Description:
// This class template is used to encapsulate pointers to interfaces,
// but in simpler way than com_ptr_t. We do not want exceptions
// to be thrown on com errors (as com_ptr_t does) (except Release).
// Instead, we want to process them on our own, yet still have an advantage
// of proper cleaning upon destruction. Using it significantly simplifies
// test code.
//
// Inheritance:
// None.
//---
/////////////////////////////////////////////////////////////////////////////
template< class T > class CSmartPtr { private: T * m_tPtr;
void * operator new( size_t ); void * operator new( size_t, void * ); void operator delete( void * );
public: __declspec(nothrow) CSmartPtr( T * ptr ) { if ( ( m_tPtr = ptr) != NULL ) { m_tPtr->AddRef(); } }
__declspec(nothrow) CSmartPtr( const CSmartPtr< T > & ptr ) { if ( ( m_tPtr = ptr.m_tPtr ) != NULL ) { m_tPtr->AddRef(); } }
__declspec(nothrow) CSmartPtr( void ) { m_tPtr = NULL; }
~CSmartPtr( void ) throw( _com_error ) { if ( m_tPtr != NULL ) { m_tPtr->Release(); m_tPtr = NULL; } }
__declspec(nothrow) T ** operator&() const { return &m_tPtr; }
__declspec(nothrow) T * operator->() const { return m_tPtr; }
__declspec(nothrow) operator T * () const { return m_tPtr; }
__declspec(nothrow) T * operator=( T * ptr ) { if ( m_tPtr != NULL ) { m_tPtr->Release(); m_tPtr = NULL; }
if ( ( m_tPtr = ptr ) != NULL ) { m_tPtr->AddRef(); }
return m_tPtr; }
__declspec(nothrow) T * operator=( const CSmartPtr< T >& ptr ) { if ( m_tPtr != ptr.m_tPtr ) { operator=(ptr.m_tPtr); }
return m_tPtr; }
__declspec(nothrow) bool operator==( T * ptr ) const { return m_tPtr == ptr; }
__declspec(nothrow) bool operator!=( T * ptr ) const { return m_tPtr != ptr; }
//
// This is the only non-conforming operator in this class.
//
__declspec(nothrow) T * operator*() const { return m_tPtr; }
}; //*** Class CSmartPtr
#endif // __SMARTPOINTER_H__
|