#pragma once
#include "SyncObject.h"

class CFastReadWriteLock
{
public:
	CFastReadWriteLock(void);
	virtual ~CFastReadWriteLock(void);

	/////////////////////////////////////////////////////////////////////////////////////
	//	制御
	/////////////////////////////////////////////////////////////////////////////////////
	//!	読み込み要求
	void ReadLock();

	//!	読み込み開放
	void ReadUnlock();

	//!	書き込み要求
	void WriteLock();

	//!	書き込み開放
	void WriteUnlock();

protected:
	/////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	/////////////////////////////////////////////////////////////////////////////////////
	//!	読み込み数、書き込み要求フラグ用インターロックカウンタ
	CInterlockCounter	m_readerCountWriteRequest;

	//!	書き込み制御ミューテックス
	CSyncMutex			m_writerMutex;

	//!	読み込み制御イベント
	CSyncEvent			m_readerEvent;

	//!	読み込終了イベント
	CSyncEvent			m_readerZeroEvent;
};


/*!
	リードロックスコープ
*/
class CFastReadWriteLockReadScope
{
public:
	CFastReadWriteLockReadScope(CFastReadWriteLock &lock)
	{
		m_lock = &lock;
		m_lock->ReadLock();
	};

	virtual ~CFastReadWriteLockReadScope()
	{
		m_lock->ReadUnlock();
	};

protected:
	CFastReadWriteLock	*m_lock;
};


/*!
	ライトロックスコープ
*/
class CFastReadWriteLockWriteScope
{
public:
	CFastReadWriteLockWriteScope(CFastReadWriteLock &lock)
	{
		m_lock = &lock;
		m_lock->WriteLock();
	};

	virtual ~CFastReadWriteLockWriteScope()
	{
		m_lock->WriteUnlock();
	};

protected:
	CFastReadWriteLock	*m_lock;
};

