#pragma once

#include "共通\CritSec.h"
#include "共通\AutoLock.h"
#include "共通\ComPtrList.h"

namespace FDK
{
	template <class T>
	private class Cスレッドセーフキュー
	{
	public:
		HRESULT tキューの末尾に入れる( T *p )
		{
			AutoLock lock( this->m_lock );
			return this->m_list.InsertBack( p );
		}
		HRESULT tキューの先頭から取り出す( T **pp )
		{
			AutoLock lock( this->m_lock );

			if( this->m_list.IsEmpty() )
			{
				*pp = NULL;
				return S_FALSE;
			}
			return this->m_list.RemoveFront( pp );
		}
		HRESULT tキューの先頭に戻す( T *p )
		{
			AutoLock lock( this->m_lock );
			return this->m_list.InsertFront( p );
		}
		void tクリアする() 
		{
			AutoLock lock( this->m_lock );
			this->m_list.Clear();
		}

	private:
		CritSec         m_lock; 
		ComPtrList<T>   m_list;
	};
}
