

/*!
  @author d金魚
  @since 2003/8/21
	@note
	licence:BSD Licence
*/


#ifndef _dkutil_stack_or_queue
#define _dkutil_stack_or_queue

namespace dkutil{

///d金魚って馬鹿なＷｒａｐｐｅｒばっかりつくるなぁ
/*!
<b>stack_or_queueの有用性：</b><br>
<ul>
	<li>iteratorが使える。(爆）
	<li>ぶっちゃけ　push と pop　で　各機能をラップしただけ･･･
</ul>
*/
///std::stackかもしれないしstd::queueかもしれないクラス
template<class T ,class CONTAINER=std::deque<T> >
class stack_or_queue : public CONTAINER
{
public:
	typedef CONTAINER CONTAINER_TYPE;
	typedef CONTAINER BASE_TYPE;
	enum{
		enuSTACK = false,
		enuQUEUE = true,
	};
	stack_or_queue(bool flag=enuSTACK){m_flag=flag;}
	/// データの追加
	void push(const T& x){	
		BASE_TYPE::push_back(x);
	}
	/// データの削除
	void pop()
	{
		if(m_flag==enuSTACK){
			BASE_TYPE::pop_back();
		}else{
			BASE_TYPE::pop_front();
		}
	}
	void set_type(bool flag){
		m_flag=flag;
	}

	T &top(){ return BASE_TYPE::back(); }
	const T &top()const{return BASE_TYPE::back();}

#ifndef BOOST_NO_PRIVATE_IN_AGGREGATE //なぜか boost 対応･･･
protected:
#endif
	bool m_flag;
};


}//end of dkutil namepsace

#endif //end of include once