ÏÏÏwith Ada.Text_Io, Files;
ÏÞßàprocedure Test_Files is
Ïϧ
ÏϧÏïÏtype Type_Appareil is ( __Planeur,
ÏϧÏÏÏ________________Cargo,
ÏϧÏÏÏ________________Commercial,
ÏϧÏÏÏ________________Chasseur,
ÏϧÏÏÏ________________Reconnaissance);
ÏÏ§ÏØÓìpackage Appareil_Io is new Ada.Text_Io.Enumeration_Io ( Type_Appareil );
Ïϧ   
ÏÏ§ÏØÓìpackage Naturel_Io  is new Ada.Text_Io.Integer_Io ( Natural );
Ïϧ   
ÏÏ§ÏØÓìpackage File_Appareil is new Files (  Élément => Type_Appareil);
Ïϧ   
ÏϧÏíÏFile_Pour_La_Piste : File_Appareil.File;
ÏϧÏíÏFile_Initiale :  File_Appareil.File;
Ïϧ  
ÏϧÏÛÜÝprocedure Imprimer ( La_File : in File_Appareil.File) is separate;
ÏϧÏÛÜÝfunction  "=" (Gauche _: in File_Appareil.File;
ÏϧÏϧϠ                  ___Droite__: in File_Appareil.File) return Boolean
ÏϧÏÏ©Ï_________renames File_Appareil.Est_Égal;
Ïϧbegin
ÏϨ¹¹ÏFile_Appareil.Purger (  File_Pour_La_Piste);
ÏϨ¹¹±for Index in Type_Appareil loop
ÏϧÏÏ7¹¹ÏFile_Appareil.Ajouter ( Index, À_La_File =>  File_Pour_La_Piste);
ÏϧÏϰend loop;
ÏϨ¹¹ÏFile_Appareil.Copier ( File_Pour_La_Piste, File_Initiale);
ÏϨ¹¹ÏImprimer (File_Pour_La_Piste);
ÏϨ¹¹ÏFile_Appareil.Enlever (  File_Pour_La_Piste);
ÏϨ¹¹ÏFile_Appareil.Enlever (  File_Pour_La_Piste);
ÏϨ¹¹ÏFile_Appareil.Enlever (  File_Pour_La_Piste);
ÏϨ¹¹ÏAda.Text_Io.Put ( " La tête de la file est :");
ÏϨ¹¹ÏAppareil_Io.Put (File_Appareil.Tête_De (File_Pour_La_Piste));
ÏϨ¹¹ÏAda.Text_IO.New_Line;
ÏϨ¹¹ÏAda.Text_IO.Put ( " La longueur de la file est : ");
ÏϨ¹¹ÏNaturel_IO.Put ( File_Appareil.Longueur_De (File_Pour_La_Piste), width => 2);
ÏϨ¹¹ÏFile_Appareil.Purger (  File_Pour_La_Piste);
ÏϨ¹¹ÏAda.Text_IO.New_Line;
ÏϨ¹¹ÏAda.Text_IO.Put ( " La longueur de la file après la purge est : ");
ÏϨ¹¹ÏNaturel_IO.Put ( File_Appareil.Longueur_De (File_Pour_La_Piste), width => 2);
ÏϨ¹¹ÏAda.Text_IO.New_Line;
ÏϨ¹³´if  File_Pour_La_Piste /=  File_Initiale then
ÏϧÏ6¾¹¹ÏAda.Text_IO.Put_Line (" La File_Pour_La_Piste est différente de la File_Initiale");
Ïϧ϶Ïend if;
ÏÏ©end Test_Files;



ÏÞßàseparate ( Test_Files)
ÏϧÏprocedure Imprimer ( La_File : in File_Appareil.File) is
ÏϧÏíÏL_Appareil : File_Appareil.Pour_Itérer.Itérateur; 
Ïϧbegin
ÏϨ¹¹ÏFile_Appareil.Pour_Itérer.Initialiser ( L_Appareil, File_Pour_La_Piste);
ÏϨ¹¹ÏAda.Text_Io.Put_Line ( " Les appareils en file pour la piste sont : ");
ÏϨ¹¹±while not File_Appareil.Pour_Itérer.Est_Fini ( L_Appareil ) loop
ÏϧÏÏ7¹¹ÏAppareil_IO.Put (File_Appareil.Pour_Itérer.Valeur_De ( L_Appareil ));
ÏϧÏÏ7¹¹ÏAda.Text_Io.New_Line;
ÏϧÏÏ7¹¹ÏFile_Appareil.Pour_Itérer.Aller_Suivant ( L_Appareil );
ÏϧÏϰend loop;
ÏÏ©end Imprimer;


ÏØÙÚgeneric
ÏϧÏtype Élément is private;
ÏϧÏpackage Files is
ÏϧÏïÏtype Noeud is private;
ÏϧÏïÏtype Structure is access Noeud;
Ïϧ
ÏϧÏïÏtype File _ is limited private;
ÏϧÏÛÜÝprocedure Purger __( La_File__: in out File);
ÏϧÏÛÜÝprocedure Ajouter __( La_Valeur_: in Élément;
ÏϧÏϩϠ                        ______À_La_File_: in out File);
ÏϧÏÛÜÝprocedure Enlever __( La_File__: in out File);
ÏϧÏÛÜÝprocedure Copier_     __( De_La_File _: in File;
ÏϧÏϩϠ                           _______À_La_File_: in out File);
ÏϧÏÛÜÝfunction Longueur_De _( La_File : in File) return Natural;
ÏϧÏÛÜÝfunction  Est_Vide __( La_File : in File) return Boolean;
ÏϧÏÛÜÝfunction Est_Égal ( Gauche _: in File;
ÏϧÏϩϠ                  ______ Droite __: in File) return Boolean;
ÏϧÏÛÜÝfunction  Tête_De __( La_File : in File) return Élément;
ÏϧÏíÏDébordement, Épuisement_: exception;
ÏÏ§ÏØÓìpackage Pour_Itérer is
ÏϧÏϧÏïÏsubtype Itérateur is  Structure;
ÏϧÏϧÏÛÜÝprocedure Initialiser _( L_Itérateur __: in out Itérateur;
ÏϧÏϧÏϩϠ ______                      Avec_La_File _: in_File );
ÏϧÏϧÏÛÜÝprocedure Aller_Suivant( L_Itérateur_: in out Itérateur);
ÏϧÏϧÏÛÜÝfunction Valeur_De__( L_Itérateur_: in  Itérateur) return Élément;
ÏϧÏϧÏÛÜÝfunction Est_Fini__( L_Itérateur_: in Itérateur) return Boolean;
ÏϧÏϧÏíÏErreur_Itérateur : exception;
ÏϧÏÏ©end Pour_Itérer;
Ïϧprivate
ÏϧÏïÏtype File  is
ÏϧÏÏÏÏÏÏrecord
ÏϧÏÏÏÏÏÏÏÏÏLa_Tête _: Structure;
ÏϧÏÏÏÏÏÏÏÏÏLa_Queue_: Structure;
ÏϧÏÏÏÏÏÏend record;
ÏϧÏïÏtype Noeud is
ÏϧÏÏÏÏÏÏrecord
ÏϧÏÏÏÏÏÏÏÏÏL_Élément   _: Élément;
ÏϧÏÏÏÏÏÏÏÏÏSuivant     _: Structure;
ÏϧÏÏÏÏÏÏend record;
ÏÏ©end Files;


ÏÏÏwith Ada.Unchecked_Deallocation;
ÏÕÖ×package body Files is
Ïϧ
ÏϧÏÕÖ×package body Pour_Itérer is
ÏϧÏϧ   
ÏϧÏϧÏÞßàprocedure Initialiser _( L_Itérateur __: in out Itérateur;
ÏϧÏϧÏϧϠ                        Avec_La_File _: in_File) is
ÏϧÏϧÏϧbegin
ÏϧÏϧÏϨ¹¹ÏL_Itérateur := Itérateur (Avec_La_File.La_Tête);
ÏϧÏϧÏÏ©end Initialiser;
ÏϧÏϧ   
ÏϧÏϧÏÞßàprocedure Aller_Suivant ( L_Itérateur _: in out Itérateur) is
ÏϧÏϧÏϧbegin
ÏϧÏϧÏϨ¹¹ÏL_Itérateur := Itérateur (L_Itérateur.Suivant);
ÏϧÏϧÏϧÏðîìexception
ÏϧÏϧÏϧÏϧ
ÏϧÏϧÏϧÏϨ¹³´when Constraint_Error =>
ÏϧÏϧÏϧÏϩ϶¾êîìraise Erreur_Itérateur;
ÏϧÏϧÏÏ©end Aller_Suivant;
ÏϧÏϧ   
ÏϧÏϧÏÞßàfunction Valeur_De ( L_Itérateur : in Itérateur ) return Élément is
ÏϧÏϧÏϧbegin
ÏϧÏϧ¹Ĺ¹Ïreturn L_Itérateur.L_Élément;
ÏϧÏϧÏϧÏðîìexception
ÏϧÏϧÏϧÏϨ¹³´when Constraint_Error =>
ÏϧÏϧÏϧÏϩ϶¾êîìraise Erreur_Itérateur;
ÏϧÏϧÏÏ©end Valeur_De;
ÏϧÏϧ   
ÏϧÏϧÏÞßàfunction Est_Fini ( L_Itérateur : in Itérateur ) return Boolean is
ÏϧÏϧÏϧbegin
ÏϧÏϧ¹Ĺ¹Ïreturn (L_Itérateur = null);
ÏϧÏϧÏÏ©end Est_Fini;
ÏϧÏϧ  
ÏϧÏÏ©end Pour_Itérer;
Ïϧ   
ÏϧÏÞßàprocedure Purger _(La_File__: in out File) is
ÏϧÏϧÏíÏCourant, Pointeur_Courant : Pour_Itérer.Itérateur;
ÏϧÏϧÏÛÜÝprocedure Delete is new Ada.Unchecked_Deallocation ( _Object __=> Noeud ,
ÏϧÏϧÏϩϠ                                  _______________________Name __=> Pour_Itérer.Itérateur );
ÏϧÏϧbegin
ÏϧÏϨ¹³´if La_File.La_Tête /= La_File.La_Queue then
ÏϧÏϧÏ6¨¹¹ÏPour_Itérer.Initialiser ( Courant, Avec_La_File => La_File);
ÏϧÏϧÏ6¾¹¹±while not Pour_Itérer.Est_Fini ( Courant ) loop
ÏϧÏϧÏ6ÏÏÏ7¹¹ÏPointeur_Courant := Courant;--
ÏϧÏϧÏ6ÏÏÏ7¹¹ÏPour_Itérer.Aller_Suivant ( Courant );
ÏϧÏϧÏ6ÏÏÏ7¹¹ÏDelete (Pointeur_Courant);
ÏϧÏϧÏ6ÏÏϰend loop;
ÏϧÏϧ϶Ïend if;
ÏϧÏϨ¹¹ÏLa_File := File'(  La_Tête  _=> null,
ÏϧÏϧÏÏÏÏÏÏ                La_Queue  _=> null);
ÏϧÏÏ©end Purger;
Ïϧ   
ÏϧÏÞßàprocedure Ajouter (_La_Valeur_: in Élément;
ÏϧÏϧϠ                   À_La_File_: in out File) is
ÏϧÏϧbegin
ÏϧÏϨ¹³´if À_La_File.La_Tête = null then
ÏϧÏϧÏ6¨¹¹ÏÀ_La_File.La_Tête := new  Noeud'(_L_Élément_=> La_Valeur,
ÏϧÏϧÏ6§ÏÏÏÏÏÏ                                 Suivant__=> null);
ÏϧÏϧÏ6¾¹¹ÏÀ_La_File.La_Queue := À_La_File.La_Tête;
ÏϧÏϧÏö´else
ÏϧÏϧϸ¨¹¹ÏÀ_La_File.La_Queue.Suivant := new Noeud'( L_Élément   => La_Valeur,
ÏϧÏϧϸ§ÏÏÏÏÏÏ                                       Suivant       => null);
ÏϧÏϧϸ¾¹¹ÏÀ_La_File.La_Queue ___   := À_La_File.La_Queue.Suivant;
ÏϧÏϧÏÈÏend if;
ÏϧÏϧÏðîìexception
ÏϧÏϧÏϨ¹³´when STORAGE_ERROR =>
ÏϧÏϧÏϩ϶¾êîìraise Débordement;
ÏϧÏÏ©end Ajouter;
Ïϧ  
ÏϧÏÞßàprocedure Copier     ( De_La_File   : in File;
ÏϧÏϧϠ                     À_La_File    : in out File) is
ÏϧÏϧÏíÏDe_L_Index_: Structure := De_La_File.La_Tête;
ÏϧÏϧÏíÏÀ_L_Index_: Structure;
ÏϧÏϧbegin
ÏϧÏϨ¹³´if De_La_File.La_Tête = null then
ÏϧÏϧÏ6¨¹¹ÏÀ_La_File.La_Tête ___:= null;
ÏϧÏϧÏ6¾¹¹ÏÀ_La_File.La_Queue _:= null;
ÏϧÏϧÏö´else
ÏϧÏϧϸ¨¹¹ÏÀ_La_File.La_Tête ___:= new Noeud' (  _L_Élément__=> De_L_Index.L_Élément,
ÏϧÏϧϸ§ÏÏÏÏÏÏ                  ___               _________Suivant____=> null);
ÏϧÏϧϸ¨¹¹ÏÀ_La_File.La_Queue  _:= À_La_File.La_Tête;
ÏϧÏϧϸ¨¹¹ÏÀ_L_Index           ____:= À_La_File.La_Tête;
ÏϧÏϧϸ¨¹¹ÏDe_L_Index__ _____:= De_L_Index.Suivant;
ÏϧÏϧϸ¾¹¹±while De_L_Index  /= null  loop
ÏϧÏϧϸÏÏÏ7¹¹ÏÀ_L_Index.Suivant := new Noeud'(  L_Élément   => De_L_Index.L_Élément,
ÏϧÏϧϸÏÏÏ5ÏÏÏÏÏÏ                       ___________Suivant     _=> null);
ÏϧÏϧϸÏÏÏ7¹¹ÏÀ_L_Index _______:= À_L_Index.Suivant;
ÏϧÏϧϸÏÏÏ7¹¹ÏDe_L_Index _______:= De_L_Index.Suivant;
ÏϧÏϧϸÏÏÏ7¹¹ÏÀ_La_File.La_Queue _:= À_L_Index;
ÏϧÏϧϸÏÏϰend loop;
ÏϧÏϧÏÈÏend if;
ÏϧÏϧÏðîìexception
ÏϧÏϧÏϨ¹³´when Storage_Error =>
ÏϧÏϧÏϩ϶¾êîìraise Débordement;
ÏϧÏÏ©end Copier;
Ïϧ  
ÏϧÏÞßàprocedure Enlever ( La_File_: in out File) is
ÏϧÏϧÏÛÜÝprocedure Delete is new Ada.Unchecked_Deallocation ( _Object __=> Noeud ,
ÏϧÏϧÏϩϠ                             ______________________Name __=> Structure );
ÏϧÏϧÏíÏÀ_Enlever : Structure := La_File.La_Tête;
ÏϧÏϧbegin
ÏϧÏϨ¹¹ÏLa_File.La_Tête := La_File.La_Tête.Suivant;
ÏϧÏϨ¹¹ÏDelete ( À_Enlever);
ÏϧÏϨ¹³´if La_File.La_Tête = null then
ÏϧÏϧÏ6¾¹¹ÏLa_File.La_Queue :=  null;
ÏϧÏϧ϶Ïend if;
ÏϧÏϧÏðîìexception
ÏϧÏϧÏϨ¹³´when Constraint_Error _=>
ÏϧÏϧÏϩ϶¾êîìraise Épuisement;
ÏϧÏÏ©end Enlever;
Ïϧ
ÏϧÏÞßàfunction Longueur_De (_La_File_: in File) return Natural is
ÏϧÏϧÏíÏCompte  _: Natural   := 0;
ÏϧÏϧÏíÏIndex   _: Structure _  := La_File.La_Tête;
ÏϧÏϧbegin
ÏϧÏϨ¹¹±while Index /= null loop
ÏϧÏϧÏÏ7¹¹ÏCompte  := Compte + 1;
ÏϧÏϧÏÏ7¹¹ÏIndex   := Index.Suivant;
ÏϧÏϧÏϰend loop;
Ïϧ¹Ĺ¹Ïreturn Compte;
ÏϧÏÏ©end Longueur_De;
Ïϧ  
ÏϧÏÞßàfunction Est_Égal ( Gauche _: in File;
ÏϧÏϧϠ                  Droite __: in File) return Boolean is
ÏϧÏϧÏíÏIndex_Gauche _: Structure := Gauche.La_Tête;
ÏϧÏϧÏíÏIndex_Droit  _: Structure := Droite.La_Tête;
ÏϧÏϧbegin
ÏϧÏϨ¹¹±while Index_Gauche /= null loop
ÏϧÏϧÏÏ7¹³´if Index_Gauche.L_Élément /= Index_Droit.L_Élément then
Ïϧ¹ÄÏÏ5Ï6¾¹¹Ïreturn False;
ÏϧÏϧÏÏ5Ïö´else
ÏϧÏϧÏÏ5ϸ¨¹¹ÏIndex_Gauche    := Index_Gauche.Suivant;
ÏϧÏϧÏÏ5ϸ¾¹¹ÏIndex_Droit         := Index_Droit.Suivant;
ÏϧÏϧÏÏ5ÏÈÏend if;
ÏϧÏϧÏϰend loop;
Ïϧ¹Ĺ¹Ïreturn (Index_Droit = null);
ÏϧÏϧÏðîìexception
ÏϧÏϧÏϨ¹³´when Constraint_Error _=>
Ïϧ¹ÄÏϩ϶¾¹¹Ïreturn False;
ÏϧÏÏ©end Est_Égal;
Ïϧ
ÏϧÏÞßàfunction Est_Vide ( La_File : in File) return Boolean is
ÏϧÏϧbegin
Ïϧ¹Ĺ¹Ïreturn (La_File.La_Tête = null);
ÏϧÏÏ©end Est_Vide;
Ïϧ  
ÏϧÏÞßàfunction Tête_De ( La_File : in File) return Élément is
ÏϧÏϧbegin
Ïϧ¹Ĺ¹Ïreturn La_File.La_Tête.L_Élément;
ÏϧÏϧÏðîìexception
ÏϧÏϧÏϨ¹³´when Constraint_Error =>
ÏϧÏϧÏϩ϶¾êîìraise Épuisement;
ÏϧÏÏ©end Tête_De;
Ïϧ  
ÏÏ©end Files;