import java.util.Iterator;
import java.util.NoSuchElementException;

public class MaListeTableau<E> implements Iterable<E> {
    private E[] elements;   // Tableau pour stocker les éléments
    private int size = 0;   // Nombre d'éléments dans la liste

    // Taille initiale du tableau
    private static final int INITIAL_CAPACITY = 10;

    // Constructeur
    public MaListeTableau() {
        elements = (E[]) new Object[INITIAL_CAPACITY];
    }

    // Ajoute un élément à la fin de la liste
    public void add(E element) {
        ensureCapacity();
        elements[size++] = element;
    }

    // Ajoute un élément à une position spécifique
    public void add(int index, E element) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        ensureCapacity();
        // Décaler les éléments vers la droite pour insérer à l'index
        for (int i = size; i > index; i--) {
            elements[i] = elements[i - 1];
        }
        elements[index] = element;
        size++;
    }

    // Retourne l'élément à une position spécifique
    public E get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        return elements[index];
    }

    // Retourne la taille de la liste
    public int size() {
        return size;
    }

    // Assure la capacité du tableau pour accueillir plus d'éléments
    private void ensureCapacity() {
        if (size == elements.length) {
            E[] newElements = (E[]) new Object[elements.length * 2];
            System.arraycopy(elements, 0, newElements, 0, elements.length);
            elements = newElements;
        }
    }

    // Méthode pour l'itération
    @Override
    public Iterator<E> iterator() {
        return new Iterator<E>() {
            private int currentIndex = 0;

            @Override
            public boolean hasNext() {
                return currentIndex < size;
            }

            @Override
            public E next() {
                if (!hasNext()) {
                    throw new NoSuchElementException();
                }
                return elements[currentIndex++];
            }
        };
    }
}
