////////////////////////////////////////////////////////////////////////////////
// TextMatchLib.h
// SRegexで検索を行うために使用するクラスを定義
////////////////////////////////////////////////////////////////////////////////

#if !defined( TEXTMATCHLIB_H_INCLUDED_ )
#define TEXTMATCHLIB_H_INCLUDED_

// SRegexのT_Textに指定する疑似ポインタ

// 以下の機能を実装する。
// 1.前置インクリメント
// 2.アドレス参照演算子
// 3.等号演算子
// 4.代入・キャスト
// 5.改行コードの取得
// 6.テキスト末尾でNULLを返す
// 7.マッチングの結果を知るための、カーソル位置の管理

class tagPseudPtr
{
public:
	tagPseudPtr() : pLineData( NULL ){};
		
	tagPseudPtr( const T_LineData *argLineData, T_LineDataItr_c argItr, T_CurPos argCurPos ) :
		pLineData( argLineData ),
		itr( argItr ),
		CurPos( argCurPos )
	{
	};

	tagPseudPtr( const tagPseudPtr &r ) : 
		pLineData( r.pLineData ),
		itr( r.itr ),
		CurPos( r.CurPos )
	{
	};

	const tagPseudPtr& operator ++()
	{
		assert( NULL != pLineData );

		// 進めることができない場合は、処理を終了する
		if ( itr == pLineData->end() ) return (*this);

		if ( CurPos.GetCPos() < itr->length() ) {
			// 同一行内の次の文字へ
			CurPos.IncrCPos();

			// 次の文字へ移動した結果、最後の行の末尾+1をポイントした場合、
			// そこには文字は存在しないため、強制的にリストのendをポイントさせる。
			if ( !( CurPos.GetCPos() == itr->length() && CurPos.GetLine() == pLineData->size() - 1 ) ) {
				return (*this);
			}
		}

		// 次の行へ
		itr++;
		CurPos.IncrLine();
		CurPos.SetCPos( 0 );
		return (*this);
	};

	wchar_t operator *()
	{
		assert( NULL != pLineData );

		// 末尾をポイントしている場合は、NULLを返す。
		if ( itr == pLineData->end() ) return NULL;

		// 行の末尾+1をポイントしている場合
		if ( CurPos.GetCPos() == itr->length() ) {
			// 次の行が存在する場合は、改行コードを返す
			if ( CurPos.GetLine() < pLineData->size() - 1 )
				return L'\n';
			else
				return NULL;	// 文字が存在しない
		}

		// 文字を返す
		return itr->getString()[ CurPos.GetCPos() ];
	};

	// 比較
	bool operator ==( const tagPseudPtr &r ) const
	{
		assert( NULL != pLineData );
		return ( pLineData == r.pLineData && CurPos == r.CurPos );
	};

	// カーソル位置の取得
	T_CurPos GetCurPos() const
	{
		assert( NULL != pLineData );
		return CurPos;
	};

protected:
	const T_LineData *pLineData;
	T_LineDataItr_c itr;
	T_CurPos CurPos;
};

#endif // TEXTMATCHLIB_H_INCLUDED_
