///
/// \file Vector.h
/// Implante une structure de stockage d'un vecteur (liste chainee ordonnee arbitrairement longue) d'enregistrements.
/// 
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///

#ifndef ____VECTOR____
#define ____VECTOR____

///
/// \class Vector
/// Structure de stockage d'un vecteur (liste chainee ordonnee arbitrairement longue) d'enregistrements memoire.
/// 
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
class Vector {

  public :
    typedef struct liste {
      void *p;
      struct liste *suiv; } liste;

  public :    
    static int cpt;

  protected :
    int taille;                  ///< Le nombre d'enregistrements stockes.
    struct liste *racine;        ///< La racine de la liste d'enregistrements.
    struct liste *fin;           ///< Le dernier element de la liste d'enregistrements.

  public :

///
/// Constructeur pour un nouveau Vector vide.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    Vector(void);

///
/// Destructeur pour un Vector (sans desallocation les enregistrements qu'il contient).
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    ~Vector(void);

///
/// Ajout d'un enregistrement en queue d'un Vector.
///
/// @param p L'enregistrement a ajouter en queue.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    void add(void *p);

///
/// Insertion d'un enregistrement dans un Vector.
///
/// @param index L'indice de la position d'insertion
/// @param p L'enregistrement a ajouter.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    void add(int index,void *p);

///
/// Test de l'existence d'un enregistrement dans un Vector.
///
/// @param p L'enregistrement a rechercher.
/// @return 1 si l'enregistrement a ete trouve, 0 sinon.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    int contains(void *p);

///
/// Recherche d'un enregistrement dans un Vector.
///
/// @param index L'indice de l'enregistrement a rechercher.
/// @return Le pointeur sur l'enregistrement trouve, NULL si l'index n'existe pas.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    void *elementAt(int index);

///
/// Recherche de l'indice d'un enregistrement present dans un Vector.
///
/// @param p L'enregistrement rechercher.
/// @return L'indice trouve, -1 si l'enregistrement n'existe pas.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    int indexOf(void *p);

///
/// Retrait d'un enregistrement d'un Vector.
///
/// @param index L'indice de l'enregistrement a retirer.
/// @return L'enregistrement a retirer, NULL s'il n'existe pas.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    void *remove(int index);

///
/// Retrait d'un enregistrement d'un Vector.
///
/// @param p L'enregistrement a retirer.
/// @return 1 si l'enregistrement a ete trouve et retire, 0 sinon.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    int remove(void *p);

///
/// Vidage d'un Vector sans desallocation de ses enregistrements.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    void removeAll(void);

///
/// Retrait d'un enregistrement d'un Vector.
///
/// @param index L'indice de l'enregistrement a retirer.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    void removeElementAt(int index);

///
/// Retour du dernier element du Vector.
///
/// @return Le dernier element.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    void *lastElement(void);

///
/// Retour du nombre d'enregistrements stockes dans un Vector.
///
/// @return Le nombre d'enregistrements actuellement stockes.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    int size(void);

///
/// Vidage d'un Vector et desallocation (free) de l'ensemble des enregistrements qu'il contient.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    void fullFree(void);

///
/// Vidage un Vector et delete de l'ensemble des enregistrements qu'il contient.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
//    void fullDelete(void);

///
/// Retour d'un tableau de void * alloue dynamiquement et contenant l'ensemble des enregistrements d'un Vector.
///
/// @return le tableau des enregistrements actuellement stockes (tableau alloue dynamiquement).
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    void **getArray(void);

///
/// Retour de la taille d'un Vector.
///
/// @return la taille.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    int tailleVector(void);

///
/// Retour de la quantite de memoire utilisee pour la gestion d'un Vector.
///
/// @return la quantite de memoire.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    size_t getUsedMemory(void);

///
/// Retour du nombre de handles memoires utilises pour la gestion d'un Vector.
///
/// @return le nombre de handles memoires.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    long getUsedHandles(void);
};

#endif
