///
/// \file Array.h
/// Implante une classe de stockage d'un tableau d'enregistrements (pointeurs) supportant l'ajout mais pas la suppression.
/// 
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///

#ifndef ____ARRAY____
#define ____ARRAY____

///
/// \class Array
/// Classe de stockage d'un tableau d'enregistrements (pointeurs) supportant l'ajout mais pas la suppression.
/// 
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
class Array {

  private :
    int sz;
    int sp;
    int spt;
    void ***t;
    int nb;

  public :

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

///
/// Constructeur pour un nouveau Array vide.
///
/// @param size La taille de bufferisation de l'objet Array.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    Array(int size);

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

///
/// Ajout d'un enregistrement en queue d'un Array.
///
/// @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);

///
/// Test de l'existence d'un enregistrement dans un Array.
///
/// @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 Array.
///
/// @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 Array.
///
/// @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);

///
/// Retour du nombre d'enregistrements stockes dans un Array.
///
/// @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);

///
/// Retour d'un tableau de void * alloue dynamiquement et contenant l'ensemble des enregistrements d'un Array.
///
/// @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 quantite de memoire utilisee pour la gestion d'un Array.
///
/// @return la quantite de memoire.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
    long getUsedMemory(void);

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

#endif
