Главная » Статьи » FreePascal

Внутри FreePascal Generics.Collections library (часть 1)

Изучение FreePascal Generics.Collections library показало, что для применения семейства хеш-функций, реализованных в библиотеке, достаточно воспользоваться классами и интерфейсами из модуля Generics.Defaults. Этот модуль требует еще трех модулей из библиотеки: Generics.Strings, Generics.Helpers, Generics.Hashes.

1. Применение интерфейсов IEqualityComparer<T> и IExtendedEqualityComparer<T>, реализованных в классе TExtendedEqualityComparer<T>

Generic интерфейс IEqualityComparer<T> предоставляет два метода:
function Equals(constref ALeft, ARight: T): Boolean; — сравнение на равенстов двух элементов ALeft и ARight;
function GetHashCode(constref AValue: T): UInt32; — вычисление хеш-кода для AValue.

Интерфейс IExtendedEqualityComparer<T> наследник от IEqualityComparer<T> добавляет еще один метод
procedure GetHashList(constref AValue: T; AHashList: PUInt32); — вычисление нескольких хеш кодов от одного значения.

Для получения экземпляров указанных интерфейсов предназначены два класса:
TEqualityComparer<T> — предоставляет интерфейс IEqualityComparer<T>;
TExtendedEqualityComparer<T> — наследник класса TEqualityComparer<T>, предоставляющий интрерфейс IExtendedEqualityComparer<T>.

Эти классы включают следующие методы, возвращающие generic интерфейсы:

A)
class function TEqualityComparer<T>.Default: IEqualityComparer<T>; static; overload;
class function TExtendedEqualityComparer<T>.Default: IExtendedEqualityComparer<T>; static; overload; reintroduce;

— используются дефолтовые реализаций функций сравнения на равенство и вычисления хешей:


B)
class function TEqualityComparer<T>.Default(AHashFactoryClass: THashFactoryClass): IEqualityComparer<T>; static; overload;
class function TExtendedEqualityComparer<T>.Default(AExtenedHashFactoryClass: TExtendedHashFactoryClass): IExtendedEqualityComparer<T>; static; overload; reintroduce;

— используются дефолтовые реализации функций сравнения на равенство и предопределенные хешеры–наследники классов THashFactory и TExtendedHashFactory:


C)
class function TExtendedEqualityComparer<T>.Construct(const AEqualityComparison: TEqualityComparisonFunc<T>; const AHasher: THasherFunc<T>; const AExtendedHasher: TExtendedHasherFunc<T>): IExtendedEqualityComparer<T>; overload; reintroduce;
class function TExtendedEqualityComparer<T>.Construct(const AEqualityComparison: TEqualityComparisonFunc<T>; const AExtendedHasher: TExtendedHasherFunc<T>): IExtendedEqualityComparer<T>; overload; reintroduce;

— используются внешние функции сравнения на равенство и вычисления хешей:


D)

♦ class function TEqualityComparer<T>.Construct(const AEqualityComparison: TOnEqualityComparison<T>; const AHasher: TOnHasher<T>): IEqualityComparer<T>; overload;

♦ class function TExtendedEqualityComparer<T>.Construct(const AEqualityComparison: TOnEqualityComparison<T>; const AHasher: TOnHasher<T>; const AExtendedHasher: TOnExtendedHasher<T>): IExtendedEqualityComparer<T>; overload; reintroduce;
♦ class function TExtendedEqualityComparer<T>.Construct(const AEqualityComparison: TOnEqualityComparison<T>; const AExtendedHasher: TOnExtendedHasher<T>): IExtendedEqualityComparer<T>; overload; reintroduce;

♦ class function TExtendedEqualityComparer<T>.Construct(const AEqualityComparison: TEqualityComparisonFunc<T>; const AHasher: THasherFunc<T>; const AExtendedHasher: TExtendedHasherFunc<T>): IExtendedEqualityComparer<T>; overload; reintroduce;
♦ class function TExtendedEqualityComparer<T>.Construct(const AEqualityComparison: TEqualityComparisonFunc<T>; const AExtendedHasher: TExtendedHasherFunc<T>): IExtendedEqualityComparer<T>; overload; reintroduce;

— используются методов внешних классов, реализующих функции сравнения на равенство и вычисления хешей:


Также классы TEqualityComparer<T> и TExtendedEqualityComparer<T> содержат объявления абстрактных методов интерфейсов:
function Equals(constref ALeft, ARight: T): Boolean;
function GetHashCode(constref AValue: T): UInt32;
procedure GetHashList(constref AValue: T; AHashList: PUInt32);
которые реализуются в классах–делегатах, являющимия потомками TEqualityComparer<T> и TExtendedEqualityComparer<T>, интерфейсы этих классов–делегатов возвращаются функциями Construct.

Ниже приведен пример применения специализации интерфейса IExtendedEqualityComparer<string> с использованием в качестве хешера встроенного класса TDelphiQuadrupleHashFactory:

01  program testGCM;
02  {$mode delphi}{$H+}
03  uses
04   Classes, sysutils,
05   { you can add units after this }
06   Generics.Strings, Generics.Helpers, Generics.Hashes, Generics.Defaults,
07   MyDebug;
08  
09  const
10   cUcStrR = 'АБВГДЕ';
11   cLcStrR = 'абвгде';
12
13  var
14   iExtEqu:        IExtendedEqualityComparer<string>;
15   ui32:           UInt32;
16   hashList:       array[0..6] of UInt32;
17  begin
18   iExtEqu := TExtendedEqualityComparer<string>.Default(TDelphiQuadrupleHashFactory);
19   //hash code
20   ui32 := iExtEqu.GetHashCode(cLcStrR);
21   writeln(Format('"%s" hash code = 0x%.8x', [cLcStrR, ui32]));
22   writeln;
23
24   hashListParams :=  @hashList;
25   doHashList(cLcStrR, -1, 2);
26   hashListParams[0] := -1;
27   hashListParams[1] := 2;
28   //hash list
29   iExtEqu.GetHashList(HStr, @hashList);
30   writeln(Format('"%s" hash params = %d; %d', [HStr, hashListParams[0], hashListParams[1]]));
31   for i := 1 to High(hashList) do
32     writeln(Format(' -> list[%d] = 0x%.8x', [i, hashList[i]]));
33   writeln;
34
35   writeln(Format('Equals "%s" "%s" == ', [cUcStr, cUcStr]), iExtEqu.Equals(cUcStr, cUcStr));
36   writeln(Format('Equals "%s" "%s" == ', [cUcStr, cLcStr]), iExtEqu.Equals(cUcStr, cLcStr));
37
38  end. 

Итоговый вывод исполнения программы имеет вид: 

"абвгде" hash code = 0xD16487C4

"абвгде" hash params = -1; 2
 -> list[1] = 0xD16487C4
 -> list[2] = 0x00000000

 -> list[6] = 0x00000000

Equals "ABCDEF" "ABCDEF" == TRUE
Equals "ABCDEF" "abcdef" == FALSE

Компилирование и запуск программы с включенным флагом Use Heaptrc unit показало отсутствие утечек памяти.

Продолжение:

К началу

Категория: FreePascal | Добавил: zoleg5763 (26.03.2019)
Просмотров: 403 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar