/**
 * \file darray.h
 * \brief Implémentation de \ref darray_t et déclaration des fonctions pour ce type
 */

#ifndef DARRAY_H
#define DARRAY_H

#include "errorcodes.h"
#include <stdlib.h>

/**
 * \struct darray_s
 * \brief Tableau dynamique
 *
 * Les objets `darray_s` offrent la possibilité d’avoir des tableaux à taille
 * variable en C, similairement aux objets `vector` en C++.
 */
typedef struct darray_s {
  void *begin; /*!< Pointeur sur le premier élément du tableau */
  void *end; /*!< Pointeur sur l’élément situé immédiatement après le dernier élément du tableau */
  size_t element_size; /*!< Taille des éléments stockés dans le tableau */
  size_t capacity; /*!< Capacité maximale du tableau actuel (non destinée à l’utilisateur) */
} darray;

/// \brief Créé un nouvel objet \ref darray vide
darray *darrayNew(size_t element_size);
/// \brief Augmente la capacité d'un \ref darray
void darrayExtend(darray *self);
/// \brief Insère un élément à l’endroit pointé dans un \ref darray
void  darrayInsert(darray *self, void *pos, void *elem);
/// \brief Supprime l’élément pointé dans l’objet \ref darray
void  darrayErase(darray *self, void *pos);
/// \brief Retourne l’élément du \ref darray au idx-ème index
void *darrayGet(darray *self, size_t idx);
/// \brief Insère un élément à la fin de l’élément \ref darray
void  darrayPushBack(darray *self, void *elem);
/// \brief Supprime le dernier élément de l’élément \ref darray
void  darrayPopBack(darray *self);
/// \brief Détruit l’élément \ref darray
void  darrayDelete(darray *self);
/// \brief Renvoie la taille de l’élément \ref darray
size_t darraySize(darray *self);
/// \brief Renvoie la taille de l’élément \ref darray
size_t darrayElemSize(darray *self);

#endif /* DARRAY_H */
