/**
 * \file bsort.h
 * \brief Bibliothèque de fonctions génériques de tri/affichage
 * \author Nicolas B.
 * \version 1.0
 * \date 11 novembre 2017
 *
 * Bibliothèque de fonctions génériques de tri/affichage de containers.
 *
 */

#ifndef _BSORT_H
#define _BSORT_H

#include <stddef.h>

/**
 * \fn extern void bsort(void *base, size_t nmemb, size_t size, 
		  int (*compar)(const void *, const void *),
		  void * (*next_f)(const void *))
 * \brief Tri générique d'un tableau de n'importe quoi.
 * \author Nicolas B.
 * \param base Base du tableau.
 * \param nmemb Nombre d'éléments dans le tableau.
 * \param size Taille d'un élément du tableau.
 * \param compar Fonction de comparasion de deux éléments, passés par adresse.
 * \param next_f Fonction retournant l'adresse du prochain élément à partir de celle du courant.
 * \return Rien du tout !
 */
extern void bsort(void *base, size_t nmemb, size_t size, 
		  int (*compar)(const void *, const void *),
		  void * (*next_f)(const void *));
/**
 * \fn extern void bsort2(void *base, size_t nmemb, void (*swap)(void *, void*), 
		  int (*compar)(const void *, const void *),
		  void * (*next_f)(const void *))
 * \brief Tri générique d'un conteneur itérable de n'importe quoi.
 * \author Nicolas B.
 * \param base Base du tableau.
 * \param nmemb Nombre d'éléments dans le tableau.
 * \param swap Echange des deux éléments donnés en paramètres.
 * \param compar Fonction de comparasion de deux éléments, passés par adresse.
 * \param next_f Fonction retournant l'adresse du prochain élément à partir de celle du courant.
 * \return Rien du tout !
 */
extern void bsort2(void *base, size_t nmemb, void (*swap)(void *, void*), 
		  int (*compar)(const void *, const void *),
		  void * (*next_f)(const void *));

/**
 * \fn extern int bprint(void *base, size_t nmemb,
		  int (*print_elt)(const void *),
		  int (*print_sep)(void),
		  const void * (*next_f)(const void *))
 * \brief Tri générique d'un conteneur itérable de n'importe quoi.
 * \author Nicolas B.
 * \param base Base du tableau.
 * \param nmemb Nombre d'éléments dans le tableau.
 * \param print_elt Affichage d'un élément dont on donne l'adresse
 * \param print_sep Affichage du séparateur d'éléments
 * \param next_f Fonction retournant l'adresse du prochain élément à partir de celle du courant.
 * \return Nombre d'éléments affichés.
 */
extern int bprint(void *base, size_t nmemb,
		  int (*print_elt)(const void *),
		  int (*print_sep)(void),
		  const void * (*next_f)(const void *));
#endif
