namespace std
{
	template<typename Tp_,typename _Sequence=list<Tp_> >
		class queue
		{
			public:
				typedef typename _Sequence::size_type 		size_type;
				typedef typename _Sequence::reference 		reference;
				typedef typename _Sequence::const_reference const_reference;
				typedef typename _Sequence::value_type 		value_type;
				typedef _Sequence							container_type;

			protected:
				_Sequence c;

			public:
				queue():c() {}
				queue(const _Sequence& __c):c(__c) {}
				queue(const queue<value_type>& __q) {*this=__q;}
				~queue() {}

				reference front() {return c.front();}
				reference back()  {return c.back();}

				void push(const value_type& x)    {c.push_back(x);}
				void emplace(const value_type& x) {c.emplace_back(x);}

				void pop() {c.pop_front();}

				size_type size() {return c.size();}
				bool empty() 	 {return c.empty();}
				void swap(const queue<value_type>& __q)
				{
					using std::swap;
					swap(c,__q.c);
				}

				bool operator==(const queue<value_type>& b) {return c==b.c;}
				bool operator<(const queue<value_type>& b) {return c<b.c;}
		};

}