#ifndef __CPP_EXTENSIONS
#define __CPP_EXTENSIONS
#include<memory>

namespace std {
	template <class T, class Allocator> 
	class generic_container
	{
		public:
			typedef typename Allocator::reference             reference;
			typedef typename Allocator::const_reference       const_reference;
			typedef typename Allocator::size_type             size_type;
			typedef typename Allocator::difference_type       difference_type;
			typedef T                                         value_type;
			typedef Allocator                                 allocator_type;
			typedef typename Allocator::pointer               pointer;
			typedef typename Allocator::const_pointer         const_pointer;

			typedef typename Allocator::pointer               iterator;
			typedef typename Allocator::const_pointer         const_iterator;				
			typedef std::reverse_iterator<iterator>           reverse_iterator;
			typedef std::reverse_iterator<const_iterator>     const_reverse_iterator;

			virtual iterator               begin()           = 0;
			virtual const_iterator         begin() const     = 0;
			virtual iterator               end()             = 0;
			virtual const_iterator         end()   const     = 0;
			
			virtual reverse_iterator       rbegin()          = 0;
			virtual const_reverse_iterator rbegin() const    = 0;
			virtual reverse_iterator       rend()            = 0;
			virtual const_reverse_iterator rend() const      = 0;
	
	};

}
#endif
