-- Avril 2014
-- Auteurs : MJ. Huguet - R. Guillerm
--
-- Mise ŕ jour : avril 2015 
-- Auteur : MJ. Huguet
-- Modif : ajout de la cle des elements
--
-- OBJET : paquetage generique de Tas
------------------------------------------------------------------------
generic
   type Element is private;		    
   -- type des noms des éléments
   type Key is private;
   -- type de la cle des elements
   with function Cle_De(E : in Element) return Key;
   with function "<"(C1, C2 : in Key) return Boolean;	
   -- fonction de comparaison de deux valeurs
   with procedure Liberer_Element(E : in out Element);
   with function Element_To_STring(E : in Element) return string;
package Tas_Gen is

	Tas_Vide, Tas_Plein : exception;

	type Un_Tas(Dimension : Natural) is limited private;

	-- Vider le tas
	procedure Liberer(T : in out Un_Tas);

	-- Retourne le nb courant d'éléments du tas
	function Cardinal(T : in Un_Tas) return Natural;

	-- Retirer la racine du tas et la retourne
	procedure Enlever_Racine(T : in out Un_Tas; E : out Element);

	-- Ajouter un nouvel élément dans le tas
	procedure Ajouter(E : in Element; T : in out Un_Tas);

	function Tas_To_String(T : in Un_Tas) return string;

private

   type Tab_Elements is array(natural range <>) of Element;	
   -- les éléments sont dans un tableau

   type Un_Tas(Dimension : Natural) is record    -- le record Tas mémorise :
      Cardinal : Natural := 0;		             --    - le nombre d'éléments du tas
      Les_Elements : Tab_Elements(1..Dimension); --    - le tableau des éléments du tas
   end record;

end Tas_Gen;
