#ifndef __QUEUE_AMV
	#define __QUEUE_AMV

#include "deque.h"

namespace amv	{

template <class type, class C=deque<type> >
class queue	{
	protected:
		C cnt;
	public:
		typedef C::value_type value_type;
		typedef C::size_type size_type;
		typedef C container_type;

		explicit queue(const C &c=C());
		bool empty() const;
		size_type size() const;
		value_type &front();
		const value_type &front() const;
		value_type &back();
		const value_type &back() const;
		void push(const value_type &newObject);
		void pop();

};

template <class type, class C>
inline queue<type,C>::queue(const C &c):
cnt(c)
{
}

template <class type, class C>
inline bool queue<type,C>::empty() const
{
return cnt.empty();
}

template <class type, class C>
inline queue<type,C>::size_type queue<type,C>::size() const
{
return cnt.size();
}

template <class type, class C>
inline queue<type,C>::value_type &queue<type,C>::front()
{
return cnt.front();
}

template <class type, class C>
inline const queue<type,C>::value_type &queue<type,C>::front() const
{
return cnt.front();
}

template <class type, class C>
inline queue<type,C>::value_type &queue<type,C>::back()
{
return cnt.back();
}

template <class type, class C>
inline const queue<type,C>::value_type &queue<type,C>::back() const
{
return cnt.back();
}

template <class type, class C>
inline void queue<type,C>::push(const value_type &newObject)
{
cnt.push_back(newObject);
}

template <class type, class C>
inline void queue<type,C>::pop()
{
cnt.pop_front();
}

}

#endif