package cap19.codaprioritaria;

import cap13.coda.*;
import java.util.*;

public class CodaPrioritaria<T> implements Coda<T>
{ private ArrayList<Coda<T>> code;
  private int numPrio;
  public CodaPrioritaria(int numPrio) throws ErrorePrio
  { if (numPrio <= 0)
      throw new ErrorePrio(numPrio);
    code = new ArrayList<Coda<T>>(numPrio);
    for (int i = 0; i < numPrio; i++)
      code.add(i, new CodaSemplice<T>());
    this.numPrio = numPrio;
  }
  private Coda<T> primaNonVuota()
  { for (Coda<T> c : code)
      if (!c.vuota())
        return c;
    return null;
  }
  public boolean vuota()
  { return primaNonVuota() == null;
  }
  public void in(T info)
  { code.get(numPrio - 1).in(info);
  }
  public T out() throws CodaVuotaException
  { Coda<T> c = primaNonVuota();
    if (c == null)
      throw new CodaVuotaException();
    return c.out();
  }
  public void inPrio(T info, int prio) throws ErrorePrio
  { if ((prio < 0) || (prio >= numPrio))
      throw new ErrorePrio(numPrio);
    code.get(prio).in(info);
  }
}
