-- Nom du fichier		: recherche_general_g.ads
-- Auteur(s)		: ? (PBT)
-- Date de creation	:
-- But			: Specification du paquetage realisant le type
--				: arbre de recherche
-- Date de modification	:
-- Motif			:
generic

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

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

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

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

package Recherche_General_G is

   type T_Arbre_Recherche is private;

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

   -- Supprimer de l'arbre l'element de cle donnée
   procedure Supprimer(Arbre: in out T_Arbre_Recherche; Element : in T_Element);
   --
   -- SELECTEURS
   --
   -- Chercher l'element dans l'arbre et retourner le noeud (arbre) le contenant
   -- (vide si l'element n'existe pas)
   function Trouve(Arbre: in T_Arbre_Recherche; Element : in T_Element) return T_Arbre_Recherche;

   -- Retourne la valeur de l'element racine de l'arbre
   function Racine(Arbre: T_Arbre_Recherche) return T_Element;

   generic

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

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

   Erreur_Arbre_Vide: exception;
   -- Operation impossible car l'arbre est vide

   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
   type T_Noeud;                  -- Type de la cellule
   type T_Arbre_Recherche is access T_Noeud;  -- Pointeur sur la cellule

   Arbre_Vide : constant T_Arbre_Recherche := null;

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


end Recherche_General_G;
