source: trunk/Packages/TemplateGenerics/Specialized/SpecializedList.pas

Last change on this file was 18, checked in by chronos, 12 years ago
  • Used external packages are now stored in uncompressed form rather in zipped files. This allow better package version synchronisation.
File size: 14.3 KB
Line 
1unit SpecializedList;
2
3{$mode delphi}
4
5interface
6
7uses
8 Classes, SysUtils;
9
10type
11{$MACRO ON}
12
13// TListInteger<Integer, Integer>
14{$DEFINE TGListIndex := Integer}
15{$DEFINE TGListItem := Integer}
16{$DEFINE TGList := TListInteger}
17{$DEFINE TGListSortCompare := TListIntegerSortCompare}
18{$DEFINE TGListToStringConverter := TListIntegerToStringConverter}
19{$DEFINE TGListFromStringConverter := TListIntegerFromStringConverter}
20{$DEFINE TGListItemArray := TListIntegerItemArray}
21{$DEFINE INTERFACE}
22{$I 'GenericList.inc'}
23
24// TListBoolean<Integer, Boolean>
25{$DEFINE TGListIndex := Integer}
26{$DEFINE TGListItem := Boolean}
27{$DEFINE TGList := TListBoolean}
28{$DEFINE TGListSortCompare := TListBooleanSortCompare}
29{$DEFINE TGListToStringConverter := TListBooleanToStringConverter}
30{$DEFINE TGListFromStringConverter := TListBooleanFromStringConverter}
31{$DEFINE TGListItemArray := TListBooleanItemArray}
32{$DEFINE INTERFACE}
33{$I 'GenericList.inc'}
34
35// TListSmallInt<Integer, SmallInt>
36{$DEFINE TGListIndex := Integer}
37{$DEFINE TGListItem := SmallInt}
38{$DEFINE TGList := TListSmallInt}
39{$DEFINE TGListSortCompare := TListSmallIntSortCompare}
40{$DEFINE TGListToStringConverter := TListSmallIntToStringConverter}
41{$DEFINE TGListFromStringConverter := TListSmallIntFromStringConverter}
42{$DEFINE TGListItemArray := TListSmallIntItemArray}
43{$DEFINE INTERFACE}
44{$I 'GenericList.inc'}
45
46// TListDouble<Integer, Double>
47{$DEFINE TGListIndex := Integer}
48{$DEFINE TGListItem := Double}
49{$DEFINE TGList := TListDouble}
50{$DEFINE TGListSortCompare := TListDoubleSortCompare}
51{$DEFINE TGListToStringConverter := TListDoubleToStringConverter}
52{$DEFINE TGListFromStringConverter := TListDoubleFromStringConverter}
53{$DEFINE TGListItemArray := TListDoubleItemArray}
54{$DEFINE INTERFACE}
55{$INCLUDE '..\Generic\GenericList.inc'}
56
57// TListPointer<Integer, Pointer>
58{$DEFINE TGListIndex := Integer}
59{$DEFINE TGListItem := Pointer}
60{$DEFINE TGList := TListPointer}
61{$DEFINE TGListSortCompare := TListPointerSortCompare}
62{$DEFINE TGListToStringConverter := TListPointerToStringConverter}
63{$DEFINE TGListFromStringConverter := TListPointerFromStringConverter}
64{$DEFINE TGListItemArray := TListPointerItemArray}
65{$DEFINE INTERFACE}
66{$I 'GenericList.inc'}
67
68// TListString<Integer, string>
69{$DEFINE TGListStringIndex := Integer}
70{$DEFINE TGListStringItem := string}
71{$DEFINE TGListString := TListString}
72{$DEFINE TGListStringSortCompare := TListStringSortCompare}
73{$DEFINE TGListStringToStringConverter := TListStringToStringConverter}
74{$DEFINE TGListStringFromStringConverter := TListStringFromStringConverter}
75{$DEFINE TGListItemArray := TListStringItemArray}
76{$DEFINE INTERFACE}
77{$I 'GenericListString.inc'}
78
79// TListByte<Integer, Byte>
80{$DEFINE TGListIndex := Integer}
81{$DEFINE TGListItem := Byte}
82{$DEFINE TGList := TListByteBase}
83{$DEFINE TGListSortCompare := TListByteSortCompare}
84{$DEFINE TGListToStringConverter := TListByteToStringConverter}
85{$DEFINE TGListFromStringConverter := TListByteFromStringConverter}
86{$DEFINE TGListItemArray := TListByteItemArray}
87{$DEFINE INTERFACE}
88{$I 'GenericList.inc'}
89
90TListByte = class(TListByteBase)
91 procedure WriteToStream(Stream: TStream);
92 procedure WriteToStreamPart(Stream: TStream; ItemIndex, ItemCount: TGListIndex);
93 procedure ReplaceStream(Stream: TStream);
94 procedure ReplaceStreamPart(Stream: TStream; ItemIndex, ItemCount: TGListIndex);
95 procedure AddStream(Stream: TStream);
96 procedure AddStreamPart(Stream: TStream; ItemCount: TGListIndex);
97 procedure WriteBuffer(var Buffer; Count: Integer);
98 procedure ReadBuffer(var Buffer; Count: Integer);
99end;
100
101// TListChar<Integer, Char>
102{$DEFINE TGListIndex := Integer}
103{$DEFINE TGListItem := Char}
104{$DEFINE TGList := TListCharBase}
105{$DEFINE TGListSortCompare := TListSortCompareChar}
106{$DEFINE TGListToStringConverter := TListToStringConverterChar}
107{$DEFINE TGListFromStringConverter := TListFromStringConverterChar}
108{$DEFINE TGListItemArray := TListStringItemArray}
109{$DEFINE INTERFACE}
110{$I 'GenericList.inc'}
111
112// TListObject<Integer, TObject>
113{$DEFINE TGListObjectIndex := Integer}
114{$DEFINE TGListObjectItem := TObject}
115{$DEFINE TGListObjectList := TListObjectList}
116{$DEFINE TGListObject := TListObject}
117{$DEFINE TGListObjectSortCompare := TListObjectSortCompare}
118{$DEFINE TGListObjectToStringConverter := TListObjectToStringConverter}
119{$DEFINE TGListObjectFromStringConverter := TListObjectFromStringConverter}
120{$DEFINE TGListItemArray := TListObjectItemArray}
121{$DEFINE INTERFACE}
122{$I 'GenericListObject.inc'}
123
124
125{ TListChar }
126
127// TListByte<Integer, Char>
128TListChar = class(TListCharBase)
129 procedure UpperCase;
130 procedure LowerCase;
131 procedure Trim;
132 procedure TrimLeft;
133 procedure TrimRight;
134end;
135
136// TListMethodBase<Integer, TMethod>
137{$DEFINE TGListIndex := Integer}
138{$DEFINE TGListItem := TMethod}
139{$DEFINE TGList := TListMethodBase}
140{$DEFINE TGListSortCompare := TListMethodSortCompare}
141{$DEFINE TGListToStringConverter := TListMethodToStringConverter}
142{$DEFINE TGListFromStringConverter := TListMethodFromStringConverter}
143{$DEFINE TGListItemArray := TListMethodItemArray}
144{$DEFINE INTERFACE}
145{$I 'GenericList.inc'}
146
147// TListMethod<Integer, TMethod>
148TListMethod = class(TListMethodBase)
149 procedure CallAll;
150end;
151
152// TListNotifyEventBase<Integer, TNotifyEvent>
153{$DEFINE TGListIndex := Integer}
154{$DEFINE TGListItem := TNotifyEvent}
155{$DEFINE TGList := TListNotifyEventBase}
156{$DEFINE TGListSortCompare := TListNotifyEventSortCompare}
157{$DEFINE TGListToStringConverter := TListNotifyEventToStringConverter}
158{$DEFINE TGListFromStringConverter := TListNotifyEventFromStringConverter}
159{$DEFINE TGListItemArray := TListNotifyEventItemArray}
160{$DEFINE INTERFACE}
161{$I 'GenericList.inc'}
162
163// TListNotifyEvent<Integer, TNotifyEvent>
164TListNotifyEvent = class(TListNotifyEventBase)
165 procedure CallAll(Sender: TObject);
166end;
167
168
169TBaseEvent = procedure of object;
170
171// TListSimpleEventBase<Integer, TBaseEvent>
172{$DEFINE TGListIndex := Integer}
173{$DEFINE TGListItem := TBaseEvent}
174{$DEFINE TGList := TListSimpleEventBase}
175{$DEFINE TGListSortCompare := TListSimpleEventSortCompare}
176{$DEFINE TGListToStringConverter := TListSimpleEventToStringConverter}
177{$DEFINE TGListFromStringConverter := TListSimpleEventFromStringConverter}
178{$DEFINE TGListItemArray := TListSimpleEventItemArray}
179{$DEFINE INTERFACE}
180{$I 'GenericList.inc'}
181
182// TListSimpleEvent<Integer, TSimpleEvent>
183TListSimpleEvent = class(TListSimpleEventBase)
184 procedure CallAll;
185end;
186
187
188function StrToStr(Value: string): string;
189
190implementation
191
192{$DEFINE IMPLEMENTATION_USES}
193{$I 'GenericList.inc'}
194
195// TListInteger<Integer, Integer>
196{$DEFINE TGListIndex := Integer}
197{$DEFINE TGListItem := Integer}
198{$DEFINE TGList := TListInteger}
199{$DEFINE TGListSortCompare := TListIntegerSortCompare}
200{$DEFINE TGListToStringConverter := TListIntegerToStringConverter}
201{$DEFINE TGListFromStringConverter := TListIntegerFromStringConverter}
202{$DEFINE TGListItemArray := TListIntegerItemArray}
203{$DEFINE IMPLEMENTATION}
204{$I 'GenericList.inc'}
205
206// TListSmallInt<Integer, SmallInt>
207{$DEFINE TGListIndex := Integer}
208{$DEFINE TGListItem := SmallInt}
209{$DEFINE TGList := TListSmallInt}
210{$DEFINE TGListSortCompare := TListSmallIntSortCompare}
211{$DEFINE TGListToStringConverter := TListSmallIntToStringConverter}
212{$DEFINE TGListFromStringConverter := TListSmallIntFromStringConverter}
213{$DEFINE TGListItemArray := TListSmallIntItemArray}
214{$DEFINE IMPLEMENTATION}
215{$I 'GenericList.inc'}
216
217// TListBoolean<Integer, Boolean>
218{$DEFINE TGListIndex := Integer}
219{$DEFINE TGListItem := Boolean}
220{$DEFINE TGList := TListBoolean}
221{$DEFINE TGListSortCompare := TListBooleanSortCompare}
222{$DEFINE TGListToStringConverter := TListBooleanToStringConverter}
223{$DEFINE TGListFromStringConverter := TListBooleanFromStringConverter}
224{$DEFINE TGListItemArray := TListBooleanItemArray}
225{$DEFINE IMPLEMENTATION}
226{$I 'GenericList.inc'}
227
228// TListDouble<Integer, Double>
229{$DEFINE TGListIndex := Integer}
230{$DEFINE TGListItem := Double}
231{$DEFINE TGList := TListDouble}
232{$DEFINE TGListSortCompare := TListDoubleSortCompare}
233{$DEFINE TGListToStringConverter := TListDoubleToStringConverter}
234{$DEFINE TGListFromStringConverter := TListDoubleFromStringConverter}
235{$DEFINE TGListItemArray := TListDoubleItemArray}
236{$DEFINE IMPLEMENTATION}
237{$I 'GenericList.inc'}
238
239// TListPointer<Integer, Pointer>
240{$DEFINE TGListIndex := Integer}
241{$DEFINE TGListItem := Pointer}
242{$DEFINE TGList := TListPointer}
243{$DEFINE TGListSortCompare := TListPointerSortCompare}
244{$DEFINE TGListToStringConverter := TListPointerToStringConverter}
245{$DEFINE TGListFromStringConverter := TListPointerFromStringConverter}
246{$DEFINE TGListItemArray := TListPointerItemArray}
247{$DEFINE IMPLEMENTATION}
248{$I 'GenericList.inc'}
249
250// TListString<Integer, string>
251{$DEFINE TGListStringIndex := Integer}
252{$DEFINE TGListStringItem := string}
253{$DEFINE TGListString := TListString}
254{$DEFINE TGListStringSortCompare := TListStringSortCompare}
255{$DEFINE TGListStringToStringConverter := TListStringToStringConverter}
256{$DEFINE TGListStringFromStringConverter := TListStringFromStringConverter}
257{$DEFINE TGListItemArray := TListStringItemArray}
258{$DEFINE IMPLEMENTATION}
259{$I 'GenericListString.inc'}
260
261// TListByte<Integer, Byte>
262{$DEFINE TGListIndex := Integer}
263{$DEFINE TGListItem := Byte}
264{$DEFINE TGList := TListByteBase}
265{$DEFINE TGListSortCompare := TListByteSortCompare}
266{$DEFINE TGListToStringConverter := TListByteToStringConverter}
267{$DEFINE TGListFromStringConverter := TListByteFromStringConverter}
268{$DEFINE TGListItemArray := TListByteItemArray}
269{$DEFINE IMPLEMENTATION}
270{$I 'GenericList.inc'}
271
272// TListByte<Integer, Char>
273{$DEFINE TGListIndex := Integer}
274{$DEFINE TGListItem := Char}
275{$DEFINE TGList := TListCharBase}
276{$DEFINE TGListSortCompare := TListSortCompareChar}
277{$DEFINE TGListToStringConverter := TListToStringConverterChar}
278{$DEFINE TGListFromStringConverter := TListFromStringConverterChar}
279{$DEFINE TGListItemArray := TListStringItemArray}
280{$DEFINE IMPLEMENTATION}
281{$I 'GenericList.inc'}
282
283// TListObject<Integer, TObject>
284{$DEFINE TGListObjectIndex := Integer}
285{$DEFINE TGListObjectItem := TObject}
286{$DEFINE TGListObjectList := TListObjectList}
287{$DEFINE TGListObject := TListObject}
288{$DEFINE TGListObjectSortCompare := TListObjectSortCompare}
289{$DEFINE TGListObjectToStringConverter := TListObjectToStringConverter}
290{$DEFINE TGListObjectFromStringConverter := TListObjectFromStringConverter}
291{$DEFINE TGListItemArray := TListObjectItemArray}
292{$DEFINE IMPLEMENTATION}
293{$I 'GenericListObject.inc'}
294
295// TListMethod<Integer, TMethod>
296{$DEFINE TGListIndex := Integer}
297{$DEFINE TGListItem := TMethod}
298{$DEFINE TGList := TListMethodBase}
299{$DEFINE TGListSortCompare := TListMethodSortCompare}
300{$DEFINE TGListToStringConverter := TListMethodToStringConverter}
301{$DEFINE TGListFromStringConverter := TListMethodFromStringConverter}
302{$DEFINE TGListItemArray := TListMethodItemArray}
303{$DEFINE IMPLEMENTATION}
304{$I 'GenericList.inc'}
305
306// TListNotifyEventBase<Integer, TNotifyEvent>
307{$DEFINE TGListIndex := Integer}
308{$DEFINE TGListItem := TNotifyEvent}
309{$DEFINE TGList := TListNotifyEventBase}
310{$DEFINE TGListSortCompare := TListNotifyEventSortCompare}
311{$DEFINE TGListToStringConverter := TListNotifyEventToStringConverter}
312{$DEFINE TGListFromStringConverter := TListNotifyEventFromStringConverter}
313{$DEFINE TGListItemArray := TListNotifyEventItemArray}
314{$DEFINE IMPLEMENTATION}
315{$I 'GenericList.inc'}
316
317// TListSimpleEventBase<Integer, TBaseEvent>
318{$DEFINE TGListIndex := Integer}
319{$DEFINE TGListItem := TBaseEvent}
320{$DEFINE TGList := TListSimpleEventBase}
321{$DEFINE TGListSortCompare := TListSimpleEventSortCompare}
322{$DEFINE TGListToStringConverter := TListSimpleEventToStringConverter}
323{$DEFINE TGListFromStringConverter := TListSimpleEventFromStringConverter}
324{$DEFINE TGListItemArray := TListSimpleEventItemArray}
325{$DEFINE IMPLEMENTATION}
326{$I 'GenericList.inc'}
327
328
329
330function StrToStr(Value: string): string;
331begin
332 Result := Value;
333end;
334
335{ TListSimpleEvent }
336
337procedure TListSimpleEvent.CallAll;
338var
339 I: TGListIndex;
340begin
341 I := 0;
342 while (I < Count) do begin
343 TBaseEvent(Items[I])();
344 I := I + 1;
345 end;
346end;
347
348
349{ TListChar }
350
351procedure TListChar.UpperCase;
352var
353 I: TGListIndex;
354begin
355 for I := 0 to Count - 1 do
356 if (FItems[I] in ['a'..'z']) then
357 FItems[I] := Char(Byte(FItems[I]) - 32);
358end;
359
360procedure TListChar.LowerCase;
361var
362 I: TGListIndex;
363begin
364 for I := 0 to Count - 1 do
365 if (FItems[I] in ['A'..'Z']) then
366 FItems[I] := Char(Byte(FItems[I]) + 32);
367end;
368
369procedure TListChar.Trim;
370begin
371 TrimLeft;
372 TrimRight;
373end;
374
375procedure TListChar.TrimLeft;
376var
377 I: TGListIndex;
378begin
379 I := 0;
380 while (I < Count) and (FItems[I] = ' ') do
381 I := I + 1;
382 if I < Count then
383 DeleteItems(0, I);
384end;
385
386procedure TListChar.TrimRight;
387var
388 I: TGListIndex;
389begin
390 I := Count - 1;
391 while (I >= 0) and (FItems[I] = ' ') do
392 I := I - 1;
393 if I >= 0 then
394 DeleteItems(I + 1, Count - I - 1);
395end;
396
397procedure TListMethod.CallAll;
398var
399 I: TGListIndex;
400begin
401 I := 0;
402 while (I < Count) do begin
403 Items[I];
404 I := I + 1;
405 end;
406end;
407
408procedure TListNotifyEvent.CallAll(Sender: TObject);
409var
410 I: TGListIndex;
411begin
412 I := 0;
413 while (I < Count) do begin
414 TNotifyEvent(Items[I])(Sender);
415 I := I + 1;
416 end;
417end;
418
419{ TListByte }
420
421procedure TListByte.WriteToStream(Stream: TStream);
422var
423 I: Integer;
424begin
425 Stream.Position := 0;
426 I := 0;
427 while I < Count do begin
428 Stream.WriteByte(Items[I]);
429 I := I + 1;
430 end;
431end;
432
433procedure TListByte.WriteToStreamPart(Stream: TStream; ItemIndex, ItemCount: Integer);
434var
435 I: Integer;
436begin
437 I := ItemIndex;
438 while I < ItemCount do begin
439 Stream.WriteByte(Items[I]);
440 I := I + 1;
441 end;
442end;
443
444procedure TListByte.ReplaceStream(Stream: TStream);
445var
446 I: Integer;
447begin
448 Stream.Position := 0;
449 I := 0;
450 while I < Count do begin
451 Items[I] := Stream.ReadByte;
452 I := I + 1;
453 end;
454end;
455
456procedure TListByte.ReplaceStreamPart(Stream: TStream; ItemIndex,
457 ItemCount: Integer);
458var
459 I: Integer;
460begin
461 I := ItemIndex;
462 while I < ItemCount do begin
463 Items[I] := Stream.ReadByte;
464 I := I + 1;
465 end;
466end;
467
468procedure TListByte.AddStream(Stream: TStream);
469var
470 I: Integer;
471begin
472 Stream.Position := 0;
473 I := Count;
474 Count := Count + Stream.Size;
475 while I < Count do begin
476 Items[I] := Stream.ReadByte;
477 I := I + 1;
478 end;
479end;
480
481procedure TListByte.AddStreamPart(Stream: TStream; ItemCount: Integer);
482var
483 I: Integer;
484begin
485 I := Count;
486 Count := Count + ItemCount;
487 while I < Count do begin
488 Items[I] := Stream.ReadByte;
489 I := I + 1;
490 end;
491end;
492
493procedure TListByte.WriteBuffer(var Buffer; Count: Integer);
494begin
495
496end;
497
498procedure TListByte.ReadBuffer(var Buffer; Count: Integer);
499begin
500
501end;
502
503end.
Note: See TracBrowser for help on using the repository browser.