#include "list.hpp"

//#include <list>
#include <iostream>
using namespace std;

int main()
{

	list<int> mylist;			//appel du constructeur de liste 
    //sans paramètre et met premier à NULL

	list<int>::iterator it;		//appel du constructeur d’itérateur 
    //sans paramètre et met courant à NULL

	it = mylist.begin();		//retourne un itérateur qui pointe au début 
    //de la liste, où courant = NULL et 
    //laListe = &mylist

    //ajoute 1, 2, 3 à la fin car it=NULL
    for (int i=1; i<=3; i++)
		mylist.insert(it,i);

	it--;
    //courant recule d’un élément et 
    //donc pointe sur le dernier (3)

    mylist.insert (it,10);		// 1 2 10 3 et courant pointe sur 3
	cout << *it << endl;
	
	it = mylist.insert(it,20);  	// 1 2 10 20 3 et courant pointe sur 20
    cout << *it << endl;

	it = mylist.erase(it);  	// 1 2 10 3 et courant pointe sur 3
						// très important it=, sinon it pointe 
						// sur une cellule désaloué

    cout << "mylist contains:";
	for (it=mylist.begin(); it!=mylist.end(); it++)
		cout << " " << *it;
	cout << endl << endl;

/*
Pour chaque cas limites et dîtes ce qui se passe :
*/
    cout << "Insérer dans une liste vide avec un itérateur au début : \n";
    list<int> mylist2;
    it = mylist2.begin();
    mylist2.insert(it, 5);
    cout << "mylist contains:";
	for (it=mylist2.begin(); it!=mylist2.end(); it++)
		cout << " " << *it;
    cout << endl << endl;
    
    cout << "Insérer dans une liste vide avec un itérateur à la fin : \n";
    list<int> mylist3;
    it = mylist3.end();
    mylist3.insert(it, 6);
    cout << "mylist contains:";
	for (it=mylist3.begin(); it!=mylist3.end(); it++)
		cout << " " << *it;
    cout << endl << endl;
    
    cout << "Insérer dans une liste non vide avec un itérateur qui n’a pas été positionné avec begin ou end : \n";
    list<int>::iterator rien;
//    mylist.insert(rien, 7);
    cout << "assertfail" << endl << endl;
    
    cout << "Insérer dans une liste non vide avec un itérateur qui est au début : \n";
    it = mylist.begin();
    mylist.insert(it, 8);
    cout << "mylist contains:";
	for (it=mylist.begin(); it!=mylist.end(); it++)
		cout << " " << *it;
    cout << endl << endl;
    
    cout << "Insérer dans une liste non vide avec un itérateur qui est à la fin : \n";
    it = mylist.end();
    mylist.insert(it, 9);
    cout << "mylist contains:";
	for (it=mylist.begin(); it!=mylist.end(); it++)
		cout << " " << *it;
    cout << endl << endl;
    
    cout << "Insérer dans une liste non vide avec un itérateur qui est à une cellule avant la fin : \n";
    it = mylist.end();
    it--;
    mylist.insert(it, 10);
    cout << "mylist contains:";
	for (it=mylist.begin(); it!=mylist.end(); it++)
		cout << " " << *it;
    cout << endl << endl;
    
    cout << "Faire ++ ou -- d’un iterateur qui n’a pas été positionné avec begin ou end : \n";
//    rien--;
//    rien++;
    cout << "assertfail" << endl << endl;
    
    cout << "Faire ++ d’un iterateur qui est à la fin avec end : \n";
    it = mylist.end();
    it++;
    cout << *it << endl << endl;
    
    cout << "Faire -- d’un iterateur qui est au début avec begin : \n";
    it = mylist.begin();
    it--;
    cout << *it << endl << endl;
    
    cout << "Faire * d’un iterateur qui n’a pas été positionné avec begin ou end : \n";
//    cout << *rien << endl;
    cout << "assertfail" << endl << endl;
    
    cout << "Faire * d’un iterateur qui a été positionné à la fin avec end : \n";
//    it = mylist.end();
    cout << *it << endl << endl;
    
    cout << "Supprimer dans une liste vide avec un itérateur au début : \n";
    it = mylist.begin();
    cout << *it << endl << endl;
    
    cout << "Supprimer dans une liste vide avec un itérateur non positionné : \n";
    list<int> vide;
//    vide.erase(rien);
    cout << "assertfail" << endl << endl;
    
    cout << "Supprimer dans une liste non vide avec un itérateur qui n’a pas été positionné avec begin ou end : \n";
//    mylist.erase(rien);
    cout << "segfault" << endl << endl;
    
    cout << "Supprimer dans une liste non vide avec un itérateur au début : \n";
    mylist.erase(mylist.begin());
    cout << "mylist contains:";
	for (it=mylist.begin(); it!=mylist.end(); it++)
		cout << " " << *it;
    cout << endl << endl;
    
    cout << "Supprimer dans une liste non vide avec un itérateur à la fin : \n";
//    mylist.erase(mylist.end());
    cout << "assertfail" << endl << endl;
    
    cout << "Supprimer dans une liste non vide avec un itérateur sur le dernier élément : \n";
    it = mylist.end();
    it--;
    mylist.erase(it);
    cout << "mylist contains:";
	for (it=mylist.begin(); it!=mylist.end(); it++)
		cout << " " << *it;
    cout << endl << endl;


    cout << "5. Quel sera le contenu de la liste après chaque boucle" << endl;

    it = mylist.begin();
    for(int i=1; i<5; i++)
	    mylist.insert(it,i);

    cout << "mylist contains:";
	for (it=mylist.begin(); it!=mylist.end(); it++)
		cout << " " << *it;
    cout << endl << endl;

    it = mylist.begin();
    for(int i=1; i<5; i++)
	    it = mylist.insert(it,i);

    cout << "mylist contains:";
	for (it=mylist.begin(); it!=mylist.end(); it++)
		cout << " " << *it;
    cout << endl << endl;
    
    it = mylist.begin();
    for(int i=1; i<5; i++, it++)
	    it = mylist.insert(it,i);

    cout << "mylist contains:";
	for (it=mylist.begin(); it!=mylist.end(); it++)
		cout << " " << *it;
    cout << endl << endl;
    

    return 0;
}
