import java.util.*;

public class ListeTp<T> implements TdaListeAvecCourant<T> {

    public ListeTp () {
        Liste =3D new ArrayList<T>();
        courant =3D INDEFINI;
    }

//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
    /**=20
     *  Verifie si le nombre d'elements de cette liste est zero.
     *  @return true si la liste est vide, false sinon.
     */
    public boolean estVide () {
        return Liste.isEmpty();
    }
//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D   =20
    /**=20
     *  Retourne le nombre d'elements de la liste.
     *  @return le nombre d'elements de la liste (un nombre >=3D 0)
     */
    public int longueur () {
        return Liste.size();
    }
//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D       =20
    /**=20
     *  Retourne l'objet a la position courante dans la liste.  La =
position courante n'est pas modifiee.  La liste n'est pas modifiee.
     *  Si la liste est vide, null est retourne
     *  @return l'objet a la position courante si la liste n'est pas =
vide, null sinon
     */
    public T elementCourant () {
        T reponse;
        if (estVide()) {
            reponse =3D null;
        } else {
            reponse =3D Liste.get (courant);
        }
        return reponse;
    }
//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D   =20
    public void placerCourantAuDebut () {
        if (!estVide()) {
            courant =3D 0;
        }
    }
//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D   =20
    public void placerCourantAlaFin () {
        if ( !estVide() ) {
            courant =3D Liste.size() - 1;
        }
    }
//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
    /**
     *  Avance la position de l'element courant d'une position.  Si la =
liste est vide ou si la position de l'element
     *  courant est la derniere position (le dernier element de la =
liste), la position de l'element courant n'est pas modifiee.
     */
    public void avancer () {
        if (!estVide() && !courantEstDernier()) {
            courant =3D courant + 1;
        }
    }
//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D   =20
    /**
     *  Recule la position de l'element courant d'une position.  Si la =
liste est vide ou si la position de l'element
     *  courant est la premiere position (le premier element de la =
liste), la position de l'element courant n'est pas modifiee.
     */
    public void reculer () {
        if ( !estVide() && !courantEstPremier() ) {
            courant =3D courant - 1;
        }
    }
//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D   =20
    /**=20
     *  Insere elem a la position qui precede l'element courant si la =
liste n'est pas vide.
     *  Si la liste est vide, la liste contiendra ce nouvel element.
     *  La position de l'element courant, apres l'insertion, est la =
position de l'element insere.
     *  @param elem l'objet a inserer
     */
    public void insererAvantCourant ( T elem ) {
        if ( estVide() ) {
            Liste.add ( elem );
            courant =3D 0;
        } else {
            Liste.add ( courant, elem );
        }
    }
//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
    /**=20
     *  Insere l'objet elem a la position qui suit l'element courant si =
la liste n'est pas vide.
     *  Si la liste est vide, la liste contiendra ce nouvel element.
     *  La position de l'element courant, apres l'insertion, est la =
position de l'element insere.
     *  @param elem l'objet a inserer
     */
    public void insererApresCourant ( T elem ) {
        if ( estVide() ) {
            Liste.add ( elem );
            courant =3D 0;
        } else {
            courant =3D courant + 1;
            Liste.add ( courant, elem );
        }
    }
//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D   =20
    /**=20
     *  Retire de la liste l'element en position courante.  Si la liste =
est vide, rien n'est modifie.
     *  Si la liste ne contenait qu'un seul element, l'element courant =
n'existe plus (indefini) et la liste est vide.
     *  Si l'element retire etait le dernier de la liste (liste d'au =
moins deux elements), la position de l'element courant est la position =
du
     *  premier element de la liste.  Dans tous les autres cas (liste =
d'au moins deux elements), l'element courant est l'element qui suivait
     *  l'element retire, avant son retrait.
     *  @return null si la liste est vide, sinon, retourne l'element =
retire a la position courante.
     */
    public T retirerCourant() {
        T reponse =3D null;
        if ( !estVide() ) {
            reponse =3D Liste.remove ( courant );
            if ( estVide() ) {
                courant =3D INDEFINI;
            } else if ( courant =3D=3D Liste.size() ) { // on a enleve =
l'element de la derniere position
                courant =3D 0;
            }
        }
        return reponse;
    }
//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D   =20
    /**=20
     *  Si la liste n'est pas vide et que la position de l'element =
courant est la premiere position, true sera retourne, false dans tous =
les autres cas.
     *  @return true si l'element courant est le premier element de la =
liste, false si la liste est vide ou si ce n'est pas le premier element.
     */
    public boolean courantEstPremier() {
        return !estVide() && courant =3D=3D 0;
    }
//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
    /**=20
     *  Si la liste n'est pas vide et que la position de l'element =
courant est la derniere position, true sera retourne, false dans tous =
les autres cas.
     *  @return true si l'element courant est le dernier element de la =
liste, false si la liste est vide ou si ce n'est pas le dernier element.
     */
    public boolean courantEstDernier() {
        return !estVide() && courant =3D=3D Liste.size() - 1;
    }
//=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
    private static final int INDEFINI =3D -1;
    private ArrayList<T> Liste;
    private int courant;
   =20
} // ListeTp