#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include "vecteur.h"

#define NB_ELEM_INITIAL    3

struct vecteur
{
  void **debut;
  long taille;
  long nombre_elements;
  int  mode_bavard;
};


vecteur 
vecteur_creer(void)
{
  vecteur recv = malloc(sizeof(struct vecteur));
  assert(recv != NULL);

  recv->debut = calloc(NB_ELEM_INITIAL, sizeof(void*));
  assert(recv->debut != NULL);

  recv->taille = NB_ELEM_INITIAL;
    recv->nombre_elements = 0;
  recv->mode_bavard = 0;
  return recv;
}


void vecteur_detruire(vecteur recv)
{
  free(recv->debut);
  free(recv);
}


void vecteur_ecrire(vecteur recv, int indice, void *valeur)
{
  void **p;
  long taille = recv->taille;

  while (indice >= taille) 
    taille = 2 * taille + 1;

  if (taille > recv->taille) 
    {
      recv->debut = realloc(recv->debut, taille * sizeof(void*));
      assert(recv->debut != NULL);
      for (p = recv->debut + recv->taille; p < recv->debut + taille; p++)
	*p = NULL;
             
      if (recv->mode_bavard)
	{
	  fprintf(stderr, ">>vecteur: extension de %d a %d\n", recv->taille, taille);
	}
      recv->taille = taille;
    }
  recv->debut[indice] = valeur;
  if (recv->nombre_elements < indice+1)
    recv->nombre_elements = indice+1;
}


void *vecteur_lire(vecteur recv, int indice)
{
  assert(indice >= 0);
  assert(indice < recv->nombre_elements);
  return recv->debut[indice];
}


int vecteur_nombre_elements(vecteur recv)
{
  return recv->nombre_elements;
}


void vecteur_mode_bavard(vecteur recv, int mode)
{
  recv->mode_bavard = mode;
}