-- Nom du fichier		: recherche_doublon_G.ads
-- Auteur(s)		: PBT
-- Date de creation	: 2001
-- But			: Specification du paquetage realisant le type
--				: arbre de recherche avec doublons autorises
-- Date de modification	:
-- Motif			:

with Recherche_General_G; -- Pour gerer les doublons

generic


   -- Type des elements de l'arbre
   type T_Element is private;

   -- Type des cles des elements
   type T_Cle is private;

   -- Type des cles des elements
   type T_Cle_Secondaire is private;

   -- Pour extraire la cle d'un element
   with function Cle_De (Element: T_Element) return T_Cle;

   -- Pour extraire la cle d'un element
   with function Cle_Secondaire_De (Element: T_Element) return T_Cle_Secondaire;

   -- Pour disposer d'une relation d'ordre sur les elements (arbre de recherche)
   with function "<" (Gauche, Droite: T_Cle) return Boolean is <>;

   -- Pour disposer d'une relation d'ordre sur les doublons (arbre de recherche)
   with function "<" (Gauche, Droite: T_Cle_Secondaire) return Boolean is <>;



package Recherche_Doublon_G is

   type T_Arbre_Recherche_Doublon is private;

   Arbre_Vide :  constant T_Arbre_Recherche_Doublon;
   --
   -- MODIFICATEURS
   --
   -- Inserer un element dans l'arbre
   procedure Inserer(Arbre: in out T_Arbre_Recherche_Doublon;
                     Element : in T_Element);

   -- Supprimer de l'arbre l'element de cle donnée
   procedure Supprimer(Arbre: in out T_Arbre_Recherche_Doublon;
                       Element : in T_Element);
   --
   -- SELECTEURS
   --
   -- Chercher l'element dans l'arbre et le retourner
   procedure Trouver(Arbre: in T_Arbre_Recherche_Doublon;
                     Element: in out T_Element;
                     Trouve: out Boolean);



   generic

      -- Applique un traitement a chaque element
      with procedure Traiter(Element: T_Element);

   procedure Parcourir(Arbre: in T_Arbre_Recherche_Doublon);
   -- Parcourt les elements dans l'ordre en appliquant le traitement specifie
   -- a chaque element


   Erreur_Arbre_Plein: exception;
   -- Operation impossible car l'arbre est plein

   Erreur_Element_A_Double : exception;
   -- Operation impossible car l'element existe deja

   Erreur_Element_Absent   : exception;
   -- Operation impossible car l'element n'existe pas

private

   -- Definition complete du type T_Arbre_Recherche_Doublon
   type T_Noeud;						-- Type de la cellule
   type T_Arbre_Recherche_Doublon is access T_Noeud;	-- Pointeur sur la cellule

   Arbre_Vide : constant T_Arbre_Recherche_Doublon := null;

   package P_Arbre_Doublons is
      new Recherche_General_G(T_Element, T_Cle_Secondaire, Cle_Secondaire_De);
   use P_Arbre_Doublons;

   type T_Noeud is						 -- Definition complete de la cellule
     record
        Element: T_Element;				 -- Toute l'information y compris les cles
        Arbre_Doublons: T_Arbre_Recherche;
        Gauche, Droit: T_Arbre_Recherche_Doublon; -- Fils gauche et droit
     end record;

end Recherche_Doublon_G;
