------------------------------------------------------------------------------------------
-- Nom fichier      : gestion_port.ads                                                  --
-- Auteur           : Julien Burdy                                                      --
-- Date             : 7 Juin 2001                                                       --
--                                                                                      --
-- But              : Paquetage de gestion des boucle d'amarrage d'un port maritime     --
--                      les no de boucles étant attribué automatiquement                --
--                    Permettant :                                                      --
--                                 - Créer un port                                      --
--                                 - Amarrer un bateau (voile,moteur ou rame)           --
--                                 - Supprimer un bateau du port                        --
--                                 - Afficher les caractéristique d'un bateau           --
--                                 - Afficher les caractéristique de tout les bateaux   --
--                                 - Savoir le nombre de boucles disponibles            --
--                                 - Savoir le nombre de boucles utilisée               --
--                                 - Savoir si une boucle est libre                     --
-- Date de modif.   :                                                                   --
-- Raison           :                                                                   --
-- Modules appeles  :                                                                   --
-- Mat. particulier :                                                                   --
--                                                                                      --
-- Compilation      : Compilateur Gnat 3.13                                             --
-- Édition de liens : GnatLink de Gnat                                                  --
-- Mode d'exécution : Console                                                           --
------------------------------------------------------------------------------------------


package Gestion_Port is



   -- Type port maritime
   type T_Port is limited private;



   -- Exceptions propre au paquetage
   Bateau_Inexistant  : exception ; -- bateau inexistant
   Boucle_Inexistante : exception ; -- boucle inexistante
   Port_Plein         : exception ; -- port plein




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


   ---------------------------------------------
   -- Nom : Creer_Port
   -- But : Créer un nouveau port vide
   --
   -- Paramètres    out : Port = le port a créer
   -- Paramètres in out : -
   -- Paramètres in     : Nb_Boucles_Max = le nombre de boucle du port
   -- Exception         : -
   procedure Creer_Port ( Port : out T_Port; Nb_Boucles_Max : in Natural );


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

   -----------------------------------------------------------------------------------
   -- Nom : Amarrer_Bateau_Voile
   -- But : Amarrer un nouveau bateau voile dans le port
   --
   -- Paramètres    out : No_Boucle = le no de boucle attribué par le paquetage
   -- Paramètres in out : Port = Le Port dans lequel on amarre le bateau
   -- Paramètres in     : Nb_Places,Longueur,Surface_Voile,Lest = les infos du bateau
   -- Exception         : Port_Plein = Il n'y a plus de place pour amarrer un bateau
   procedure Amarrer_Bateau_Voile  ( Port          : in out T_Port ;
                                     No_Boucle     :    out Positive ;
                                     Nb_Places     : in     Positive ;
                                     Longueur      : in     Float ;
                                     Surface_Voile : in     Float ;
                                     Lest          : in     Boolean );


   -----------------------------------------------------------------------------------
   -- Nom : Amarrer_Bateau_Moteur
   -- But : Amarrer un nouveau bateau moteur dans le port
   --
   -- Paramètres    out : No_Boucle = le no de boucle attribué par le paquetage
   -- Paramètres in out : Port = Le Port dans lequel on amarre le bateau
   -- Paramètres in     : Nb_Places,Longueur,puissance = les infos du bateau
   -- Exception         : Port_Plein = Il n'y a plus de place pour amarrer un bateau
   procedure Amarrer_Bateau_Moteur ( Port      : in out T_Port ;
                                     No_Boucle :    out Positive ;
                                     Nb_Places : in     Positive ;
                                     Longueur  : in     Float ;
                                     Puissance : in     Natural  );

   -----------------------------------------------------------------------------------
   -- Nom : Amarrer_Bateau_Rame
   -- But : Amarrer un nouveau bateau rame dans le port
   --
   -- Paramètres    out : No_Boucle = le no de boucle attribué par le paquetage
   -- Paramètres in out : Port = Le Port dans lequel on amarre le bateau
   -- Paramètres in     : Nb_Places,Longueur = les infos du bateau
   -- Exception         : Port_Plein = Il n'y a plus de place pour amarrer un bateau
   procedure Amarrer_Bateau_Rame   ( Port      : in out T_Port ;
                                     No_Boucle :    out Positive ;
                                     Nb_Places : in     Positive ;
                                     Longueur  : in     Float );

   --------------------------------------------------------------------------
   -- Nom : Supprimer_Bateau
   -- But : Supprimer un bateau par son emplacement
   --
   -- Paramètres in out : Port = Le Port dans lequel on Supprimer le bateau
   -- Paramètres in     : No_Boucle = le no de boucle du bateau a supprimer
   -- Exception         : Bateau_Inexistant  = si le bateau n'existe pas
   --                   : Boucle_Inexistante = si la boucle n'existe pas
   procedure Supprimer_Bateau ( Port : in out T_Port ; No_Boucle : in Positive );

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

   --------------------------------------------------------------------
   -- Nom : Afficher_Bateau
   -- But : Afficher les infos d'un bateau du port
   --
   -- Paramètres in     : No_Boucle = le numéro de boucle du bateau a afficher
   --                   : Port = Le port contenant le bateau a afficher
   -- Exception         : Bateau_Inexistant  = si le bateau n'existe pas
   --                   : Boucle_Inexistante = si la boucle n'existe pas
   procedure Afficher_Bateau ( Port : in T_Port ; No_Boucle : in Positive );


   --------------------------------------------------------------------
   -- Nom : Boucle_Utilisee
   -- But : Informe si une boucle est libre
   --
   -- Paramètres in     : No_Boucle = le numéro de boucle
   --                   : Port = Le port contenant la boucle
   -- Retourne          : True = la boucle est libre
   -- Exception         : Boucle_Inexistante = si la boucle n'existe pas
   function Boucle_Utilisee ( Port : in T_Port; No_Boucle : in Positive ) return Boolean;

   --------------------------------------------------------------------
   -- Nom : Nb_Boucles_Utilisees
   -- But : retourne le nombre de boucles utilisées
   --
   -- Paramètres in     : Port = le port contenant les boucles
   -- Retourne          : le nombre de boucles utilisées
   function Nb_Boucles_Utilisees ( Port : in T_Port ) return Natural;


   --------------------------------------------------------------------
   -- Nom : Nb_Boucles_Libres
   -- But : retourne le nombre de boucles libres
   --
   -- Paramètres in     : Port = le port contenant les boucles
   -- Retourne          : le nombre de boucles libres
   function Nb_Boucles_Libres ( Port : in T_Port ) return Natural;




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

   ----------------------------------------------------------------------
   -- Nom : Afficher_Tout
   -- But : Afficher les infos de tout les bateaux du port
   --
   -- Paramètres in     : Port = Le port contenant les bateaux a afficher
   procedure Afficher_Tout ( Port : in T_Port);



private

   -- genre de bateau possibles
   type T_Genre_Bateau is (Voile,Moteur,Rame);

   -- predeclaration
   type T_Bateau ;

   -- pointeur sur le type bateau
   type Pt_Bateau is access T_Bateau;

   -- type bateau
   type T_Bateau (Genre : T_Genre_Bateau) is
      record
         No_Boucle : Positive; -- no de boucle amarre

         Nb_Places : Positive; -- nombre de place du bateau
         Longueur : Float;     -- longueur du bateau

         Bateau_Suivant : Pt_Bateau; -- prochain bateau amarre

         -- selon le genre du bateau
         case Genre is

            when Voile =>
               Surface_Voile : Float ; -- la surface de voile
               Lest : Boolean ;        -- s'il a du lest

            when Moteur =>
               Puissance : Natural ;   -- puissance de son moteur

            when Rame =>
               null;                   -- rien

         end case;
      end record;


   -- type port
   type T_Port is
      record
         Nb_Boucles_Max : Natural := 0 ; -- nombre max de boucle
                                         -- initialisé a zéro pour obliger la création
                                         -- par l'utilisateur
         Tete : Pt_Bateau;               -- 1er bateau
      end record;

end Gestion_Port;
