Browse Source

* implemented custom reverse function for array like enumerator classes

master
bergmann 8 years ago
parent
commit
f215e5925a
5 changed files with 335 additions and 153 deletions
  1. +123
    -112
      tests/tests.lps
  2. +127
    -1
      tests/uutlEnumeratorTests.pas
  3. +20
    -20
      uutlEnumerator.pas
  4. +46
    -14
      uutlGenerics.pas
  5. +19
    -6
      uutlListBase.pas

+ 123
- 112
tests/tests.lps View File

@@ -4,20 +4,20 @@
<PathDelim Value="\"/>
<Version Value="10"/>
<BuildModes Active="Default"/>
<Units Count="65">
<Units Count="66">
<Unit0>
<Filename Value="tests.lpr"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="-1"/>
<CursorPos X="54" Y="12"/>
<UsageCount Value="78"/>
<UsageCount Value="79"/>
</Unit0>
<Unit1>
<Filename Value="..\uutlGenerics.pas"/>
<IsPartOfProject Value="True"/>
<TopLine Value="1620"/>
<CursorPos X="16" Y="1635"/>
<UsageCount Value="78"/>
<TopLine Value="173"/>
<CursorPos X="30" Y="188"/>
<UsageCount Value="79"/>
<Loaded Value="True"/>
</Unit1>
<Unit2>
@@ -25,7 +25,7 @@
<IsPartOfProject Value="True"/>
<EditorIndex Value="-1"/>
<CursorPos X="11" Y="13"/>
<UsageCount Value="78"/>
<UsageCount Value="79"/>
</Unit2>
<Unit3>
<Filename Value="..\uutlCommon.pas"/>
@@ -33,14 +33,16 @@
<EditorIndex Value="-1"/>
<TopLine Value="206"/>
<CursorPos X="10" Y="225"/>
<UsageCount Value="78"/>
<UsageCount Value="79"/>
</Unit3>
<Unit4>
<Filename Value="..\uutlListBase.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="-1"/>
<CursorPos X="26" Y="24"/>
<UsageCount Value="78"/>
<EditorIndex Value="1"/>
<TopLine Value="79"/>
<CursorPos X="8" Y="100"/>
<UsageCount Value="79"/>
<Loaded Value="True"/>
</Unit4>
<Unit5>
<Filename Value="uutlListTest.pas"/>
@@ -49,7 +51,7 @@
<WindowIndex Value="1"/>
<TopLine Value="357"/>
<CursorPos X="7" Y="376"/>
<UsageCount Value="78"/>
<UsageCount Value="79"/>
</Unit5>
<Unit6>
<Filename Value="uutlQueueTests.pas"/>
@@ -57,7 +59,7 @@
<EditorIndex Value="-1"/>
<TopLine Value="250"/>
<CursorPos X="49" Y="260"/>
<UsageCount Value="78"/>
<UsageCount Value="79"/>
</Unit6>
<Unit7>
<Filename Value="uutlStackTests.pas"/>
@@ -65,21 +67,21 @@
<EditorIndex Value="-1"/>
<TopLine Value="246"/>
<CursorPos X="24" Y="263"/>
<UsageCount Value="78"/>
<UsageCount Value="79"/>
</Unit7>
<Unit8>
<Filename Value="uTestHelper.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="-1"/>
<CursorPos X="3" Y="12"/>
<UsageCount Value="78"/>
<UsageCount Value="79"/>
</Unit8>
<Unit9>
<Filename Value="..\uutlComparer.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="-1"/>
<CursorPos X="90" Y="6"/>
<UsageCount Value="68"/>
<UsageCount Value="69"/>
</Unit9>
<Unit10>
<Filename Value="..\uutlAlgorithm.pas"/>
@@ -87,22 +89,22 @@
<EditorIndex Value="-1"/>
<TopLine Value="138"/>
<CursorPos Y="153"/>
<UsageCount Value="78"/>
<UsageCount Value="79"/>
</Unit10>
<Unit11>
<Filename Value="uutlHashSetTests.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="-1"/>
<CursorPos X="32" Y="13"/>
<UsageCount Value="78"/>
<UsageCount Value="79"/>
</Unit11>
<Unit12>
<Filename Value="uutlAlgorithmTests.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="6"/>
<EditorIndex Value="8"/>
<TopLine Value="72"/>
<CursorPos X="43" Y="87"/>
<UsageCount Value="77"/>
<UsageCount Value="78"/>
<Loaded Value="True"/>
</Unit12>
<Unit13>
@@ -111,24 +113,26 @@
<EditorIndex Value="-1"/>
<TopLine Value="206"/>
<CursorPos X="66" Y="221"/>
<UsageCount Value="76"/>
<UsageCount Value="77"/>
</Unit13>
<Unit14>
<Filename Value="..\uutlEnumerator.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="5"/>
<TopLine Value="128"/>
<CursorPos X="15" Y="135"/>
<UsageCount Value="75"/>
<EditorIndex Value="6"/>
<TopLine Value="324"/>
<CursorPos X="42" Y="340"/>
<UsageCount Value="76"/>
<Loaded Value="True"/>
</Unit14>
<Unit15>
<Filename Value="uutlEnumeratorTests.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="-1"/>
<TopLine Value="49"/>
<CursorPos X="8" Y="66"/>
<UsageCount Value="75"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="7"/>
<TopLine Value="617"/>
<CursorPos X="74" Y="634"/>
<UsageCount Value="76"/>
<Loaded Value="True"/>
</Unit15>
<Unit16>
<Filename Value="..\uutlFilter.pas"/>
@@ -136,41 +140,40 @@
<EditorIndex Value="-1"/>
<TopLine Value="17"/>
<CursorPos X="13" Y="159"/>
<UsageCount Value="71"/>
<UsageCount Value="72"/>
</Unit16>
<Unit17>
<Filename Value="..\uutlInterfaces.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="4"/>
<TopLine Value="60"/>
<CursorPos X="51" Y="77"/>
<UsageCount Value="71"/>
<EditorIndex Value="5"/>
<TopLine Value="31"/>
<CursorPos X="70" Y="47"/>
<UsageCount Value="72"/>
<Loaded Value="True"/>
</Unit17>
<Unit18>
<Filename Value="..\uutlLinq.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="2"/>
<EditorIndex Value="3"/>
<TopLine Value="391"/>
<CursorPos X="31" Y="417"/>
<UsageCount Value="62"/>
<UsageCount Value="63"/>
<Loaded Value="True"/>
</Unit18>
<Unit19>
<Filename Value="uutlLinqTests.pas"/>
<IsPartOfProject Value="True"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="3"/>
<TopLine Value="632"/>
<CursorPos X="30" Y="648"/>
<UsageCount Value="62"/>
<EditorIndex Value="4"/>
<TopLine Value="622"/>
<CursorPos X="23" Y="650"/>
<UsageCount Value="63"/>
<Loaded Value="True"/>
</Unit19>
<Unit20>
<Filename Value="..\uutlTypes.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="-1"/>
<UsageCount Value="62"/>
<UsageCount Value="63"/>
</Unit20>
<Unit21>
<Filename Value="..\uutlSyncObjs.pas"/>
@@ -178,7 +181,7 @@
<EditorIndex Value="-1"/>
<TopLine Value="241"/>
<CursorPos X="20" Y="263"/>
<UsageCount Value="56"/>
<UsageCount Value="57"/>
</Unit21>
<Unit22>
<Filename Value="..\uutlLogger.pas"/>
@@ -186,7 +189,7 @@
<EditorIndex Value="-1"/>
<TopLine Value="419"/>
<CursorPos X="55" Y="434"/>
<UsageCount Value="54"/>
<UsageCount Value="55"/>
</Unit22>
<Unit23>
<Filename Value="..\uutlXmlHelper.pas"/>
@@ -194,7 +197,7 @@
<EditorIndex Value="-1"/>
<TopLine Value="188"/>
<CursorPos X="26" Y="203"/>
<UsageCount Value="55"/>
<UsageCount Value="56"/>
</Unit23>
<Unit24>
<Filename Value="..\uutlStreamHelper.pas"/>
@@ -202,7 +205,7 @@
<EditorIndex Value="-1"/>
<TopLine Value="216"/>
<CursorPos X="10" Y="241"/>
<UsageCount Value="54"/>
<UsageCount Value="55"/>
</Unit24>
<Unit25>
<Filename Value="..\uutlCompression.pas"/>
@@ -211,7 +214,7 @@
<WindowIndex Value="-1"/>
<TopLine Value="-1"/>
<CursorPos X="-1" Y="-1"/>
<UsageCount Value="54"/>
<UsageCount Value="55"/>
</Unit25>
<Unit26>
<Filename Value="..\uutlEmbeddedProfiler.pas"/>
@@ -220,7 +223,7 @@
<WindowIndex Value="-1"/>
<TopLine Value="-1"/>
<CursorPos X="-1" Y="-1"/>
<UsageCount Value="54"/>
<UsageCount Value="55"/>
</Unit26>
<Unit27>
<Filename Value="..\uutlKeyCodes.pas"/>
@@ -229,7 +232,7 @@
<WindowIndex Value="-1"/>
<TopLine Value="-1"/>
<CursorPos X="-1" Y="-1"/>
<UsageCount Value="54"/>
<UsageCount Value="55"/>
</Unit27>
<Unit28>
<Filename Value="..\uutlMCF.pas"/>
@@ -238,7 +241,7 @@
<WindowIndex Value="-1"/>
<TopLine Value="-1"/>
<CursorPos X="-1" Y="-1"/>
<UsageCount Value="54"/>
<UsageCount Value="55"/>
</Unit28>
<Unit29>
<Filename Value="..\uutlSScanf.pas"/>
@@ -247,7 +250,7 @@
<WindowIndex Value="-1"/>
<TopLine Value="-1"/>
<CursorPos X="-1" Y="-1"/>
<UsageCount Value="54"/>
<UsageCount Value="55"/>
</Unit29>
<Unit30>
<Filename Value="..\uutlThreads.pas"/>
@@ -256,14 +259,14 @@
<WindowIndex Value="-1"/>
<TopLine Value="-1"/>
<CursorPos X="-1" Y="-1"/>
<UsageCount Value="54"/>
<UsageCount Value="55"/>
</Unit30>
<Unit31>
<Filename Value="..\uutlEvent.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="-1"/>
<CursorPos X="11" Y="35"/>
<UsageCount Value="53"/>
<UsageCount Value="54"/>
</Unit31>
<Unit32>
<Filename Value="..\uutlEventManager.pas"/>
@@ -271,7 +274,7 @@
<EditorIndex Value="-1"/>
<TopLine Value="246"/>
<CursorPos X="39" Y="264"/>
<UsageCount Value="53"/>
<UsageCount Value="54"/>
</Unit32>
<Unit33>
<Filename Value="..\uutlObservable.pas"/>
@@ -279,7 +282,7 @@
<EditorIndex Value="-1"/>
<TopLine Value="556"/>
<CursorPos X="45" Y="572"/>
<UsageCount Value="53"/>
<UsageCount Value="54"/>
</Unit33>
<Unit34>
<Filename Value="uutlObservableListTests.pas"/>
@@ -288,7 +291,7 @@
<WindowIndex Value="1"/>
<TopLine Value="49"/>
<CursorPos Y="65"/>
<UsageCount Value="45"/>
<UsageCount Value="46"/>
</Unit34>
<Unit35>
<Filename Value="uutlObservableHashSetTests.pas"/>
@@ -297,22 +300,22 @@
<WindowIndex Value="-1"/>
<TopLine Value="129"/>
<CursorPos Y="146"/>
<UsageCount Value="25"/>
<UsageCount Value="26"/>
</Unit35>
<Unit36>
<Filename Value="uutlObservableMapTests.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="-1"/>
<CursorPos X="3" Y="13"/>
<UsageCount Value="24"/>
<UsageCount Value="25"/>
</Unit36>
<Unit37>
<Filename Value="uutlSetHelperTests.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="1"/>
<EditorIndex Value="2"/>
<TopLine Value="44"/>
<CursorPos X="64" Y="54"/>
<UsageCount Value="21"/>
<UsageCount Value="22"/>
<Loaded Value="True"/>
</Unit37>
<Unit38>
@@ -507,6 +510,13 @@
<CursorPos X="12" Y="463"/>
<UsageCount Value="11"/>
</Unit64>
<Unit65>
<Filename Value="C:\Zusatzprogramme\Lazarus\components_extra\fptest\src\FPCUnitCompatibleInterface.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="53"/>
<CursorPos X="104" Y="75"/>
<UsageCount Value="10"/>
</Unit65>
</Units>
<OtherDefines Count="3">
<Define0 Value="UTL_ADVANCED_ENUMERATORS"/>
@@ -515,123 +525,124 @@
</OtherDefines>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="uutlSetHelperTests.pas"/>
<Caret Line="57" TopLine="44"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="561" Column="7" TopLine="554"/>
</Position1>
<Position2>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1673" TopLine="1665"/>
<Caret Line="545" Column="16" TopLine="531"/>
</Position2>
<Position3>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1685" TopLine="1665"/>
<Caret Line="540" Column="13" TopLine="524"/>
</Position3>
<Position4>
<Filename Value="uutlSetHelperTests.pas"/>
<Caret Line="53" Column="36" TopLine="44"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="31" Column="17" TopLine="15"/>
</Position4>
<Position5>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1674" TopLine="1665"/>
<Caret Line="109" Column="5" TopLine="90"/>
</Position5>
<Position6>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1686" TopLine="1665"/>
<Caret Line="748" Column="16" TopLine="745"/>
</Position6>
<Position7>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1688" TopLine="1665"/>
<Caret Line="105" Column="17" TopLine="89"/>
</Position7>
<Position8>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1690" TopLine="1666"/>
<Filename Value="uutlEnumeratorTests.pas"/>
<Caret Line="55" Column="65" TopLine="35"/>
</Position8>
<Position9>
<Filename Value="uutlSetHelperTests.pas"/>
<Caret Line="64" Column="95" TopLine="43"/>
<Filename Value="..\uutlListBase.pas"/>
<Caret Line="34" Column="14" TopLine="10"/>
</Position9>
<Position10>
<Filename Value="..\uutlInterfaces.pas"/>
<Caret Line="65" Column="47" TopLine="24"/>
<Filename Value="..\uutlListBase.pas"/>
<Caret Line="97" Column="54" TopLine="86"/>
</Position10>
<Position11>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1692" TopLine="1668"/>
<Filename Value="..\uutlListBase.pas"/>
<Caret Line="182" Column="40" TopLine="164"/>
</Position11>
<Position12>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="61" Column="47" TopLine="50"/>
<Caret Line="109" Column="49" TopLine="95"/>
</Position12>
<Position13>
<Filename Value="..\uutlEnumerator.pas"/>
<Caret Line="135" Column="15" TopLine="128"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="22" Column="36" TopLine="14"/>
</Position13>
<Position14>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1656" TopLine="1642"/>
<Filename Value="uutlEnumeratorTests.pas"/>
<Caret Line="60" Column="41" TopLine="37"/>
</Position14>
<Position15>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1646" Column="14" TopLine="1640"/>
<Filename Value="uutlEnumeratorTests.pas"/>
<Caret Line="64" Column="13" TopLine="37"/>
</Position15>
<Position16>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1635" Column="16" TopLine="1620"/>
<Filename Value="uutlEnumeratorTests.pas"/>
<Caret Line="77" TopLine="73"/>
</Position16>
<Position17>
<Filename Value="..\uutlLinq.pas"/>
<Caret Line="120" Column="30" TopLine="107"/>
<Filename Value="uutlEnumeratorTests.pas"/>
<Caret Line="69" Column="34" TopLine="48"/>
</Position17>
<Position18>
<Filename Value="..\uutlLinq.pas"/>
<Caret Line="68" Column="20" TopLine="52"/>
<Filename Value="uutlEnumeratorTests.pas"/>
<Caret Line="543" Column="26" TopLine="522"/>
</Position18>
<Position19>
<Filename Value="..\uutlLinq.pas"/>
<Caret Line="283" Column="26" TopLine="259"/>
<Filename Value="uutlEnumeratorTests.pas"/>
<Caret Line="544" Column="42" TopLine="522"/>
</Position19>
<Position20>
<Filename Value="uutlLinqTests.pas"/>
<Caret Line="399" Column="29" TopLine="383"/>
<Filename Value="uutlEnumeratorTests.pas"/>
<Caret Line="538" Column="23" TopLine="520"/>
</Position20>
<Position21>
<Filename Value="..\uutlLinq.pas"/>
<Caret Line="283" Column="26" TopLine="259"/>
<Filename Value="..\uutlListBase.pas"/>
<Caret Line="33" Column="5" TopLine="15"/>
</Position21>
<Position22>
<Filename Value="..\uutlLinq.pas"/>
<Filename Value="..\uutlListBase.pas"/>
<Caret Line="100" Column="8" TopLine="79"/>
</Position22>
<Position23>
<Filename Value="..\uutlLinq.pas"/>
<Caret Line="70" Column="51" TopLine="53"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="557" Column="8" TopLine="536"/>
</Position23>
<Position24>
<Filename Value="..\uutlLinq.pas"/>
<Caret Line="125" Column="29" TopLine="98"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="753" Column="8" TopLine="732"/>
</Position24>
<Position25>
<Filename Value="..\uutlLinq.pas"/>
<Caret Line="143" Column="33" TopLine="113"/>
<Filename Value="uutlEnumeratorTests.pas"/>
<Caret Line="82" Column="18" TopLine="57"/>
</Position25>
<Position26>
<Filename Value="..\uutlLinq.pas"/>
<Caret Line="276" Column="49" TopLine="249"/>
<Filename Value="uutlEnumeratorTests.pas"/>
<Caret Line="97" TopLine="97"/>
</Position26>
<Position27>
<Filename Value="..\uutlLinq.pas"/>
<Caret Line="374" Column="27" TopLine="347"/>
<Filename Value="uutlEnumeratorTests.pas"/>
<Caret Line="90" Column="27" TopLine="67"/>
</Position27>
<Position28>
<Filename Value="..\uutlLinq.pas"/>
<Caret Line="383" Column="27" TopLine="355"/>
<Filename Value="uutlEnumeratorTests.pas"/>
<Caret Line="96" Column="21" TopLine="70"/>
</Position28>
<Position29>
<Filename Value="..\uutlLinq.pas"/>
<Caret Line="408" Column="31" TopLine="381"/>
<Filename Value="uutlEnumeratorTests.pas"/>
<Caret Line="110" TopLine="107"/>
</Position29>
<Position30>
<Filename Value="..\uutlLinq.pas"/>
<Caret Line="417" Column="31" TopLine="391"/>
<Filename Value="uutlEnumeratorTests.pas"/>
<Caret Line="640" Column="4" TopLine="616"/>
</Position30>
</JumpHistory>
</ProjectSession>


+ 127
- 1
tests/uutlEnumeratorTests.pas View File

@@ -9,7 +9,7 @@ interface

uses
Classes, SysUtils, TestFramework,
uutlEnumerator, uutlInterfaces;
uutlEnumerator, uutlInterfaces, uutlGenerics;

type
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -50,12 +50,51 @@ type
{$ENDIF}
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TutlArrayEnumeratorTests = class(TutlEnumeratorTests)
protected
procedure Generate(const aData: array of Integer); override;
public
procedure SetUp; override;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TutlQueueEnumeratorTests = class(TutlEnumeratorTests)
private type
TIntQueue = specialize TutlQueue<Integer>;
private
fQueue: TIntQueue;
protected
procedure Generate(const aData: array of Integer); override;
public
procedure SetUp; override;
procedure TearDown; override;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TutlStackEnumeratorTests = class(TutlEnumeratorTests)
private type
TIntStack = specialize TutlStack<Integer>;
private
fStack: TIntStack;
protected
procedure Generate(const aData: array of Integer); override;
public
procedure SetUp; override;
procedure TearDown; override;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TutlListEnumeratorTests = class(TutlEnumeratorTests)
private type
TIntList = specialize TutlSimpleList<Integer>;
private
fList: TIntList;
protected
procedure Generate(const aData: array of Integer); override;
public
procedure SetUp; override;
procedure TearDown; override;
end;

implementation
@@ -517,8 +556,95 @@ begin
fEnumerator := TIntArrayEnumerator.Create;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TutlQueueEnumeratorTests//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlQueueEnumeratorTests.Generate(const aData: array of Integer);
var
i: Integer;
begin
fQueue.Clear;
for i in aData do
fQueue.Enqueue(i);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlQueueEnumeratorTests.SetUp;
begin
inherited SetUp;
fQueue := TIntQueue.Create(true);
fEnumerator := fQueue.GetUtlEnumerator;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlQueueEnumeratorTests.TearDown;
begin
FreeAndNil(fQueue);
fEnumerator := nil;
inherited TearDown;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TutlStackEnumeratorTests//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlStackEnumeratorTests.Generate(const aData: array of Integer);
var
i: Integer;
begin
fStack.Clear;
for i in aData do
fStack.Push(i);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlStackEnumeratorTests.SetUp;
begin
inherited SetUp;
fStack := TIntStack.Create(true);
fEnumerator := fStack.GetUtlEnumerator;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlStackEnumeratorTests.TearDown;
begin
fEnumerator := nil;
FreeAndNil(fStack);
inherited TearDown;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TutlListEnumeratorTests///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlListEnumeratorTests.Generate(const aData: array of Integer);
var
i: Integer;
begin
fList.Clear;
for i in aData do
fList.Add(i);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlListEnumeratorTests.SetUp;
begin
inherited SetUp;
fList := TIntList.Create(true);
fEnumerator := fList.GetUtlEnumerator;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlListEnumeratorTests.TearDown;
begin
fEnumerator := nil;
FreeAndNil(fList);
inherited TearDown;
end;

initialization
RegisterTest(TutlArrayEnumeratorTests.Suite);
RegisterTest(TutlQueueEnumeratorTests.Suite);
RegisterTest(TutlStackEnumeratorTests.Suite);
RegisterTest(TutlListEnumeratorTests.Suite);

end.


+ 20
- 20
uutlEnumerator.pas View File

@@ -89,16 +89,16 @@ type

strict private
fMemory: PT;
fReverse: Boolean;
fReversed: Boolean;
fCurrent: Integer;
fFirst: Integer;
fLast: Integer;

protected
property Memory: PT read fMemory write fMemory;
property Reverse: Boolean read fReverse write fReverse;
property First: Integer read fFirst write fFirst;
property Last: Integer read fLast write fLast;
property Memory: PT read fMemory write fMemory;
property Reversed: Boolean read fReversed write fReversed;
property First: Integer read fFirst write fFirst;
property Last: Integer read fLast write fLast;

protected { TutlEnumerator }
function InternalMoveNext: Boolean; override;
@@ -120,7 +120,7 @@ type
const aCount: Integer); overload;
constructor Create(
const aMemory: PT;
const aReverse: Boolean;
const aReversed: Boolean;
const aFirst: Integer;
const aLast: Integer); overload;
end;
@@ -145,7 +145,7 @@ type

constructor Create; overload;
constructor Create(const aData: TArray); overload;
constructor Create(const aData: TArray; const aReverse: Boolean); overload;
constructor Create(const aData: TArray; const aReversed: Boolean); overload;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -537,7 +537,7 @@ end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlMemoryEnumerator.InternalMoveNext: Boolean;
begin
if fReverse
if fReversed
then dec(fCurrent)
else inc(fCurrent);
result := (fFirst <= fCurrent) and (fCurrent <= fLast);
@@ -546,7 +546,7 @@ end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlMemoryEnumerator.InternalReset;
begin
if fReverse
if fReversed
then fCurrent := fLast + 1
else fCurrent := fFirst - 1;
end;
@@ -581,7 +581,7 @@ var
begin
Reset;
SetLength(result, fLast - fFirst + 1);
if fReverse then begin
if fReversed then begin
for i := fFirst to fLast do
result[i-fFirst] := fMemory[i];
end else
@@ -592,20 +592,20 @@ end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TutlMemoryEnumerator.Create(const aMemory: PT; const aCount: Integer);
begin
Create(aMemory, false, 0, aCount - 1)
Create(aMemory, false, 0, aCount - 1);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TutlMemoryEnumerator.Create(
const aMemory: PT;
const aReverse: Boolean;
const aReversed: Boolean;
const aFirst: Integer;
const aLast: Integer);
begin
fMemory := aMemory;
fReverse := aReverse;
fFirst := aFirst;
fLast := aLast;
fMemory := aMemory;
fReversed := aReversed;
fFirst := aFirst;
fLast := aLast;
inherited Create;
end;

@@ -633,10 +633,10 @@ begin
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TutlArrayEnumerator.Create(const aData: TArray; const aReverse: Boolean);
constructor TutlArrayEnumerator.Create(const aData: TArray; const aReversed: Boolean);
begin
fData := aData;
inherited Create(@fData[0], aReverse, low(fData), high(fData));
inherited Create(@fData[0], aReversed, low(fData), high(fData));
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -645,8 +645,8 @@ end;
{$IFDEF UTL_ENUMERATORS}
procedure TutlReverseEnumerator.InternalReset;
begin
Data := fEnumerator.ToArray;
Reverse := true;
Data := fEnumerator.ToArray;
Reversed := true;
inherited InternalReset;
end;



+ 46
- 14
uutlGenerics.pas View File

@@ -24,17 +24,23 @@ type
, specialize IutlEnumerator<T>)
strict private
fOwner: TutlQueue;
fReversed: Boolean;
fCurrent: Integer;

protected { TutlEnumerator }
function InternalMoveNext: Boolean; override;
procedure InternalReset; override;

{$IFDEF UTL_ENUMERATORS}
public { IutlEnumerator }
function Reverse: IutlEnumerator; override;
{$ENDIF}

public { IEnumerator }
function GetCurrent: T; override;

public
constructor Create(const aOwner: TutlQueue);
constructor Create(const aOwner: TutlQueue; const aReversed: Boolean);
end;

public type
@@ -95,11 +101,16 @@ type
private
fOwner: TutlStack;

public { IEnumerator }
protected { IEnumerator }
procedure InternalReset; override;

{$IFDEF UTL_ENUMERATORS}
public { IutlEnumerator }
function Reverse: IutlEnumerator; override;
{$ENDIF}

public
constructor Create(const aOwner: TutlStack); reintroduce;
constructor Create(const aOwner: TutlStack; const aReversed: Boolean); reintroduce;
end;

public type
@@ -523,15 +534,27 @@ implementation
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlQueue.TEnumerator.InternalMoveNext: Boolean;
begin
inc(fCurrent);
result := (fCurrent < fOwner.Count);
if fReversed
then dec(fCurrent)
else inc(fCurrent);
result := (0 <= fCurrent) and (fCurrent < fOwner.Count);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlQueue.TEnumerator.InternalReset;
begin
fCurrent := -1;
if fReversed
then fCurrent := fOwner.Count
else fCurrent := -1;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{$IFDEF UTL_ENUMERATORS}
function TutlQueue.TEnumerator.Reverse: IutlEnumerator;
begin
result := TEnumerator.Create(fOwner, not fReversed);
end;
{$ENDIF}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlQueue.TEnumerator.GetCurrent: T;
@@ -540,11 +563,12 @@ begin
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TutlQueue.TEnumerator.Create(const aOwner: TutlQueue);
constructor TutlQueue.TEnumerator.Create(const aOwner: TutlQueue; const aReversed: Boolean);
begin
if not Assigned(aOwner) then
raise EArgumentNilException.Create('aOwner');
fOwner := aOwner;
fOwner := aOwner;
fReversed := aReversed;
inherited Create;
end;

@@ -621,14 +645,14 @@ end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlQueue.GetEnumerator: IEnumerator;
begin
result := TEnumerator.Create(self);
result := TEnumerator.Create(self, false);
result.Reset;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlQueue.GetUtlEnumerator: IutlEnumerator;
begin
result := TEnumerator.Create(self);
result := TEnumerator.Create(self, false);
result.Reset;
end;

@@ -721,12 +745,20 @@ begin
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TutlStack.TEnumerator.Create(const aOwner: TutlStack);
{$IFDEF UTL_ENUMERATORS}
function TutlStack.TEnumerator.Reverse: IutlEnumerator;
begin
result := TEnumerator.Create(fOwner, not Reversed);
end;
{$ENDIF}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TutlStack.TEnumerator.Create(const aOwner: TutlStack; const aReversed: Boolean);
begin
if not Assigned(aOwner) then
raise EArgumentNilException.Create('aOwner');
fOwner := aOwner;
inherited Create(nil, 0);
inherited Create(nil, aReversed, 0, -1);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -762,13 +794,13 @@ end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlStack.GetEnumerator: IEnumerator;
begin
result := TEnumerator.Create(self);
result := TEnumerator.Create(self, false);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlStack.GetUtlEnumerator: IutlEnumerator;
begin
result := TEnumerator.Create(self);
result := TEnumerator.Create(self, false);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


+ 19
- 6
uutlListBase.pas View File

@@ -27,11 +27,16 @@ type
private
fOwner: TutlListBase;

public { IEnumerator }
protected { IEnumerator }
procedure InternalReset; override;

{$IFDEF UTL_ENUMERATORS}
public { IutlEnumerator }
function Reverse: IutlEnumerator; override;
{$ENDIF}

public
constructor Create(const aOwner: TutlListBase); reintroduce;
constructor Create(const aOwner: TutlListBase; const aReversed: Boolean); reintroduce;
end;

strict private
@@ -87,12 +92,20 @@ begin
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TutlListBase.TEnumerator.Create(const aOwner: TutlListBase);
{$IFDEF UTL_ENUMERATORS}
function TutlListBase.TEnumerator.Reverse: IutlEnumerator;
begin
result := TEnumerator.Create(fOwner, not Reversed);
end;
{$ENDIF}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TutlListBase.TEnumerator.Create(const aOwner: TutlListBase; const aReversed: Boolean);
begin
if not Assigned(aOwner) then
raise EArgumentNilException.Create('aOwner');
fOwner := aOwner;
inherited Create(nil, 0);
inherited Create(nil, aReversed, 0, -1);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -166,13 +179,13 @@ end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlListBase.GetEnumerator: IEnumerator;
begin
result := TEnumerator.Create(self);
result := TEnumerator.Create(self, false);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlListBase.GetUtlEnumerator: specialize IutlEnumerator<T>;
begin
result := TEnumerator.Create(self);
result := TEnumerator.Create(self, false);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Loading…
Cancel
Save