#ifndef __STACK_AMV
	#define __STACK_AMV

#include "deque.h"

namespace amv	{

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

		explicit stack(const C &c=C());
		bool empty() const;
		size_type size() const;
		value_type &top();
		const value_type &top() const;
		void push(const value_type &newObject);
		void pop();

};

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

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

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

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

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

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

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

}

#endif