//---------------------------------------
// Fail Jarjekord.java
//---------------------------------------

/** Ta"isarvude ja"rjekorra realisatsioon massiivi abil. */

public class Jarjekord {

   /** Peameetod (silumiseks). */

   public static void main (String[] argum) {
      Jarjekord q = new Jarjekord();
      System.out.println (q); // Tyhi
      q.lisa (1);
      System.out.println (q); // 1
      q.lisa (3);
      System.out.println (q); // 1 3
      int tulemus = q.eemalda();
      System.out.println (q); // 3
      System.out.println (tulemus); // 1
      Jarjekord koopia = q;
      System.out.println (koopia.equals (q)); //true
      try {
         koopia = (Jarjekord)q.clone();
      }
      catch (CloneNotSupportedException e) {
      }
      System.out.println (koopia.equals (q)); // true
      tulemus = koopia.eemalda();
      koopia.lisa (7);
      System.out.println (koopia.equals (q)); // false
      System.out.println (q); // 3
      System.out.println (koopia); // 7
   }

   /** ja"rjekord ise massiivina. */

   private int [] jrk;

   /** tipu indeks. */

   private int lKoht, eKoht, elArv;

   /** vaikekonstruktor teeb 10-elemendilise ja"rjekorra. */

   Jarjekord () {
      this (10);
   }

   /** etteantud elementide arvuga ja"rjekorra konstruktor. */

   Jarjekord (int suurus) {
      jrk = new int [suurus];
      lKoht = 0;  // lisamise indeks
      eKoht = 0;  // eemaldamise indeks
      elArv = 0;  // tegelik elementide arv
   }

   /** koopia loomine. */

   public Object clone() throws CloneNotSupportedException {
      Jarjekord tmp = new Jarjekord (jrk.length);
      tmp.lKoht = lKoht;
      tmp.eKoht = eKoht;
      tmp.elArv = elArv;
      if (elArv > 0)
         for (int i=0; i<elArv; i++)
            tmp.jrk [(i+eKoht)%jrk.length] = jrk [(i+eKoht)%jrk.length]; 
      return tmp;
   }

   /** alata"itumise kontroll. */

   public boolean jrkTyhi() {
      return (elArv <= 0);
   }

   /** yleta"itumise kontroll. */

   public boolean jrkLohki() {
      return (elArv >= jrk.length);
   }

   /** lisamine ja"rjekorda. */

   public void lisa (int a) {
      if (jrkLohki())
         throw new IndexOutOfBoundsException ("jarjekorra yletaitumine");
      elArv += 1;
      jrk [lKoht] = a;
      lKoht = (lKoht + 1)%jrk.length;
   }

   /** eemaldamine ja"rjekorrast. */

   public int eemalda() {
      if (jrkTyhi())
         throw new IndexOutOfBoundsException ("jarjekorra alataitumine");
      elArv -= 1;
      int tmp = jrk [eKoht];
      eKoht = (eKoht + 1)%jrk.length;
      return tmp;
   }

   /** ja"rjekordade v6rdsus. */

   public boolean equals (Object o) {
      if (((Jarjekord)o).elArv != elArv) return false;
      if (jrkTyhi()) return true; // teine ka tyhi!
      for (int i=0; i<elArv; i++)
         if (((Jarjekord)o).jrk
            [(i+((Jarjekord)o).eKoht)%((Jarjekord)o).jrk.length] !=
            jrk [(i+eKoht)%jrk.length]) return false;
      return true;
   }

   /** teisendus so'neks (viimane paremal). */

   public String toString() {
      if (jrkTyhi()) return "Tyhi";
      StringBuffer b = new StringBuffer();
      for (int i=0; i<elArv; i++)
         b.append (String.valueOf (jrk [(i+eKoht)%jrk.length]) + " ");
      return b.toString();
   }

} // Jarjekord lopp

//------------------------------------
// faili lopp
//------------------------------------

