/* 
 * File:   arraylist.h
 * Author: Arthur Brandao
 *
 * Created on 14 novembre 2018
 */

#ifndef ARRAYLIST_H
#define ARRAYLIST_H

/* --- Include --- */
#include "constante.h"

/* --- Structure --- */
typedef struct al_node al_node;
struct al_node{
    char* key; //Clef d'accès
    int(*handler)(char*); //Fonction
    al_node* prev; //Noeud precedent
    al_node* next; //Noeud suivant
};
typedef struct{
    al_node* first; //1er noeud
    al_node* last; //Dernier noeud
    int size; //Nombre de noeud
}arraylist;

/* --- Fonctions --- */
/**
 * Initialise une arraylist
 * @param arraylist* Arraylist allouée
 */
void arraylist_ini(arraylist*);

/**
 * Ajoute un noeud dans la liste
 * Si un noeud du meme nom existe deja le remplace
 * @param arraylist* Arraylist d'accueil
 * @param char* clef
 * @param int(*)(char*) Fonction
 * @return al_node* Le noeud ajouté
 */
al_node* arraylist_add(arraylist*, char*, int(*)(char*));

/**
 * Cherche un noeud
 * @param arraylist* Arraylist utilisée pour la recherche
 * @param char* La clef à chercher
 * @return NULL|al_node* Le noeud ou null si introuvable
 */
al_node* arraylist_search(arraylist*, char*);

/**
 * Appel la fonction d'un noeud
 * @param arraylist* Arraylist du noeud
 * @param char* Clef du noeud
 * @param char* Argument pour la fonction
 * @return int Resultat de la fonction ou -1 si introuvable
 */
int arraylist_call(arraylist*, char*, char*);

/**
 * Supprime un noeud
 * @param arraylist* Arraylist du noeud
 * @param al_node* Le noeud à supprimer
 */
void arraylist_delete(arraylist*, al_node*);

/**
 * Supprime un noeud identifié par une clef
 * @param arraylist* Arraylist du noeud
 * @param char* La clef du noeud
 * @return Noeud correctement supprimé
 */
boolean arraylist_remove(arraylist*, char*);

/**
 * Vide une Arraylist
 * @param arraylist* Arraylist à vider
 */
void arraylist_clean(arraylist*);

#endif /* ARRAYLIST_H */

