package espressioni;

public class EspressioneScelta extends EspressioneStringa {

// contiene tre cose: una espressione intera e due
// espressioni stringa

  private EspressioneIntera cond;
  private EspressioneStringa ifTrue, ifFalse;

// costruttore

  public EspressioneScelta(EspressioneIntera c,
                           EspressioneStringa t, EspressioneStringa f) {
    if((null==c)||(null==t)||(null==f))
      throw new RuntimeException("Tentativo di creazione di EspressioneScelta con condizione e/o espressioni null");

    cond=c;
    ifTrue=t;
    ifFalse=f;
  }

// metodi get: dato che le espressioni non sono
// modificabili, possiamo anche restituirle

  public EspressioneIntera getCond() {
    return cond;
  }

  public EspressioneStringa getTrue() {
    return ifTrue;
  }

  public EspressioneStringa getFalse() {
    return ifFalse;
  }

// toString: qui sfruttiamo i toString delle componenti per
// realizzare il nostro

  public String toString() {
    return "if("+cond+","+ifTrue+","+ifFalse+")";
  }

// equals

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

    EspressioneScelta s=(EspressioneScelta) o;

    return this.cond.equals(s.cond) &&
           this.ifTrue.equals(s.ifTrue) &&
           this.ifFalse.equals(s.ifFalse);
  }

// hashCode

  public int hashCode() {
    int s=3;

    s=5*s+cond.hashCode();
    s=5*s+ifTrue.hashCode();
    s=5*s+ifFalse.hashCode();

    return s;
  }

// clone

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

    s.cond=(EspressioneIntera) s.cond.clone();
    s.ifTrue=(EspressioneStringa) s.ifTrue.clone();
    s.ifFalse=(EspressioneStringa) s.ifFalse.clone();

    return s;
  }

}
