package linguaggio;

// ci servono le liste e gli iteratori

import java.util.*;

public class IstruzioneSequenza extends Istruzione {

// una sequenza di istruzioni e' una lista di istruzioni;
// quindi, la rappresentiamo come una List di oggetti
// Istruzione

// deve essere accessibile a livello di package perche'
// serve alla classe iteratore

  List<Istruzione> sequenza;

// costruttore che crea la sequenza vuota a cui possiamo
// aggiungere istruzioni

  public IstruzioneSequenza() {
    sequenza=new LinkedList<Istruzione>();
  }

// notare che la componente e' List<Istruzione> ossia una
// interfaccia, mentre l'oggetto non puo' che essere di una
// classe

// come modifiche, consideriamo solo l'aggiunta di
// istruzioni

  public void add(Istruzione i) {
    sequenza.add(i);
  }

// per leggere la lista, si restituisce un iteratore
// apposito

  public Iterator<Istruzione> iterator() {
    return new IteratorSequenza(this);
  }

// metodo toString come richiesto

  public String toString() {
    String s="(";

    Iterator<Istruzione> i=sequenza.iterator();

    while(i.hasNext()) {
      s=s+i.next();
	// niente vigola se era l'ultimo
      if(i.hasNext())
        s=s+",";
    }

    return s+")";
  }

// metodo equals: qui possiamo semplicemente fidarci del
// fatto che la lista non e' vuota, e che ha il metodo
// equals corretto

  public boolean equals(Object o) {
    if(o==null)
      return false;

    if(o.getClass()!=this.getClass())
      return false;

    IstruzioneSequenza s=(IstruzioneSequenza) o;

    return s.sequenza.equals(this.sequenza);
  }

// metodo hashCode: il solito

  public int hashCode() {
    int res=7;

    Iterator i=sequenza.iterator();

    while(i.hasNext())
      res=5*res+i.next().hashCode();

    return res;
  }

// metodo clone

  public Object clone() {
    IstruzioneSequenza s=(IstruzioneSequenza) super.clone();

// il cast serve perche' List non ha clone

   s.sequenza=(List<Istruzione>)
      ((LinkedList) s.sequenza).clone();

// il ListIterator si trova con il metodo listIterator

    ListIterator<Istruzione> it=s.sequenza.listIterator();

    while(it.hasNext()) {
      Istruzione i=(Istruzione) it.next().clone();
      it.set(i);
    }
    return s;

  }
}


