[fpc-devel] Abstract generics

Simon Jackson jackokring at gmail.com
Mon Dec 3 15:15:57 CET 2018


Further to the ranges in generics discussion....... more on generics

There is always a way to do that using an abstract class. The things of interest creating the idea are:

1. Imagine a short hand syntax for abstract classes:

Generic classAbs<T> = class(TObject)
	Class generic variable: TObject;
End;

abClass = specialize classAbs<abstract>;

// This allows a short hand, and

2. Some possible crazy inheritance:

Generic classAbs<T,Q> = class(Q)
	Class generic variable: TObject;
End;

abClass = specialize classAbs<Integer, abstract>;

// which allows a form of polymorphic inheritance similar to interfaces, but short hand for interface variables.

3. Some code optimization for less cache thrashing

Class generic procedure classAbs.doSomething(T);
//generic procedure x.y(T); this also
Begin
	// enforce no usage of field and methods on T, such as T.specificToClass()
       // allows same piece of code to be used for all types of same sizeof()
       // so less code to fill the L1 instruction cache, and the L2 cache is less burdened
       // of course this speed and code size optimization could be detected without this
       // but enforcing it could always be an option.
End;

4. Compile time virtual kind of resolution

// As an abstract class would have many virtual abstract methods there would be a pointer indirection from the VMT.
// Any generic procedure or method could, if not virtual, be compiled in and so not need a virtual specifier.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20181203/fbc28291/attachment.html>


More information about the fpc-devel mailing list