Am 14.11.2022 um 19:26 schrieb Vojtěch Čihák via fpc-pascal:
Hi,
I wrote a generic abstract class - a list based on dynamic array (i.e. array of T;) and this class can be specialized elsewhere with any type (records or classes).
Part of the class is sorting. There are more ways how to deliver *compare 
function* to sorting method. I can pass it as a parameter or I can define it 
as: function Compare(A, B: T): Integer; virtual; abstract;. But this way the 
function cannot be inlined.
Question: Is there a way how to *inline* compare function to sorting method in this general purpose generic abstract class?

Currently there is not. But once FPC supports reusing types in other specializations inside the generic parameter list you /should/ be able to do the following:

=== code begin ===

program tinline;

{$mode objfpc}

type
  generic TComparer<T> = class
    class function Compare(aLeft, aRight: T): Integer;
  end;

  // this kind of constraint that uses T does not work yet
  generic TList<T; Comparer: specialize TComparer<T>> = class
    procedure Sort;
  end;

  TLongIntComparer = class(specialize TComparer<LongInt>)
    class function Compare(aLeft, aRight: T): Integer; inline;
  end;

class function TComparer.Compare(aLeft, aRight: T): Integer;
begin
  Result := 0;
end;

procedure TList.Sort;
begin
  { sort algorithm that calls Comparer.Sort which /should/ be inlined }
end;

class function TLongInt.Compare(aLeft, aRight: T): Integer;
begin
  if aLeft < aRight then
    Result := -1
  else if aLeft > aRight then
    Result := 1
  else
    Result := 0;
end;

var
  l: specialize TList<LongInt>;
begin
  l : =specialize TList<LongInt, TLongIntComparer>.Create;
  l.Sort;
end.

=== code end ===

I can't test this currently whether it would really work due to the missing functionality, but it's at least possible.

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to