/*!
	StackAlloc.h
	スタックにメモリを確保する
*/
#pragma once

/*!
	インスタンスと同じメモリ領域にメモリを確保する
	サイズを超えるとヒープに確保する
	※配列、リストクラスへの格納禁止
*/
template<int STACK_BUF_SIZE>
class CStackAlloc
{
public:
	/*!
		コンストラクタ
	*/
	CStackAlloc()
	{
		m_heap = NULL;
		m_heapSize = 0;
	}

	/*!
		デストラクタ
	*/
	virtual ~CStackAlloc()
	{
		Free();
	}

	/*!
		確保、再確保
	*/
	void *Alloc(int count)
	{
		//	未確保？
		if(m_heap == NULL && count <= STACK_BUF_SIZE)
			return(m_stack);

		//	確保不要？
		if(m_heap != NULL && count <= m_heapSize)
			return(m_heap);

		//	確保
		if(m_heap)
			delete m_heap;
		m_heap = new char[count];
		m_heapSize = count;
		return(m_heap);
	}

	/*!
		解放
	*/
	void Free()
	{
		//	必要なら削除
		if(m_heap != NULL)
			delete m_heap;
		m_heap = NULL;
		m_heapSize = 0;
	}

	/*!
		ポインタ再取得
	*/
	void *GetPtr()
	{
		if(m_heap != NULL)
			return m_heap;
		return(m_stack);
	}

protected:
	//!	内蔵メモリ
	char	m_stack[STACK_BUF_SIZE];

	//!	外部メモリ
	char	*m_heap;

	//!	外部メモリサイズ
	int		m_heapSize;
};
