package td5;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Iterator;

public class ListeChainee implements Serializable, Iterable<Integer>{
	private static final long serialVersionUID = 1L;

	private int valeur =0;
	  private ListeChainee suivant;

	  public ListeChainee(){}
	  private ListeChainee(int valeur){
		  this.valeur=valeur;
	  }
	  
	  public void add(int x){
		  ListeChainee courant=this;
		  while(courant.suivant != null)
			  courant=courant.suivant;
		  courant.suivant = new ListeChainee(x);
		  this.valeur++;
	  }
	  
	  public boolean remove(int x){
		  ListeChainee courant=this;
		  while(courant.suivant != null && courant.suivant.valeur!= x)
			  courant=courant.suivant;
		  if(courant.suivant == null)
			  return false;
		  courant.suivant = courant.suivant.suivant;
		  this.valeur--;
		  return true;
	  }
	  
	  public int size(){
		  return valeur;
	  }
	  
	  // Sans iterateur
	  /*
	  @Override
	  public String toString(){
		  StringBuffer buffer= new StringBuffer("[ ");
		  for(ListeChainee cellule = this.suivant; cellule !=null; cellule = cellule.suivant){
			buffer.append(cellule.valeur).append(' ');
		  }
		  buffer.append(']');
		  return buffer.toString();
	  }
	  */
	  
	  // Avec iterateur
	  @Override
	  public String toString(){
		  StringBuffer buffer= new StringBuffer("[ ");
		  for(int x : this)
			buffer.append(x).append(' ');
		  buffer.append(']');
		  return buffer.toString();
	  }

	  public void save(String name){
		  FileOutputStream output = null;
		  try {
			output = new FileOutputStream(name);
			ObjectOutputStream objectOutput = new ObjectOutputStream(output);
			objectOutput.writeObject(this);
		  } catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			  if(output!=null) ;
		  }  
	  }
	  
	  public static ListeChainee load(String name){
		  FileInputStream input = null;
		  try {
			input = new FileInputStream(name);
			ObjectInputStream objectInput = new ObjectInputStream(input);
			return (ListeChainee) objectInput.readObject();
		  } catch (FileNotFoundException e) {
			e.printStackTrace();
		  } catch (IOException e) {
			e.printStackTrace();
		  } catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			  if(input!=null) ;
		  }
		  return null;
	  }
	  
	  public Iterator<Integer> iterator(){
		  return new ListeIterateur(this);
	  }
	  
	  
	  //package (seul l'iterateur est suppose utiliser cette methode)
	  int getValeur(){
		  return valeur;
	  }
	  
	  ListeChainee getSuivant(){
		  return suivant;
	  }
}
	  

