//Autor:        Philipp Muigg
//MatrikelNr:   0125958
//e-mail:       p.muigg@kabsi.at
//Beispielname: Konvneck (konvexes Vieleck)
//BeispielNr: 3254

import TLinie;
import TKoo2d;

//Diese Klasse verhält sich ähnlich wie eine linked list (man
//kann beliebig viele Objekte hineinschreiben und wieder auslesen)
//weiters ist es möglich den inhalt als array zurückzugeben
//(viele andere methoden von linked listen sind nicht eingebaut)

//WICHTIG: diese klasse fängt keine exceptions... dh es kann durchaus
//zu Cast oder ArrayOutOfBond exceptions kommen


public class TArrayAppendObj
{
//diese staticvariable gibt an um wieviel das array vergrößert werden soll, wenn es zu
//klein für zusätzliche daten ist (muss immer >0 sein)
  public static int vergrIntervall=10;

//in array werden die Daten gespeichert (vom typ Object damit verschiedene Objekte
//eingeschrieben werden können
  private Object[] array;

//aktObjZahl enthält die tatsächliche Anzahl von Objekten-1 die in array gespeichert sind
  private int aktObjZahl;

//die folgenden methoden gehören zum interface der Klasse und sind daher in der Dokumentatnion
//genauer erläutert.
  public int getObjZahl()
  {
    return aktObjZahl;
  }
  public Object[] getArray()
  {
    return array;
  }
  public Object getObject(int index)
  {
    return array[index];
  }

  public void trimArray()
  {
    setArraySize(aktObjZahl);
  }

//diese methode kopiert den inhalt von array in ein neues
//Array mit der größe gr+1 und setzt array dann auf dieses neu
//erzeugte objekt
  public void setArraySize(int gr)
  {
    Object[] arrayBuff=array;
    array=new Object[gr+1];

    aktObjZahl=-1;

//wenn die neue größe kleiner ist als die aktuelle können daten verloren gehen
//es dürfen innerhalb des arrays keine leeren elemente liegen (null), da sonst
//aktObjZahl einen falschen wert erhält
    for (int i=0; i<=Math.min(array.length-1,arrayBuff.length-1); i++)
    {
      array[i]=arrayBuff[i];
      if (array[i]!=null) aktObjZahl++;
      else break;
    }
  }
  public void clear()
  {
    aktObjZahl=-1;
    for (int i=0;i<=array.length-1;i++)
      array[i]=null;
  }

//methode zum hinzufügen von daten
  public boolean appendObject(Object obj)
  {
    if ((aktObjZahl+1<=array.length-1)&&(obj!=null))
    {
//wenn noch platz im array ist und obj nicht leer dann wird obj
//an der aktuellen position in array geschrieben
      aktObjZahl++;
      array[aktObjZahl]=obj;
      return true;
    }
    else if (obj!=null)
    {
//wenn nicht genug platz ist und obj nicht leer wird das array mit
//setArraySize vergrößert und obj wiederum in array eingeschrieben
      setArraySize(array.length+vergrIntervall-1);
      aktObjZahl++;
      array[aktObjZahl]=obj;
      return true;
    }
    else
    {
//wenn obj leer ist darf es nicht hinzugefügt werden
      return false;
    }
  }

//konstruktor der ein vorbereitetes Arrayobjekt erhält
  public TArrayAppendObj(Object[] a)
  {
    aktObjZahl=-1;
    array=a;
  }

//verschiedene getter methoden (genauere beschreibung in der
//Dokumentation)
//wenn diese klasse weiter verwendet werdensoll ist es sinnvoll
//weitere für den eigenen gebrauch sinnvolle methoden dieser
//art zu schreiben
  public String[] toTrimmedStringArray()
  {
    String[] arrayBuff=new String[aktObjZahl+1];
    for (int i=0;i<=aktObjZahl;i++)
      arrayBuff[i]=(String)array[i];
    return arrayBuff;
  }
  public String getString(int index)
  {
    return (String)getObject(index);
  }
  public TKoo2d[] toTrimmedTKoo2dArray()
  {
    TKoo2d[] arrayBuff=new TKoo2d[aktObjZahl+1];
    for (int i=0;i<=aktObjZahl;i++)
      arrayBuff[i]=(TKoo2d)array[i];
    return arrayBuff;
  }
  public TKoo2d getTKoo2d(int index)
  {
    return (TKoo2d)getObject(index);
  }
  public TLinie[] toTrimmedTLinieArray()
  {
    TLinie[] arrayBuff=new TLinie[aktObjZahl+1];
    for (int i=0;i<=aktObjZahl;i++)
      arrayBuff[i]=(TLinie)array[i];
    return arrayBuff;
  }
  public TLinie getTLinie(int index)
  {
    return (TLinie)getObject(index);
  }
}