/jcl/source/prototypes/containers/JclArraySets.imp

https://github.com/the-Arioch/jcl · Unknown · 96 lines · 88 code · 8 blank · 0 comment · 0 complexity · a3a618ece522cc90cc59fd053cf0c8d0 MD5 · raw file

  1. (*$JPPDEFINEMACRO JCLARRAYSETIMP(SELFCLASSNAME, COLLECTIONINTERFACENAME, ITRINTERFACENAME, CONSTKEYWORD, PARAMETERNAME, TYPENAME, DEFAULTVALUE, GETTERFUNCTIONNAME)
  2. //=== { SELFCLASSNAME } ====================================================
  3. function SELFCLASSNAME.Add(CONSTKEYWORDPARAMETERNAME: TYPENAME): Boolean;
  4. var
  5. Idx: Integer;
  6. begin
  7. {$JPPDEFINE WRITE}{$JPPEXPANDMACRO LOCK}
  8. Result := FAllowDefaultElements or not ItemsEqual(PARAMETERNAME, DEFAULTVALUE);
  9. if Result then
  10. begin
  11. Idx := BinarySearch(PARAMETERNAME);
  12. if Idx >= 0 then
  13. Result := not ItemsEqual(GETTERFUNCTIONNAME(Idx), PARAMETERNAME) or CheckDuplicate
  14. else
  15. Result := True;
  16. if Result then
  17. Result := inherited Insert(Idx + 1, PARAMETERNAME);
  18. end;
  19. {$JPPEXPANDMACRO UNLOCK}
  20. end;
  21. function SELFCLASSNAME.AddAll(const ACollection: COLLECTIONINTERFACENAME): Boolean;
  22. var
  23. It: ITRINTERFACENAME;
  24. begin
  25. {$JPPDEFINE WRITE}{$JPPEXPANDMACRO LOCK}
  26. Result := False;
  27. if ACollection = nil then
  28. Exit;
  29. It := ACollection.First;
  30. while It.HasNext do
  31. Result := Add(It.Next) and Result;
  32. {$JPPEXPANDMACRO UNLOCK}
  33. end;
  34. function SELFCLASSNAME.BinarySearch(CONSTKEYWORDPARAMETERNAME: TYPENAME): Integer;
  35. var
  36. HiPos, LoPos, CompPos: Integer;
  37. Comp: Integer;
  38. begin
  39. {$JPPUNDEF WRITE}{$JPPEXPANDMACRO LOCK}
  40. LoPos := 0;
  41. HiPos := Size - 1;
  42. CompPos := (HiPos + LoPos) div 2;
  43. while HiPos >= LoPos do
  44. begin
  45. Comp := ItemsCompare(GETTERFUNCTIONNAME(CompPos), PARAMETERNAME);
  46. if Comp < 0 then
  47. LoPos := CompPos + 1
  48. else
  49. if Comp > 0 then
  50. HiPos := CompPos - 1
  51. else
  52. begin
  53. HiPos := CompPos;
  54. LoPos := CompPos + 1;
  55. end;
  56. CompPos := (HiPos + LoPos) div 2;
  57. end;
  58. Result := HiPos;
  59. {$JPPEXPANDMACRO UNLOCK}
  60. end;
  61. function SELFCLASSNAME.Contains(CONSTKEYWORDPARAMETERNAME: TYPENAME): Boolean;
  62. var
  63. Idx: Integer;
  64. begin
  65. {$JPPUNDEF WRITE}{$JPPEXPANDMACRO LOCK}
  66. Idx := BinarySearch(PARAMETERNAME);
  67. if Idx >= 0 then
  68. Result := ItemsEqual(GETTERFUNCTIONNAME(Idx), PARAMETERNAME)
  69. else
  70. Result := False;
  71. {$JPPEXPANDMACRO UNLOCK}
  72. end;
  73. function SELFCLASSNAME.Insert(Index: Integer; CONSTKEYWORDPARAMETERNAME: TYPENAME): Boolean;
  74. begin
  75. raise EJclOperationNotSupportedError.Create;
  76. end;
  77. procedure SELFCLASSNAME.Intersect(const ACollection: COLLECTIONINTERFACENAME);
  78. begin
  79. RetainAll(ACollection);
  80. end;
  81. procedure SELFCLASSNAME.Subtract(const ACollection: COLLECTIONINTERFACENAME);
  82. begin
  83. RemoveAll(ACollection);
  84. end;
  85. procedure SELFCLASSNAME.Union(const ACollection: COLLECTIONINTERFACENAME);
  86. begin
  87. AddAll(ACollection);
  88. end;*)