Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

332 rindas
15 KiB

  1. unit uutlObservableGenerics;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. uutlGenerics;
  7. type
  8. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. generic TutlEventList<T> = class(specialize TutlHashSetBase<T>)
  10. private type
  11. TComparer = class(TInterfacedObject, IComparer)
  12. public
  13. function Compare(const i1, i2: T): Integer;
  14. end;
  15. public
  16. function RegisterEvent(const aEvent: T): Boolean;
  17. function UnregisterEvent(const aEvent: T): Boolean;
  18. constructor Create;
  19. end;
  20. TutlNotifyEventList = specialize TutlEventList<TNotifyEvent>;
  21. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  22. generic TutlObservableCustomList<T> = class(specialize TutlCustomList<T>)
  23. public type
  24. TEvent = procedure(aSender: TObject; const aIndex: Integer; const aItem: T) of object;
  25. TEventList = specialize TutlEventList<TEvent>;
  26. private
  27. fOnAddItem: TEventList;
  28. fOnRemoveItem: TEventList;
  29. protected
  30. procedure InsertIntern(const aIndex: Integer; const aItem: T); override;
  31. procedure DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean = true); override;
  32. public
  33. property OnAddItem: TEventList read fOnAddItem;
  34. property OnRemoveItem: TEventList read fOnRemoveItem;
  35. constructor Create(aEqualityComparer: IEqualityComparer; const aOwnsObjects: Boolean = true);
  36. destructor Destroy; override;
  37. end;
  38. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. generic TutlObservableList<T> = class(specialize TutlObservableCustomList<T>)
  40. public type
  41. TEqualityComparer = specialize TutlEqualityComparer<T>;
  42. public
  43. constructor Create(const aOwnsObjects: Boolean = true);
  44. end;
  45. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  46. generic TutlObservableCustomHashSet<T> = class(specialize TutlCustomHashSet<T>)
  47. public type
  48. TEvent = procedure(aSender: TObject; const aItem: T) of object;
  49. TEventList = specialize TutlEventList<TEvent>;
  50. private
  51. fOnAddItem: TEventList;
  52. fOnRemoveItem: TEventList;
  53. protected
  54. procedure InsertIntern(const aIndex: Integer; const aItem: T); override;
  55. procedure DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean = true); override;
  56. public
  57. property OnAddItem: TEventList read fOnAddItem;
  58. property OnRemoveItem: TEventList read fOnRemoveItem;
  59. constructor Create(aComparer: IComparer; const aOwnsObjects: Boolean = true);
  60. destructor Destroy; override;
  61. end;
  62. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  63. generic TutlObservableHashSet<T> = class(specialize TutlObservableCustomHashSet<T>)
  64. public type
  65. TComparer = specialize TutlComparer<T>;
  66. public
  67. constructor Create(const aOwnsObjects: Boolean = true);
  68. end;
  69. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  70. generic TutlObservableCustomMap<TKey, TValue> = class(specialize TutlMapBase<TKey, TValue>)
  71. public type
  72. TEvent = procedure(aSender: TObject; const aKey: TKey; const aValue: TValue) of object;
  73. TEventList = specialize TutlEventList<TEvent>;
  74. TObservableHashSet = class(THashSet)
  75. private
  76. fOwner: TObject;
  77. fOnAddItem: TEventList;
  78. fOnRemoveItem: TEventList;
  79. protected
  80. procedure InsertIntern(const aIndex: Integer; const aItem: TKeyValuePair); override;
  81. procedure DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean = true); override;
  82. public
  83. property OnAddItem: TEventList read fOnAddItem write fOnAddItem;
  84. property OnRemoveItem: TEventList read fOnRemoveItem write fOnRemoveItem;
  85. constructor Create(const aOwner: TObject; const aComparer: IComparer; const aOwnsObjects: Boolean = true);
  86. end;
  87. private
  88. fHashSetImpl: TObservableHashSet;
  89. fOnAddItem: TEventList;
  90. fOnRemoveItem: TEventList;
  91. public
  92. property OnAddItem: TEventList read fOnAddItem;
  93. property OnRemoveItem: TEventList read fOnRemoveItem;
  94. constructor Create(const aComparer: IComparer; const aOwnsObjects: Boolean = true);
  95. destructor Destroy; override;
  96. end;
  97. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  98. generic TutlObservableMap<TKey, TValue> = class(specialize TutlObservableCustomMap<TKey, TValue>)
  99. public type
  100. TComparer = specialize TutlComparer<TKey>;
  101. public
  102. constructor Create(const aOwnsObjects: Boolean = true);
  103. end;
  104. implementation
  105. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  106. //TutlEventList/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  107. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  108. function TutlEventList.TComparer.Compare(const i1, i2: T): Integer;
  109. var
  110. m1, m2: TMethod;
  111. begin
  112. m1 := TMethod(i1);
  113. m2 := TMethod(i2);
  114. if (m1.Data < m2.Data) then
  115. result := -1
  116. else if (m1.Data > m2.Data) then
  117. result := 1
  118. else if (m1.Code < m2.Code) then
  119. result := -1
  120. else if (m1.Code > m2.Code) then
  121. result := 1
  122. else
  123. result := 0;
  124. end;
  125. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  126. function TutlEventList.RegisterEvent(const aEvent: T): Boolean;
  127. var
  128. i: Integer;
  129. begin
  130. result := (SearchItem(0, List.Count-1, aEvent, i) < 0);
  131. if result then
  132. InsertIntern(i, aEvent);
  133. end;
  134. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  135. function TutlEventList.UnregisterEvent(const aEvent: T): Boolean;
  136. var
  137. i, tmp: Integer;
  138. begin
  139. i := SearchItem(0, List.Count-1, aEvent, tmp);
  140. result := (i >= 0);
  141. if result then
  142. DeleteIntern(i);
  143. end;
  144. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  145. constructor TutlEventList.Create;
  146. begin
  147. inherited Create(TComparer.Create, true);
  148. end;
  149. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  150. //TutlObservableCustomList//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  151. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  152. procedure TutlObservableCustomList.InsertIntern(const aIndex: Integer; const aItem: T);
  153. var
  154. e: TEvent;
  155. begin
  156. inherited InsertIntern(aIndex, aItem);
  157. if Assigned(fOnAddItem) then
  158. for e in fOnAddItem do
  159. e(self, aIndex, aItem);
  160. end;
  161. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  162. procedure TutlObservableCustomList.DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean);
  163. var
  164. e: TEvent;
  165. begin
  166. if Assigned(fOnRemoveItem) then
  167. for e in fOnRemoveItem do
  168. e(self, aIndex, GetItem(aIndex));
  169. inherited DeleteIntern(aIndex, aFreeItem);
  170. end;
  171. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  172. constructor TutlObservableCustomList.Create(aEqualityComparer: IEqualityComparer; const aOwnsObjects: Boolean);
  173. begin
  174. inherited Create(aEqualityComparer, aOwnsObjects);
  175. fOnAddItem := TEventList.Create;
  176. fOnRemoveItem := TEventList.Create;
  177. end;
  178. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  179. destructor TutlObservableCustomList.Destroy;
  180. begin
  181. FreeAndNil(fOnRemoveItem);
  182. FreeAndNil(fOnAddItem);
  183. inherited Destroy;
  184. end;
  185. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  186. //TutlObservableList////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  187. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  188. constructor TutlObservableList.Create(const aOwnsObjects: Boolean);
  189. begin
  190. inherited Create(TEqualityComparer.Create, aOwnsObjects);
  191. end;
  192. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  193. //TutlObservableCustomHashSet///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  194. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  195. procedure TutlObservableCustomHashSet.InsertIntern(const aIndex: Integer; const aItem: T);
  196. var
  197. e: TEvent;
  198. begin
  199. inherited InsertIntern(aIndex, aItem);
  200. if Assigned(fOnAddItem) then
  201. for e in fOnAddItem do
  202. e(self, aItem);
  203. end;
  204. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  205. procedure TutlObservableCustomHashSet.DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean);
  206. var
  207. e: TEvent;
  208. begin
  209. if Assigned(fOnRemoveItem) then
  210. for e in fOnRemoveItem do
  211. e(self, GetItem(aIndex));
  212. inherited DeleteIntern(aIndex, aFreeItem);
  213. end;
  214. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  215. constructor TutlObservableCustomHashSet.Create(aComparer: IComparer; const aOwnsObjects: Boolean);
  216. begin
  217. inherited Create(aComparer, aOwnsObjects);
  218. fOnAddItem := TEventList.Create;
  219. fOnRemoveItem := TEventList.Create;
  220. end;
  221. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  222. destructor TutlObservableCustomHashSet.Destroy;
  223. begin
  224. inherited Destroy; // calls clear -> Free EventLists after
  225. FreeAndNil(fOnAddItem);
  226. FreeAndNil(fOnRemoveItem);
  227. end;
  228. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  229. //TutlObservableHashSet/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  230. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  231. constructor TutlObservableHashSet.Create(const aOwnsObjects: Boolean);
  232. begin
  233. inherited Create(TComparer.Create, aOwnsObjects);
  234. end;
  235. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  236. //TutlObservableCustomMap///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  237. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  238. procedure TutlObservableCustomMap.TObservableHashSet.InsertIntern(const aIndex: Integer; const aItem: TKeyValuePair);
  239. var
  240. e: TEvent;
  241. begin
  242. inherited InsertIntern(aIndex, aItem);
  243. if Assigned(fOnAddItem) then begin
  244. for e in fOnAddItem do
  245. e(fOwner, aItem.Key, aItem.Value);
  246. end;
  247. end;
  248. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  249. procedure TutlObservableCustomMap.TObservableHashSet.DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean);
  250. var
  251. e: TEvent;
  252. tmp: TKeyValuePair;
  253. begin
  254. if Assigned(fOnRemoveItem) then begin
  255. tmp := GetItem(aIndex);
  256. for e in fOnRemoveItem do
  257. e(fOwner, tmp.Key, tmp.Value);
  258. end;
  259. inherited DeleteIntern(aIndex, aFreeItem);
  260. end;
  261. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  262. constructor TutlObservableCustomMap.TObservableHashSet.Create(const aOwner: TObject; const aComparer: IComparer; const aOwnsObjects: Boolean);
  263. begin
  264. inherited Create(aComparer, aOwnsObjects);
  265. fOwner := aOwner;
  266. end;
  267. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  268. constructor TutlObservableCustomMap.Create(const aComparer: IComparer; const aOwnsObjects: Boolean);
  269. begin
  270. fOnAddItem := TEventList.Create;
  271. fOnRemoveItem := TEventList.Create;
  272. fHashSetImpl := TObservableHashSet.Create(self, TKeyValuePairComparer.Create(aComparer), aOwnsObjects);
  273. fHashSetImpl.OnAddItem := fOnAddItem;
  274. fHashSetImpl.OnRemoveItem := fOnRemoveItem;
  275. inherited Create(fHashSetImpl);
  276. end;
  277. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  278. destructor TutlObservableCustomMap.Destroy;
  279. begin
  280. inherited Destroy;
  281. FreeAndNil(fHashSetImpl);
  282. FreeAndNil(fOnAddItem);
  283. FreeAndNil(fOnRemoveItem);
  284. end;
  285. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  286. //TutlObservableMap/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  287. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  288. constructor TutlObservableMap.Create(const aOwnsObjects: Boolean);
  289. begin
  290. inherited Create(TComparer.Create, aOwnsObjects);
  291. end;
  292. end.