//----------------------------------------------------------------------
//
//			File:			"auto_handle.h"
//			Created:		02-May-2008
//			Author:			津田伸秀
//			Description:	ハンドルをデストラクタでクローズするクラス
//
//			Copyright (C) 2008 by Nobuhide Tsuda
//
//----------------------------------------------------------------------

/*
本プログラムのライセンスは MIT License (http://www.opensource.jp/licenses/mit-license.html) に従う。
MIT License とは、要約すると以下のとおりである。
   1. このソフトウェアを誰でも無償で無制限に扱って良い。但し、著作権表示および本許諾表示を、
      ソフトウェアのすべての複製または重要な部分に記載しなければならない。
   2. 作者または著作権者は、ソフトウェアに関してなんら責任を負わない。
*/

#ifndef		_HEADER_AUTO_HANDLE_H
#define		_HEADER_AUTO_HANDLE_H

class auto_handle {
public:
	explicit auto_handle(HANDLE handle = NULL)
		: m_owns(handle != NULL), m_handle(handle) {};
	auto_handle(const auto_handle &src)
		: m_owns(src.m_owns), m_handle(src.release()) {};
	auto_handle &operator=(const auto_handle &src)
		{
			if( this != &src ) {
				if( m_handle != src.get()) {
					if( m_owns)
						CloseHandle( m_handle );
					m_owns = src.m_owns;
				} else if( src.m_owns )
					m_owns = true;
				m_handle = src.release();
			}
			return (*this);
		};
	~auto_handle()
		{
			if( m_owns )
				CloseHandle( m_handle );
		};
	HANDLE get() const
		{ return (m_handle); };
	HANDLE release() const
		{
			((auto_handle *)this)->m_owns = false;
			return (m_handle);
		};
private:
	bool	m_owns;
	HANDLE	m_handle;
};

#endif		//_HEADER_AUTO_HANDLE_H