#ifndef __MyuSimpleStackTrace_H__
#define __MyuSimpleStackTrace_H__

#include <msl.h>

//	channel情報構造体
typedef struct
{
	string strFunction;
}
MYU_SIMPLE_STACK_TRACE_STACK_INFO;

typedef vector<MYU_SIMPLE_STACK_TRACE_STACK_INFO> MYU_SIMPLE_STACK_TRACE_STACK_LIST;

////////////////////////////////////////////////////////////

//	クラス宣言
class CMyuSimpleStackTrace
{
protected:
	MYU_SIMPLE_STACK_TRACE_STACK_LIST m_list;

protected:
	friend class CMyuStackInstance;	//	friend

	//	設定・追加等
	void Push( const char* szFunctionName ){
		MYU_SIMPLE_STACK_TRACE_STACK_INFO t;
		t.strFunction = szFunctionName;
		Push(t);
	}
	void Push(MYU_SIMPLE_STACK_TRACE_STACK_INFO& info){
		m_list.push_back(info);
	}
	void Pop(){ if(m_list.size()>1) m_list.pop_back(); }

public:
	//	コンストラクタ・デストラクタ
	CMyuSimpleStackTrace(){}
	virtual ~CMyuSimpleStackTrace(){}

	string Dump();
	MYU_SIMPLE_STACK_TRACE_STACK_LIST &GetList(){ return m_list; }
};

typedef ::CMyuSimpleStackTrace CMyuStackTrace;

////////////////////////////////////////////////////////////

//	クラス宣言 - コンストラクタを継承することが望ましい！
class CMyuStackInstance
{
protected:
	CMyuSimpleStackTrace *m_pStackTrace;

public:
	//	コンストラクタ・デストラクタ
	CMyuStackInstance(CMyuSimpleStackTrace *pStackTrace, const char* szFunctionName)
		: m_pStackTrace(pStackTrace)
	{
		m_pStackTrace->Push(szFunctionName);
	}
	virtual ~CMyuStackInstance(){
		m_pStackTrace->Pop();
	}
};

////////////////////////////////////////////////////////////

namespace msl
{
	typedef ::CMyuSimpleStackTrace CSimpleStackTrace;
	typedef ::CMyuSimpleStackTrace CStackTrace;
	typedef ::CMyuStackInstance CStackInstance;
}

#endif//__MyuSimpleStackTrace_H__
