------------------------------------------------------------------------------------------
-- Nom fichier      : gestion_club.ads                                                  --
-- Auteur           : Julien Burdy                                                      --
-- Date             : 27 Avril 2001                                                     --
--                                                                                      --
-- But              : Paquetage permettant de gérer les membres d'un club sportif.      --
--                      Adhérer,Démissionner,Afficher,Sauvegarde,etc... les membres.    --
--                                                                                      --
--                                                                                      --
-- Date de modif.   :                                                                   --
-- Raison           :                                                                   --
-- Modules appeles  :                                                                   --
-- Mat. particulier :                                                                   --
--                                                                                      --
-- Compilation      : Compilateur Gnat 3.13                                             --
-- Édition de liens : GnatLink de Gnat                                                  --
-- Mode d'exécution : Console                                                           --
------------------------------------------------------------------------------------------

with Ada.Text_IO; -- pour le type File_Type

package Gestion_Club is


   -- Type de tri possible
   type T_Genre_Tri is ( Par_Nom, Par_No );


   -- Longueur Max d'un nom ou d'un prénom
   Lngr_Mot_Max : constant Natural := 100;


   -- Le type club
   type T_Club is limited private;


   -- Exceptions propre au paquetage
   Membre_Inexistant : exception ; -- Le membre n'existe pas
   Liste_Pleine      : exception ; -- Il n'y a plus de place pour adhérer ce membre
   Nom_Non_Unique    : exception ; -- Risque de confusion si plusieurs membre du même nom



------------------------------------------------------------------------------------------
-- Constructeurs =========================================================================
------------------------------------------------------------------------------------------

   ---------------------------------------------
   -- Nom : Creer_Club
   -- But : Créer un nouveau club vide
   --
   -- Paramètres    out : Club = le club a créer
   -- Paramètres in out : -
   -- Paramètres in     : -
   -- Exception         : -
   procedure Creer_Club ( Club : out T_Club );



------------------------------------------------------------------------------------------
-- Modificateurs =========================================================================
------------------------------------------------------------------------------------------

   -----------------------------------------------------------------------------------
   -- Nom : Adherer
   -- But : Adhérer un nouveau membre dans un club
   --
   -- Paramètres    out : -
   -- Paramètres in out : Club = Le club dans lequel on adhère le membre
   -- Paramètres in     : Nom_Membre,Prenom_Membre = le nom et prénom du membre
   -- Exception         : Liste_Pleine = Il n'y a plus de place pour adhérer ce membre
   procedure Adherer ( Club : in out T_Club; Nom_Membre, Prenom_Membre : in String);


   --------------------------------------------------------------------------
   -- Nom : Demissionner
   -- But : Démissionner un membre d'un club par son No
   --
   -- Paramètres    out : -
   -- Paramètres in out : Club = Le club dans lequel on démissionne le membre
   -- Paramètres in     : No_Membre = le numéro du membre a démissionner
   -- Exception         : Membre_Inexistant = si le membre n'existe pas
   procedure Demissionner ( Club : in out T_Club ; No_Membre : in Positive );


   --------------------------------------------------------------------------
   -- Nom : Demissionner
   -- But : Démissionner un membre d'un club par son No
   --
   -- Paramètres    out : -
   -- Paramètres in out : Club = Le club dans lequel on démissionne le membre
   -- Paramètres in     : Nom_Membre = le nom du membre a démissionner
   -- Exception         : Membre_Inexistant = si le membre n'existe pas
   --                   : Nom_Non_Unique = Risque de confusion de nom
   procedure Demissionner ( Club : in out T_Club ; Nom_Membre : in String );



------------------------------------------------------------------------------------------
-- Sélecteurs ============================================================================
------------------------------------------------------------------------------------------

   --------------------------------------------------------------------
   -- Nom : Afficher
   -- But : Afficher un membre d'un club
   --
   -- Paramètres    out : -
   -- Paramètres in out : -
   -- Paramètres in     : No_Membre = le numéro du membre a afficher
   --                   : Club = Le club contenant le membre a afficher
   -- Exception         : Membre_Inexistant = si le membre n'existe pas
   procedure Afficher ( No_Membre : in Positive ; Club : in T_Club );


   -------------------------------------------------------------
   -- Nom : Trouver_No
   -- But : Trouver le no d'un membre d'un club
   --
   -- Paramètres : Nom_Membre = le nom du membre a trouver
   --            : Club = Le club contenant le membre a afficher
   -- Retourne   : Le numéro du membre ( Positive )
   -- Exception  : Membre_Inexistant = si le membre n'existe pas
   --            : Nom_Non_Unique = Risque de confusion si plusieurs membre du même nom
   function Trouver_No ( Nom_Membre : in String ; Club : in T_Club ) return Positive;


   ------------------------------------------------------------
   -- Nom : Club_Vide
   -- But : Informer si un club est vide
   --
   -- Paramètres : Club = Le club concerne
   -- Retourne   : True si il est vide, False s'il ne l'est pas
   -- Exception         : -
   function Club_Vide ( Club : in T_Club ) return Boolean ;



------------------------------------------------------------------------------------------
-- Itérateurs ============================================================================
------------------------------------------------------------------------------------------

   ----------------------------------------------------------------------
   -- Nom : Lister
   -- But : Lister les membres d'un club par nom ou par no
   --
   -- Paramètres    out : -
   -- Paramètres in out : -
   -- Paramètres in     : Club = Le club contenant les membres a afficher
   --                   : Genre_Tri = pour les tirer par nom ou par no
   -- Exception         : -
   procedure Lister ( Club : in T_Club ; Genre_Tri : in T_Genre_Tri );


   ----------------------------------------------------------------------------
   -- Nom : Sauver
   -- But : Sauver les membres d'un club dans un fichier
   --
   -- Paramètres    out : -
   -- Paramètres in out : Fichier = Le fichier dans lequel on sauve les membres
   -- Paramètres in     : Club = Le club contenant les membres a sauver
   -- Exception         : -
   procedure Sauver ( Fichier : in out Ada.Text_IO.File_Type ; Club : in T_Club );


   -----------------------------------------------------------------------
   -- Nom : Recuperer
   -- But : Récupérer les membres d'un sauve dans un fichier
   --
   -- Paramètres    out : Club = Le club dans lequel récupérer les membres
   -- Paramètres in out : -
   -- Paramètres in     : Fichier = Le fichier contenant les membres sauve
   -- Exception         : -
   procedure Recuperer ( Club : out T_Club ; Fichier : in Ada.Text_IO.File_Type );


private

   -- SousType pour la longueur d'un mot
   subtype T_Lngr_Mot is Natural range 0..Lngr_Mot_Max ;


   -- Prédestination
   type T_Membres ;

   -- Type pour le chaînage
   type T_Pt_Membre is access T_Membres ;

   -- Composition d'un membre
   -- Discriminants : Les longueur du nom et du prénom
   type T_Membres ( Lngr_Nom, Lngr_Prenom : T_Lngr_Mot ) is
      record
         No     : Natural := 0;           -- No du membre
         Nom    : String(1..Lngr_Nom);    -- Nom du membre
         Prenom : String(1..Lngr_Prenom); -- Prenom  du membre

         Alpha_Suivant : T_Pt_Membre; -- Membre suivant alphabétiquement
         Numer_Suivant : T_Pt_Membre; -- Membre suivant numériquement
      end record;


   -- Composition d'un club
   type T_Club is
      record
         Tete_Alpha  : T_Pt_Membre; -- Tête de la liste alphabétique
         Tete_Numer  : T_Pt_Membre; -- Tête de la liste numérique
         Queue_Numer : T_Pt_Membre; -- Queue de la liste numérique (pour limiter les
                                    --  itérations)
      end record;


end Gestion_Club;
