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.
|
|
//____________________________________________________________________________
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995 - 1996.
//
// File: SafeTemp.h
//
// Contents: A template for safe pointers.
//
// Classes: XSafeInterfacePtr<ISome>
//
// History: 6/3/1996 RaviR Created
//____________________________________________________________________________
//
//____________________________________________________________________________
//
// Template: XSafeInterfacePtr
//
// Purpose: Safe pointer to any interface that supports AddRef/Release
//
// Notes: This works for classes that define AddRef/Release, or for
// OLE interfaces. It is not necessary that the class
// be a derivative of IUnknown, so long as it supports
// AddRef and Release methods which have the same semantics as
// those in IUnknown.
//
// The constructor takes a parameter which specifies whether
// the captured pointer should be AddRef'd, defaulting to TRUE.
//
// The Copy function creates a valid additional copy of
// the captured pointer (following the AddRef/Release protocol)
// so can be used to hand out copies from a safe pointer declared
// as a member of some other class.
//
// The 'Transfer' function transfers the interface pointer, and
// invalidates its member value (by setting it to NULL).
//
// To release the existing interface ptr and set it to a new
// instance use the 'Set' member fuction. This method takes a
// parameter which specifies whether the new pointer should be
// AddRef'd, defaulting to TRUE.
//
// The following methods manipulate the interface pointer with
// out following the AddRef/Release protocol: Transfer, Attach
// and Detach.
//
// History: 6/3/1996 RaviR Created
//____________________________________________________________________________
//
template<class ISome> class XSafeInterfacePtr { public:
inline XSafeInterfacePtr(ISome * pinter=NULL, BOOL fInc=TRUE) : _p ( pinter ) { if (fInc && (_p != NULL)) { _p->AddRef(); } }
inline ~XSafeInterfacePtr() { if (_p != NULL) { _p->Release(); _p = NULL; } }
inline BOOL IsNull(void) { return (_p == NULL); }
inline void Copy(ISome **pxtmp) { *pxtmp = _p; if (_p != NULL) _p->AddRef(); }
inline void Transfer(ISome **pxtmp) { *pxtmp = _p; _p = NULL; }
inline void Set(ISome* p, BOOL fInc = TRUE) { if (_p) { _p->Release(); } _p = p; if (fInc && _p) { _p->AddRef(); } }
inline void SafeRelease(void) { if (_p) { _p->Release(); _p = NULL; } }
inline void SimpleRelease(void) { ASSERT(_p != NULL); _p->Release(); _p = NULL; }
inline void Attach(ISome* p) { ASSERT(_p == NULL); _p = p; }
inline void Detach(void) { _p = NULL; }
inline ISome * operator-> () { return _p; }
inline ISome& operator * () { return *_p; }
inline operator ISome *() { return _p; }
inline ISome ** operator &() { ASSERT( _p == NULL ); return &_p; }
inline ISome *Self(void) { return _p; }
private:
ISome * _p;
inline void operator= (const XSafeInterfacePtr &) {;}
inline XSafeInterfacePtr(const XSafeInterfacePtr &){;}
};
|