|
1 | 1 | (******************************************************************************) |
2 | 2 | (* uFifo.pas 23.09.2005 *) |
3 | 3 | (* *) |
4 | | -(* Version : 0.04 *) |
| 4 | +(* Version : 0.05 *) |
5 | 5 | (* *) |
6 | 6 | (* Author : Uwe Schächterle (Corpsman) *) |
7 | 7 | (* *) |
|
28 | 28 | (* Bugfix Verlust von Daten beim Push *) |
29 | 29 | (* 0.03 - property count *) |
30 | 30 | (* 0.04 - TFifo thread Safe gemacht *) |
| 31 | +(* 0.05 - TBufferedFifo.BufferSize *) |
31 | 32 | (* *) |
32 | 33 | (******************************************************************************) |
33 | 34 |
|
|
62 | 63 | fCount: integer; |
63 | 64 | cs: TCriticalSection; |
64 | 65 | public |
| 66 | + Type |
| 67 | + TComparefunction = Function(Const a, b: T): Boolean Of Object; |
| 68 | + |
65 | 69 | Property Count: integer read fCount; // Anzahl der Aktuell enthaltenen Elemente |
66 | 70 | // Initialisieren |
67 | 71 | Constructor create; |
|
77 | 81 | Function Top: T; |
78 | 82 | // Gibt True zurück wenn Leer |
79 | 83 | Function isempty: Boolean; |
| 84 | + // Zum Prüfen ob die queue einen eintrag aElement hat |
| 85 | + Function ContainsElement(Const aElement: T; CompareFunction: TComparefunction): Boolean; |
80 | 86 | End; |
81 | 87 |
|
82 | 88 | FifoException = Class(Exception); |
|
97 | 103 | fCount: integer; |
98 | 104 | fHead: integer; |
99 | 105 | fTail: integer; |
| 106 | + Function getBufferSize: integer; |
100 | 107 | public |
101 | 108 | Property Count: integer read fCount; // Anzahl der Aktuell enthaltenen Elemente |
| 109 | + Property BufferSize: integer read getBufferSize; |
102 | 110 | // Initialisieren |
103 | 111 | Constructor create; overload; // Ruft Create(16) auf. |
104 | 112 | Constructor create(InitialBufferSize: integer); overload; |
|
230 | 238 | Result := Not assigned(Front); |
231 | 239 | End; |
232 | 240 |
|
| 241 | +Function TFifo.ContainsElement(Const aElement: T; |
| 242 | + CompareFunction: TComparefunction): Boolean; |
| 243 | +Var |
| 244 | + p: PGenQ; |
| 245 | +Begin |
| 246 | + result := false; |
| 247 | + cs.Acquire; |
| 248 | + Try |
| 249 | + p := front; |
| 250 | + While assigned(p) Do Begin |
| 251 | + result := CompareFunction(aElement, p^.Value); |
| 252 | + If result Then Begin |
| 253 | + p := Nil; |
| 254 | + End |
| 255 | + Else Begin |
| 256 | + p := p^.Next; |
| 257 | + End; |
| 258 | + End; |
| 259 | + Finally |
| 260 | + cs.Release; |
| 261 | + End; |
| 262 | +End; |
| 263 | + |
233 | 264 | { TBufferedFifo } |
234 | 265 |
|
235 | 266 | Constructor TBufferedFifo.create; |
|
243 | 274 | If InitialBufferSize <= 2 Then Begin |
244 | 275 | Raise BufferedFifoException.Create('Invalid InitialBufferSize, has to be > 2'); |
245 | 276 | End; |
246 | | - fHead := 0; |
247 | | - fTail := 0; |
248 | | - fCount := 0; |
249 | 277 | setlength(fBuffer, InitialBufferSize); |
| 278 | + Clear(); |
250 | 279 | End; |
251 | 280 |
|
252 | 281 | Destructor TBufferedFifo.Destroy; |
253 | 282 | Begin |
254 | 283 | setlength(fbuffer, 0); |
| 284 | + fbuffer := Nil; |
255 | 285 | Inherited Destroy; |
256 | 286 | End; |
257 | 287 |
|
| 288 | +Function TBufferedFifo.getBufferSize: integer; |
| 289 | +Begin |
| 290 | + result := length(fBuffer); |
| 291 | +End; |
| 292 | + |
258 | 293 | Procedure TBufferedFifo.Clear; |
259 | 294 | Begin |
260 | 295 | // Die Indexe werden gelöscht, der Puffer bleibt Allokiert => die Query ist Leer ;) |
|
317 | 352 |
|
318 | 353 | End. |
319 | 354 |
|
320 | | - |
321 | | - |
322 | | - |
323 | | - |
|
0 commit comments