From 54da341e2a17f064c13d238697eff8d036305c3c Mon Sep 17 00:00:00 2001 From: Bergmann89 Date: Fri, 1 May 2015 16:37:46 +0200 Subject: [PATCH] * implemented reverse enumerator --- uutlGenerics.pas | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/uutlGenerics.pas b/uutlGenerics.pas index 0e8f47b..2abc795 100644 --- a/uutlGenerics.pas +++ b/uutlGenerics.pas @@ -84,13 +84,15 @@ type public type TEnumerator = class(TObject) private + fReverse: Boolean; fList: TFPList; fPosition: Integer; function GetCurrent: T; public property Current: T read GetCurrent; + function GetEnumerator: TEnumerator; function MoveNext: Boolean; - constructor Create(const aList: TFPList); + constructor Create(const aList: TFPList; const aReverse: Boolean = false); end; private @@ -111,9 +113,10 @@ type procedure DeleteIntern(const aIndex: Integer; const aFreeItem: Boolean = true); public - property OwnsObjects: Boolean read fOwnsObjects write fOwnsObjects; + property OwnsObjects: Boolean read fOwnsObjects write fOwnsObjects; function GetEnumerator: TEnumerator; + function GetReverseEnumerator: TEnumerator; procedure Clear; constructor Create(const aOwnsObjects: Boolean = true); @@ -703,19 +706,34 @@ begin result := PListItem(fList[fPosition])^.data; end; +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +function TutlListBase.TEnumerator.GetEnumerator: TEnumerator; +begin + result := self; +end; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TutlListBase.TEnumerator.MoveNext: Boolean; begin - inc(fPosition); - result := (fPosition < fList.Count) + if fReverse then begin + dec(fPosition); + result := (fPosition >= 0); + end else begin + inc(fPosition); + result := (fPosition < fList.Count) + end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -constructor TutlListBase.TEnumerator.Create(const aList: TFPList); +constructor TutlListBase.TEnumerator.Create(const aList: TFPList; const aReverse: Boolean); begin inherited Create; fList := aList; - fPosition := -1; + fReverse := aReverse; + if fReverse then + fPosition := fList.Count + else + fPosition := -1; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -808,7 +826,13 @@ end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TutlListBase.GetEnumerator: TEnumerator; begin - result := TEnumerator.Create(fList); + result := TEnumerator.Create(fList, false); +end; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +function TutlListBase.GetReverseEnumerator: TEnumerator; +begin + result := TEnumerator.Create(fList, true); end; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////