thashmapextendedequalitycomparer.lpr 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Generic types for NewPascal.org and FPC!
  2. // by Maciej Izak (hnb), 2014
  3. program THashMapExtendedEqualityComparer;
  4. {$MODE DELPHI}
  5. {$APPTYPE CONSOLE}
  6. uses
  7. SysUtils, Generics.Collections, Generics.Defaults;
  8. type
  9. { TTaxPayer }
  10. TTaxPayer = record
  11. TaxID: Integer;
  12. Name: string;
  13. constructor Create(ATaxID: Integer; const AName: string);
  14. function ToString: string;
  15. end;
  16. constructor TTaxPayer.Create(ATaxID: Integer; const AName: string);
  17. begin
  18. TaxID := ATaxID;
  19. Name := AName;
  20. end;
  21. function TTaxPayer.ToString: string;
  22. begin
  23. Result := Format('TaxID = %-10d Name = %-17s', [TaxID, Name]);
  24. end;
  25. function EqualityComparison(constref ALeft, ARight: TTaxPayer): Boolean;
  26. begin
  27. Result := ALeft.TaxID = ARight.TaxID;
  28. end;
  29. procedure ExtendedHasher(constref AValue: TTaxPayer; AHashList: PUInt32);
  30. begin
  31. // don't work with TCuckooD6 map because default TCuckooD6 needs TDelphiSixfoldHashFactory
  32. // and TDefaultHashFactory = TDelphiQuadrupleHashFactory
  33. // (TDelphiQuadrupleHashFactory is compatible with TDelphiDoubleHashFactory and TDelphiHashFactory)
  34. TDelphiQuadrupleHashFactory.GetHashList(@AValue.TaxID, SizeOf(Integer), AHashList);
  35. end;
  36. var
  37. map: THashMap<TTaxPayer, string>; // THashMap = TCuckooD4
  38. LTaxPayer: TTaxPayer;
  39. LSansa: TTaxPayer;
  40. LPair: TPair<TTaxPayer, string>;
  41. begin
  42. WriteLn('program of tax office - ExtendedEqualityComparer for THashMap');
  43. WriteLn;
  44. // to identify the taxpayer need only nip
  45. map := THashMap<TTaxPayer, string>.Create(
  46. TExtendedEqualityComparer<TTaxPayer>.Construct(EqualityComparison, ExtendedHasher));
  47. map.Add(TTaxPayer.Create(1234567890, 'Joffrey Baratheon'), 'guilty');
  48. map.Add(TTaxPayer.Create(90, 'Little Finger'), 'swindler');
  49. map.Add(TTaxPayer.Create(667, 'John Snow'), 'delinquent tax');
  50. // useless in this place but we can convert Keys to TArray<TKey> :)
  51. WriteLn(Format('All taxpayers (count = %d)', [Length(map.Keys.ToArray)]));
  52. for LTaxPayer in map.Keys do
  53. WriteLn(' > ', LTaxPayer.ToString);
  54. LSansa := TTaxPayer.Create(667, 'Sansa Stark');
  55. // exist because custom EqualityComparison and ExtendedHasher
  56. WriteLn;
  57. WriteLn(LSansa.Name, ' exist in map = ', map.ContainsKey(LSansa));
  58. WriteLn;
  59. //
  60. WriteLn('All taxpayers');
  61. for LPair in map do
  62. WriteLn(' > ', LPair.Key.ToString, ' is ', LPair.Value);
  63. // Add or set sansa? :)
  64. WriteLn;
  65. WriteLn(Format('AddOrSet(%s, ''innocent'')', [LSansa.ToString]));
  66. map.AddOrSetValue(LSansa, 'innocent');
  67. WriteLn;
  68. //
  69. WriteLn('All taxpayers');
  70. for LPair in map do
  71. WriteLn(' > ', LPair.Key.ToString, ' is ', LPair.Value);
  72. // Add or set sansa? :)
  73. WriteLn;
  74. LSansa.TaxID := 668;
  75. WriteLn(Format('AddOrSet(%s, ''innocent'')', [LSansa.ToString]));
  76. map.AddOrSetValue(LSansa, 'innocent');
  77. WriteLn;
  78. //
  79. WriteLn('All taxpayers');
  80. for LPair in map do
  81. WriteLn(' > ', LPair.Key.ToString, ' is ', LPair.Value);
  82. ReadLn;
  83. map.Free;
  84. end.