#ifndef __PITERATOR_H__
#define __PITERATOR_H__

#include "PElement.h"


///@brief classe qui permet de parcourir la PList
template <class T>
class PIterator{
	public:
		PIterator();
		PIterator(PElement<T>* element);
		PIterator(const PIterator<T> & it);
		virtual ~PIterator();
		
		PIterator & operator = (const PIterator<T> & it);
		PIterator & operator += (int nb);
		PIterator & operator -= (int nb);
		PIterator & operator ++ ();
		PIterator & operator ++(int nb);
		PIterator & operator -- ();
		PIterator & operator -- (int nb);
		//il faut peut être le mettre const
		T* operator -> () const;
		T & operator* () const;
		
		void next();
		void next(int nb);
		void prev();
		void prev(int nb);
		
		///définition de l'opérateur == pour les PIterator
		/**	@param it1 : PIterator
		 * 	@param it2 : PIterator
		 * 	@return true si les PIterators sont égaux, false sinon
		*/
		friend bool operator == (const PIterator<T> & it1, const PIterator<T> & it2){
			return (it1.p_element == it2.p_element);
		}
		
		///définition de l'opérateur != pour les PIterator
		/**	@param it1 : PIterator
		 * 	@param it2 : PIterator
		 * 	@return true si les PIterators sont différents, false sinon
		*/
		friend bool operator != (const PIterator<T> & it1, const PIterator<T> & it2){
			return (it1.p_element != it2.p_element);
		}
		
		PElement<T>* p_element;
		
	private:
		void copyPIterator(const PIterator<T> & it);
		
		
		
};




#include "PIterator_impl.h"


#endif
