Difference between revisions of "Generics"
Jwdietrich (talk | contribs) |
(Language) |
||
Line 1: | Line 1: | ||
==Introduction== | ==Introduction== | ||
− | Generics are native implementation of class templates. Generics are sometimes called parametrized types. FPC have official support for generics since version 2.2. | + | Generics are a native implementation of class templates. Generics are sometimes called parametrized types. FPC have official support for generics since version 2.2. |
==Examples== | ==Examples== | ||
− | + | A generic class is defined using keyword '''generic''' before the class name and use in class declaration: | |
<syntaxhighlight>type | <syntaxhighlight>type | ||
generic TList<T> = class | generic TList<T> = class | ||
Line 29: | Line 29: | ||
==fgl unit== | ==fgl unit== | ||
− | fgl unit is prototype unit for base system generic classes. So far it contains few basic classes: | + | The fgl unit is a prototype unit for base system generic classes. So far it contains a few basic classes: |
* TFPGList | * TFPGList | ||
* TFPGObjectList | * TFPGObjectList | ||
Line 37: | Line 37: | ||
== Technical details == | == Technical details == | ||
− | 1. The compiler parses a generic, but instead of generating code it stores | + | 1. The compiler parses a generic, but instead of generating code it stores all tokens in a token buffer inside the PPU file. |
− | all tokens in a token buffer inside the PPU file. | ||
− | 2. The compiler parses a specialization; for this it loads the token buffer | + | 2. The compiler parses a specialization; for this it loads the token buffer from the PPU file and parses that again, but replaces the generic parameters (in most examples "T") by the particular given type (e.g. LongInt, TObject). |
− | from the PPU file and parses that again, but replaces the generic | + | The code basically appears as if the same class had been written as the generic but with T replaced by the given type. |
− | parameters (in most examples "T") by the particular given type (e.g. LongInt, TObject). | ||
− | The code basically appears as if the same class had been written as the generic | ||
− | but with T replaced by the given type. | ||
Therefore in theory there should be no speed differences between a "normal" class and a generic one. | Therefore in theory there should be no speed differences between a "normal" class and a generic one. |
Revision as of 10:27, 7 June 2013
Introduction
Generics are a native implementation of class templates. Generics are sometimes called parametrized types. FPC have official support for generics since version 2.2.
Examples
A generic class is defined using keyword generic before the class name and use in class declaration:
type
generic TList<T> = class
Items: array of T;
procedure Add(Value: T);
end;
Example of generic class implementation:
implementation
procedure TList.Add(Value: T);
begin
SetLength(Items, Length(Items) + 1);
Items[Length(Items) - 1] := Value;
end;
Generic class can be simply specialized for particular type by use specialize keyword.
Type
TIntegerList = specialize TList<Integer>;
TPointerList = specialize TList<Pointer>;
TStringList = specialize TList<string>;
fgl unit
The fgl unit is a prototype unit for base system generic classes. So far it contains a few basic classes:
- TFPGList
- TFPGObjectList
- TFPGInterfacedObjectList
- TFPGMap
Technical details
1. The compiler parses a generic, but instead of generating code it stores all tokens in a token buffer inside the PPU file.
2. The compiler parses a specialization; for this it loads the token buffer from the PPU file and parses that again, but replaces the generic parameters (in most examples "T") by the particular given type (e.g. LongInt, TObject). The code basically appears as if the same class had been written as the generic but with T replaced by the given type.
Therefore in theory there should be no speed differences between a "normal" class and a generic one.