You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

182 lines
6.2 KiB

  1. unit uutlFilter;
  2. {$mode objfpc}{$H+}
  3. {$IFDEF UTL_NESTED_PROCVARS}
  4. {$modeswitch nestedprocvars}
  5. {$ENDIF}
  6. interface
  7. uses
  8. Classes, SysUtils,
  9. uutlInterfaces;
  10. type
  11. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  12. generic TutlFilterEvent<T> = function(constref i: T): Boolean;
  13. generic TutlFilterEventO<T> = function(constref i: T): Boolean of object;
  14. {$IFDEF UTL_NESTED_PROCVARS}
  15. generic TutlFilterEventN<T> = function(constref i: T): Boolean is nested;
  16. {$ENDIF}
  17. generic TutlCallbackFilter<T> = class(
  18. TInterfacedObject,
  19. specialize IutlFilter<T>)
  20. private type
  21. TFilterEventType = (fetNormal, fetObject, fetNested);
  22. public type
  23. TFilterEvent = specialize TutlFilterEvent<T>;
  24. TFilterEventO = specialize TutlFilterEventO<T>;
  25. {$IFDEF UTL_NESTED_PROCVARS}
  26. TFilterEventN = specialize TutlFilterEventN<T>;
  27. {$ENDIF}
  28. strict private
  29. fType: TFilterEventType;
  30. fEvent: TFilterEvent;
  31. fEventO: TFilterEventO;
  32. {$IFDEF UTL_NESTED_PROCVARS}
  33. fEventN: TFilterEventN;
  34. {$ENDIF}
  35. public
  36. function Filter(constref i: T): Boolean;
  37. constructor Create(constref aEvent: TFilterEvent); overload;
  38. constructor Create(constref aEvent: TFilterEventO); overload;
  39. {$IFDEF UTL_NESTED_PROCVARS}
  40. constructor Create(constref aEvent: TFilterEventN); overload;
  41. {$ENDIF}
  42. end;
  43. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  44. generic TutlSelectEvent <Tin, Tout> = function(constref i: Tin): Tout;
  45. generic TutlSelectEventO<Tin, Tout> = function(constref i: Tin): Tout of object;
  46. {$IFDEF UTL_NESTED_PROCVARS}
  47. generic TutlSelectEventN<Tin, Tout> = function(constref i: Tin): Tout is nested;
  48. {$ENDIF}
  49. generic TutlCallbackSelector<Tin, Tout> = class(
  50. TInterfacedObject,
  51. specialize IutlSelector<Tin, Tout>)
  52. private type
  53. TSelectEventType = (setNormal, setObject, setNested);
  54. public type
  55. TSelectEvent = specialize TutlSelectEvent <Tin, Tout>;
  56. TSelectEventO = specialize TutlSelectEventO<Tin, Tout>;
  57. {$IFDEF UTL_NESTED_PROCVARS}
  58. TSelectEventN = specialize TutlSelectEventN<Tin, Tout>;
  59. {$ENDIF}
  60. strict private
  61. fType: TSelectEventType;
  62. fEvent: TSelectEvent;
  63. fEventO: TSelectEventO;
  64. {$IFDEF UTL_NESTED_PROCVARS}
  65. fEventN: TSelectEventN;
  66. {$ENDIF}
  67. public
  68. function Select(constref i: Tin): Tout;
  69. constructor Create(constref aEvent: TSelectEvent); overload;
  70. constructor Create(constref aEvent: TSelectEventO); overload;
  71. {$IFDEF UTL_NESTED_PROCVARS}
  72. constructor Create(constref aEvent: TSelectEventN); overload;
  73. {$ENDIF}
  74. end;
  75. implementation
  76. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  77. //TutlCallbackFilter/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  78. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79. function TutlCallbackFilter.Filter(constref i: T): Boolean;
  80. begin
  81. result := false;
  82. case fType of
  83. fetNormal: result := fEvent (i);
  84. fetObject: result := fEventO(i);
  85. {$IFDEF UTL_NESTED_PROCVARS}
  86. fetNested: result := fEventN(i);
  87. {$ENDIF}
  88. else
  89. raise Exception.Create('invalid or unknown callback type');
  90. end;
  91. end;
  92. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  93. constructor TutlCallbackFilter.Create(constref aEvent: TFilterEvent);
  94. begin
  95. inherited Create;
  96. fType := fetNormal;
  97. fEvent := aEvent;
  98. end;
  99. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  100. constructor TutlCallbackFilter.Create(constref aEvent: TFilterEventO);
  101. begin
  102. inherited Create;
  103. fType := fetObject;
  104. fEventO := aEvent;
  105. end;
  106. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  107. {$IFDEF UTL_NESTED_PROCVARS}
  108. constructor TutlCallbackFilter.Create(constref aEvent: TFilterEventN);
  109. begin
  110. inherited Create;
  111. fType := fetNested;
  112. fEventN := aEvent;
  113. end;
  114. {$ENDIF}
  115. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  116. //TutlCallbackSelector///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  117. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  118. function TutlCallbackSelector.Select(constref i: Tin): Tout;
  119. begin
  120. case fType of
  121. setNormal: result := fEvent (i);
  122. setObject: result := fEventO(i);
  123. {$IFDEF UTL_NESTED_PROCVARS}
  124. setNested: result := fEventN(i);
  125. {$ENDIF}
  126. else
  127. raise Exception.Create('invalid or unknown callback type');
  128. end;
  129. end;
  130. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  131. constructor TutlCallbackSelector.Create(constref aEvent: TSelectEvent);
  132. begin
  133. inherited Create;
  134. fType := setNormal;
  135. fEvent := aEvent;
  136. end;
  137. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  138. constructor TutlCallbackSelector.Create(constref aEvent: TSelectEventO);
  139. begin
  140. inherited Create;
  141. fType := setObject;
  142. fEventO := aEvent;
  143. end;
  144. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  145. {$IFDEF UTL_NESTED_PROCVARS}
  146. constructor TutlCallbackSelector.Create(constref aEvent: TSelectEventN);
  147. begin
  148. inherited Create;
  149. fType := setNested;
  150. fEventN := aEvent;
  151. end;
  152. {$ENDIF}
  153. end.