[fpc-pascal] How does TFPGMap key compare work?

Sven Barth pascaldragon at googlemail.com
Wed Apr 21 07:38:40 CEST 2021


Am 21.04.2021 um 00:09 schrieb Ryan Joseph via fpc-pascal:
>
>> On Apr 20, 2021, at 3:10 PM, Sven Barth <pascaldragon at googlemail.com> wrote:
>>
>> If you look at TFPSMap' code you'll see that BinaryCompareKey and BinaryCompareData are only used in the way of method pointers OnKeyPtrCompare and OnDataPtrCompare. In TFPGMap<,> these are then set to compare methods specific to the specialization, most importantly TFPGMap<,>.KeyCompare if no custom compare function is set.
> There's no many levels of indirection here I got confused. I see this method below and so maybe the <> operators are overloaded for short strings?
>
> function TFPGMap.KeyCompare(Key1, Key2: Pointer): Integer;
> begin
>    if PKey(Key1)^ < PKey(Key2)^ then
>      Result := -1
>    else if PKey(Key1)^ > PKey(Key2)^ then
>      Result := 1
>    else
>      Result := 0;
> end;
All four string types provide built in > and < operators:

=== code begin ===

program tstrcmp;

{$mode objfpc}{$H+}

var
   ss1, ss2: ShortString;
   as1, as2: AnsiString;
   us1, us2: UnicodeString;
   ws1, ws2: WideString;

begin
   ss1 := 'Hello';
   ss2 := 'World';
   as1 := 'Hello';
   as2 := 'World';
   us1 := 'Hello';
   us2 := 'World';
   ws1 := 'Hello';
   ws2 := 'World';

   Writeln('ShortString: ', ss1 < ss2, ' ', ss1 > ss2);
   Writeln('AnsiString: ', as1 < as2, ' ', as1 > as2);
   Writeln('UnicodeString: ', us1 < us2, ' ', us1 > us2);
   Writeln('WideString: ', ws1 < ws2, ' ', ws1 > ws2);
end.

=== code end ===

Regards,
Sven


More information about the fpc-pascal mailing list