G. Generics - JulTob/Ada Wiki


Just like C++ templates, Generics allow doing Generic Packages that define algorithms for undefined types.


Generic Type Object (<>) is Private;  -- Object can be anything
Package Generic_Swap Is
   Procedure Swap (Left, Right: in out Object);
   End Generic_Swap;


Package Body Generic_Swap Is
   Procedure Swap (Left, Right : IN OUT Object) is
     Temp: Object := Left;
       Left:= Right; Right:= Temp;
       End Swap;
  End Generic_Swap;


with Generic_Swap;
procedure Test_Swap is
   type R is record N: Integer; end record;
   procedure SwapR is new Swap(R);
   A, B: R;
   End Test_Swap;
   type Element_Type is private;
   with function “<”(Left,Right : Element_Type) 
      return Boolean is <>;
package Sorters is
   type Element_Array is array (Natural range <>) of Element_Type;
   procedure Quick_Sort(Sequence: in out Element_Array);
   procedure Heap_Sort(Sequence: in out Element_Array);
   procedure Bubble_Sort(Sequence: in out Element_Array);
end Sorters;
with Sorters;
Procedure Example is
   Package integer_Sorters is new Sorters(Element_Type =>Integer, “<” => Standard.”<”);
end Example;

Here Element_Type and “<” must be provided. <> indicates the compiler it should fill the required function if one is available.

Se utiliza la palabra with precediendo al protocolo del subprograma que se espera. Se puede especificar un nombre por defecto para el subprograma pasado por parámetro, utilizando "is ". Si se quiere que el nombre por defecto sea el mismo que el del parámetro formal, se pondrá como nombre "<>". En caso de especificar un nombre por defecto se podrá omitir el parámetro al instanciar la unidad.

   type Elemento is private; 
   --  Un procedimiento con un parámetro de tipo Elemento
   with procedure Acción(X : in Elemento);
   --  Un procedimiento con un parámetro de tipo Elemento cuyo
   --  nombre por omisión es Escribir 
   with procedure Acción (X : in Elemento) is Escribir;

   --  Una función booleana con un parámetro de tipo Elemento cuyo
   --  nombre por omisión es Acción_2 
   with function Acción_2 (X : Elemento) return Boolean is <>;

Universal Array Sort

generic type Element is private;

type Index is (<>);
     with Function "<" (Left, Right : ELement) return Boolean;

type Array_Type is array (Index range <>) of Component;

procedure Sort( A: in out Array_Type);

⚠️ **GitHub.com Fallback** ⚠️