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  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to