#pragma once

namespace ehs
{
	template<typename T>
	class UniPtr
	{
	private:
		T* data;

	public:
		~UniPtr()
		{
			delete data;
		}

		UniPtr()
			: data(nullptr)
		{
		}

		UniPtr(T* data)
			: data(data)
		{
		}

		UniPtr(UniPtr&& uniPtr) noexcept
			: data(uniPtr.data)
		{
			uniPtr.data = nullptr;
		}

		UniPtr(const UniPtr& uniPtr)
			: data(nullptr)
		{
		}

		UniPtr& operator=(UniPtr&& uniPtr) noexcept
		{
			if (this == &uniPtr)
				return *this;

			delete data;

			data = uniPtr.data;

			uniPtr.data = nullptr;

			return *this;
		}

		UniPtr& operator=(const UniPtr& uniPtr) noexcept
		{
			if (this == &uniPtr)
				return *this;

			delete data;

			data = nullptr;

			return *this;
		}

		bool operator==(T* inPtr) const
		{
			return data == inPtr;
		}

		bool operator!=(T* inPtr) const
		{
			return data != inPtr;
		}

		void Release()
		{
			delete data;
			data = nullptr;
		}

		T* GetData()
		{
			return data;
		}
	};
}