// i requisiti specificano che questa e' una sequenza (non
// un insieme) di istruzioni di stampa

import java.util.*;

class IstruzioneSequenza extends Istruzione {

// usiamo List invece che LinkedList, come nome della
// variabile; questo permette di passare ad un'altra
// implementazione di List, se serve

  private List seq;

// creazione lista vuota: qui va specificato la classe
// effettiva della lista

  public IstruzioneSequenza() {
    seq=new LinkedList();
  }

// metodo get: in questo caso, si restituisce un iteratore;
// questo permette eventualmente di restringere il tipo di
// modifiche che e' possibile fare alla lista

  public ListIterator getIteratore() {
    return seq.listIterator();
  }

// non servono metodi set dato che gli iteratori si possono
// usare sia per leggere che per scrivere nella lista

// il metodo toString non va bene: e' richiesto che la
// stampa sia nel formato
// "(istruzione,istruzione,...,istruzione)"

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

    Iterator i=seq.iterator();
    while(i.hasNext()) {
      s=s+i.next();
      if(i.hasNext())
        s=s+",";
    }

    return s+")";
  }

// equals e hashCode possono venire implementati sapendo che
// LinkedList hanno questi metodi

  public boolean equals(Object o) {
    if(!this.stessaClasse(o))
      return false;

    IstruzioneSequenza s=(IstruzioneSequenza) o;

    if(this.seq==null)
      return s.seq==null;

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

  public int hashCode() {
    if(this.seq==null)
      return 0;

    return this.seq.hashCode();
  }

// il metodo clone richiede la clonazione profonda; quindi,
// non va clonata solo la lista ma anche tutti i suoi
// elementi, che possiamo assumere essere istruzioni di
// stampa

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

    s.seq=new LinkedList();

    Iterator i=this.seq.iterator();

// notare che istruzioni possono valere null

    while(i.hasNext()) {
      IstruzioneStampa a=(IstruzioneStampa) i.next();
      if(a==null)
        s.seq.add(null);
      else
        s.seq.add(a.clone());
    }

    return s;
  }

}

