
#ifndef  __JBXL_CPP_LOG_RING_BUFFER_H__
#define  __JBXL_CPP_LOG_RING_BUFFER_H__



#include "xtools++.h"


//
namespace jbxl {




// kindData
#define  LOG_RB_UNKNOWN_DATA		0
#define  LOG_RB_TEXT_DATA			1
#define  LOG_RB_TEXT_HALF_DATA		2
#define  LOG_RB_BINARY_DATA			3
#define  LOG_RB_BINHEX_DATA			4


// inputSrc
#define  LOG_RB_MESG				0
#define  LOG_RB_MESSAGE				0
#define  LOG_RB_INFO				1
#define  LOG_RB_INFORMATION			1
#define  LOG_RB_DEBUG				2
#define  LOG_RB_WARN				3
#define  LOG_RB_WARNING				3
#define  LOG_RB_ERR					4
#define  LOG_RB_ERROR				4




class CLogRingBuffer
{
public:
	CLogRingBuffer(int size) { init(size);}
	~CLogRingBuffer(void);

public:
	int		init(int size);
	void	clear(void);
	void	putRingBuffer(Buffer buf, int input=LOG_RB_MESG, int kind=LOG_RB_UNKNOWN_DATA);
	void	rewriteBinHexRingBuffer(int n, int input);
	void	putRingFormat(int input, char* fmt, ...);
	void    putRingFormat(int input, char* fmt, va_list args);

	Buffer	getRingBuffer(void);		// バッファの先頭を読み込む．データポインタを移動させる．
	Buffer	getRingBuffer(int pos);		// バッファの位置を指定して読み込む．データポインタの移動無し．

	int		getMaxBufSize(void)		{ return maxBufSize;}
	int		getMaxLineX(void)		{ return maxLineX;}
	int		getMaxLineY(void)		{ return maxLineY;}
	int		getTotalSize(void)		{ return tlDataSize;}
	int		getLastPosition(void)	{ return wPos;}

	int		getLengthX(int n)		{ if(n<0) n+=maxBufSize; return (int)strlen((const char*)pBuf[n%maxBufSize].buf);}
	int		getKindData(int n)		{ if(n<0) n+=maxBufSize; return kindData[n%maxBufSize];}

public:
	Buffer* pBuf;


protected:
	int		maxBufSize;		// Buffer の数．ラインの数．
	int		tlDataSize;

	int		maxLineX;		// コンテキストのXサイズ
	int		maxLineY;		// コンテキストのYサイズ
	int		indentSize;		// 

	int		rPos;
	int		wPos;

	int*	kindData;		//
	int*	inputSrc;		//
};






}		// namespace


#endif

