FPC has a number of function pointer types and eventually will have another in
"reference to" closures. This presents a problem of how the programmer can make
a function that is type agnostic so that we can use different types of
callbacks.
Currently this is the best solution I can think of but it's still a real mess
and tedious to setup. Here's a little snippet of a list class that has a Sort
method.
It feels to me like the compiler needs a new type which wraps all the callbacks
for us but maybe there's a better way?
========================================
type
generic TSList<T> = class
type
TComparator = record
private type
TFuncProc = function (constref left, right: T; context: pointer):
integer;
TFuncNested = function (constref left, right: T; context: pointer):
integer is nested;
TFuncObject = function (constref left, right: T; context: pointer):
integer of object;
private
index: TFuncType;
public
function Call(constref left, right: T; context: pointer): integer;
case byte of
0: (proc: TFuncProc);
1: (nested: TFuncNested);
2: (obj: TFuncObject);
end;
...
procedure Sort(callback: TComparator.TFuncProc; context: pointer = nil);
procedure Sort(callback: TComparator.TFuncNested; context: pointer = nil);
procedure Sort(callback: TComparator.TFuncObject; context: pointer = nil);
end;
...
procedure TSList.Sort(callback: TComparator.TFuncProc; context: pointer);
var
comparator: TComparator;
begin
comparator.proc := callback;
comparator.index := TFuncType.IsProc;
{ do sorting and call comparator.Call(left, right, context); which routes to
the correct callback }
end;
Regards,
Ryan Joseph
_______________________________________________
fpc-pascal maillist - [email protected]
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal