135 lines
2.1 KiB
C++
135 lines
2.1 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 1998, Microsoft Corp. All rights reserved.
|
|
//
|
|
// FILE
|
|
//
|
|
// autohdl.h
|
|
//
|
|
// SYNOPSIS
|
|
//
|
|
// This file defines the class auto_handle.
|
|
//
|
|
// MODIFICATION HISTORY
|
|
//
|
|
// 01/27/1998 Original version.
|
|
// 02/24/1998 Added the attach() method.
|
|
// 11/17/1998 Make type safe.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _AUTOHANDLE_H_
|
|
#define _AUTOHANDLE_H_
|
|
|
|
#include <nocopy.h>
|
|
|
|
// return type is not a UDT or reference to a UDT. Will produce errors if
|
|
// applied using infix notation
|
|
#pragma warning(disable:4284)
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CLASS
|
|
//
|
|
// auto_handle<>
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
template< class T = HANDLE,
|
|
class PFn = BOOL (WINAPI*)(HANDLE),
|
|
PFn CloseFn = &CloseHandle
|
|
>
|
|
class auto_handle : NonCopyable
|
|
{
|
|
public:
|
|
typedef T element_type;
|
|
|
|
explicit auto_handle(T t = T()) throw ()
|
|
: handle(t)
|
|
{ }
|
|
|
|
T& operator=(T t) throw ()
|
|
{
|
|
attach(t);
|
|
|
|
return handle;
|
|
}
|
|
|
|
~auto_handle() throw ()
|
|
{
|
|
_close();
|
|
}
|
|
|
|
T* operator&() throw ()
|
|
{
|
|
close();
|
|
|
|
return &handle;
|
|
}
|
|
|
|
T operator->() const throw ()
|
|
{
|
|
return handle;
|
|
}
|
|
|
|
operator T() throw ()
|
|
{
|
|
return handle;
|
|
}
|
|
|
|
operator const T() const throw ()
|
|
{
|
|
return handle;
|
|
}
|
|
|
|
bool operator!() const throw ()
|
|
{
|
|
return handle == T();
|
|
}
|
|
|
|
operator bool() const throw()
|
|
{
|
|
return !operator!();
|
|
}
|
|
|
|
void attach(T t) throw ()
|
|
{
|
|
_close();
|
|
|
|
handle = t;
|
|
}
|
|
|
|
void close() throw ()
|
|
{
|
|
if (handle != T())
|
|
{
|
|
CloseFn(handle);
|
|
|
|
handle = T();
|
|
}
|
|
}
|
|
|
|
T get() const throw ()
|
|
{
|
|
return handle;
|
|
}
|
|
|
|
T release() throw ()
|
|
{
|
|
T tmp = handle;
|
|
|
|
handle = T();
|
|
|
|
return tmp;
|
|
}
|
|
|
|
private:
|
|
void _close() throw ()
|
|
{
|
|
if (handle != T()) { CloseFn(handle); }
|
|
}
|
|
|
|
T handle;
|
|
};
|
|
|
|
#endif // _AUTOHANDLE_H_
|