// Buffer.h: CBuffer クラスのインターフェイス
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_BUFFER_H__8CD40D58_2734_42A0_A3A0_9E616832CC40__INCLUDED_)
#define AFX_BUFFER_H__8CD40D58_2734_42A0_A3A0_9E616832CC40__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define	CBUFFER_DEFAULT_SIZE	32768

#include <comutil.h>

/*!
	\class CBuffer
	\brief サイズ情報付きメモリ領域管理クラス
*/
class CBuffer  
{
public:
	CBuffer(int size=CBUFFER_DEFAULT_SIZE);			//!< サイズを指定して初期化
	CBuffer(CBuffer &other);						//!< コピーコンストラクタ
	virtual ~CBuffer();								//!< デストラクタ

	void ReSize(int size);							//!< 領域サイズ変更
	void Append(const char *data,int size);			//!< 追加
	void Remove(int start,int size);				//!< 削除
	void Empty() { ReSize(0); };					//!< 空にする
	void BlockCopy(int offset,const char *data,int len);	//!< 領域をコピー

	char * GetPtr();								//!< 先頭ポインタ取得
	int GetSize();									//!< バッファサイズ取得
	void SetGrowSize(int size);						//!< 増加量を設定

	void operator=(CString &other);					//!< CString を代入
	void operator=(CBuffer &other);					//!< CBuffer を代入
	void operator+=(CBuffer &other);				//!< CBuffer を追加
	void operator+=(CString &other);				//!< CString を追加
	void operator+=(const char *other);				//!< ASCIZ文字列を追加
	void operator+=(char other);					//!< １バイト追加

	operator char*();								//!< char* に変換
	operator unsigned char*();						//!< unsigned char* に変換
	operator CString();								//!< CString に変換

	void SetUTF8(_bstr_t bstr);						//!	UTF8へ変換
	_bstr_t GetBSTR();								//!	BSTRへ変換（UTF8から）

	int SaveToFile(CString path);					//!	保存
	int LoadFromFile(CString path);					//!	保存

protected:
	void Init();					//!< 初期化
	void Alloc(int size);			//!< 確保（サイズ保障）

	unsigned char	*m_buffer;		//!< バッファ本体
	int				m_usingSize;	//!< バッファサイズ
	int				m_bufferSize;	//!< 確保済みバッファサイズ
	int				m_growSize;		//!< 増加サイズ
};

#endif // !defined(AFX_BUFFER_H__8CD40D58_2734_42A0_A3A0_9E616832CC40__INCLUDED_)
