[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