Feuilles de root

Logiciels libres, programmation et économie

Accueil » Programmation » Programmation Free Pascal » L'unité fgl : les listes génériques en Free Pascal

L'unité fgl : les listes génériques en Free Pascal

FPC supporte officiellement les génériques depuis la version 2.2. L'unité fgl propose plusieurs classes de listes génériques.

TFPGList est une liste générique.

type
TIntegerList = specialize TFPGList<Integer>;
TSingleList = specialize TFPGList<Single>;

En Free Pascal, pour utiliser un type paramétré il faut obligatoirement définir un nouveau type. Il n'est pas possible de définir le type lors de la déclaration de la variable, comme avec Delphi. Ainsi la construction suivante ne fonctionnera pas.

var
L : specialize TFPGList<Integer>
L := TFPGList<Integer>.Create;

Le compilateur acceptera la déclaration mais il ne sera pas possible d'instancier la classe.

Etendons la classe pour ajouter des méthodes utiles :

type
TIntegerList = class(specialize TFPGList<Integer>)
    function Contains(const AValue : T) : Boolean;
end;

implementation
function TIntegerList.Contains(const AValue : T) : Boolean;
begin
    Result := IndexOf(AValue) > -1;
end;

Free Pascal permet de définir des listes génériques avec les types de base (entier, caractère, chaîne), des listes de pointeurs ou d'objets, mais pas des listes d'enregistrements, contrairement à Delphi.

type
    TCharacter = class
    public
        FAttack : ShortInt;
        FDefense : ShortInt;
        FArmor : ShortInt;
        FHealth : ShortInt;
        procedure Update;
    end;

TCharacterList = specialize TFPGList<TCharacter>;

TFPGObjectList est une liste d'objets générique.

type
TCharacterList = specialize TFPGObjectList<TCharacter> ;

Le constructeur prend en paramètre un booléen indiquant s'il faut libérer automatiquement les objets.

L:= TCharacterList.Create(True) ;

Lorsqu'on veut utiliser une fonction de tri sur une TFPGObjectList, il faut désactiver temporairement la gestion des objets. En effet la méthode Sort déplace les objets en mettant le pointeur à nil, ce qui détruit l'objet si FreeObjects est à True.

function CompareCharacters(A: TCharacter ; B : TCharacter) : Integer ;

L.FreeObjects := False ;
L.Sort(@CompareCharacters);
L.FreeObjects := True ;

TFPGMap est une liste associative générique.

type
TIntegerMap = specialize TFPGMap<Integer, Integer>;

var
M : TIntegerMap;

La méthode Add prend en paramètres une clé et une valeur :

M.Add(5, 3);
M.Add(17, 11);

La propriété KeyData permet de récupérer une valeur à partir de la clé.

WriteLn(M.KeyData[17]); //11

La propriété Keys permet de récupérer les clés.

WriteLn(M.Keys[1]); //17

La classe générique TDictionary étend TFPGMap et contient une série de méthodes utiles.

Wiki FreePascal