G. Generics - JulTob/Ada Wiki

Generics

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

Generic_Swap.ads

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

Generic_Swap.adb

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

Test_Swap.adb

with Generic_Swap;
procedure Test_Swap is
   type R is record N: Integer; end record;
   procedure SwapR is new Swap(R);
   A, B: R;
   begin
     SwapR(A,B);
   End Test_Swap;
generic
   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.”<”);
   Data:Integer_Sorters.Element_Array;
begin 
   ... 
   Integer_Sorters.Quick_Sort(Data);
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.

generic
   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** ⚠️