/******************************************************************************
 *
 * ptrhandle.h -- smart pointer handler template header
 *
 * (c) Leonid (Lodrion) Taycher 2000
 *
 ******************************************************************************/
 
#ifndef __PTRHANDLE_H__
#define __PTRHANDLE_H__

// NOTE!!!! The assignment of pointer handles does not share the value pointed 
//					to, but rather creates an extra copy
template <class T>
class aicPtrHandle
{
public:
	aicPtrHandle() 
		:  _ptr(0) 
	{};

	aicPtrHandle(T* p) 
		: _ptr(p)
	{};
	
	aicPtrHandle(const aicPtrHandle& rhs) 
		: _ptr(0)
		{ _assign(rhs); };
	
	
	~aicPtrHandle()
	{
		_cleanup();
	};
	
	aicPtrHandle& operator=(const aicPtrHandle& rhs)
		{ _assign(rhs); };
	
	T* operator->() 
		{ return _ptr; };
	
	const T* operator->() const 
		{ return _ptr; };

	T* ptr() 
		{ return _ptr; };

	const T* ptr() const
		{ return _ptr; };
private:
	void _assign(const aicPtrHandle& rhs)
	{
		_cleanup();

		_ptr = new T(*(rhs._ptr));
	};
		
	void _cleanup()
	{
		if (_ptr != NULL)
			delete _ptr;
	};
	
	T*  _ptr;
};

#endif
