Ver a proveniência

* implemented PagedDataFiFo

master
Bergmann89 há 9 anos
ascendente
cometimento
6958fe916c
5 ficheiros alterados com 628 adições e 71 eliminações
  1. +9
    -0
      .gitignore
  2. +6
    -0
      Tests/UtilsTests.lpi
  3. +99
    -71
      Tests/UtilsTests.lps
  4. +156
    -0
      Tests/uGenericsTests.pas
  5. +358
    -0
      uutlGenerics.pas

+ 9
- 0
.gitignore Ver ficheiro

@@ -0,0 +1,9 @@
*.dbg
*.exe
*.log
*.profraw
*.heaptrc
*lib/
*/cache*
*.o
*.ppu

+ 6
- 0
Tests/UtilsTests.lpi Ver ficheiro

@@ -62,9 +62,15 @@
<OtherUnitFiles Value=".."/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>
<Optimizations>
<OptimizationLevel Value="0"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<UseHeaptrc Value="True"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
</Linking>
</CompilerOptions>


+ 99
- 71
Tests/UtilsTests.lps Ver ficheiro

@@ -4,41 +4,39 @@
<PathDelim Value="\"/>
<Version Value="9"/>
<BuildModes Active="Default"/>
<Units Count="5">
<Units Count="7">
<Unit0>
<Filename Value="UtilsTests.lpr"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="2"/>
<CursorPos X="12" Y="6"/>
<UsageCount Value="22"/>
<Loaded Value="True"/>
<EditorIndex Value="-1"/>
<CursorPos Y="22"/>
<UsageCount Value="24"/>
</Unit0>
<Unit1>
<Filename Value="uGenericsTests.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uGenericsTests"/>
<IsVisibleTab Value="True"/>
<TopLine Value="559"/>
<CursorPos X="54" Y="580"/>
<UsageCount Value="22"/>
<TopLine Value="124"/>
<CursorPos X="27" Y="135"/>
<UsageCount Value="24"/>
<Loaded Value="True"/>
</Unit1>
<Unit2>
<Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\packages\fcl-fpcunit\src\fpcunit.pp"/>
<UnitName Value="fpcunit"/>
<EditorIndex Value="1"/>
<EditorIndex Value="-1"/>
<TopLine Value="113"/>
<CursorPos X="21" Y="129"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit2>
<Unit3>
<Filename Value="..\uutlGenerics.pas"/>
<UnitName Value="uutlGenerics"/>
<EditorIndex Value="3"/>
<TopLine Value="308"/>
<CursorPos X="15" Y="111"/>
<UsageCount Value="11"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="1"/>
<TopLine Value="448"/>
<CursorPos X="30" Y="461"/>
<UsageCount Value="12"/>
<Loaded Value="True"/>
</Unit3>
<Unit4>
@@ -47,124 +45,154 @@
<CursorPos X="11" Y="30"/>
<UsageCount Value="10"/>
</Unit4>
<Unit5>
<Filename Value="C:\Zusatzprogramme\Lazarus\components\fpcunit\guitestrunner.pas"/>
<ComponentName Value="GUITestRunner"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="GuiTestRunner"/>
<EditorIndex Value="-1"/>
<TopLine Value="78"/>
<CursorPos X="3" Y="41"/>
<UsageCount Value="10"/>
</Unit5>
<Unit6>
<Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\objpas.inc"/>
<EditorIndex Value="-1"/>
<UsageCount Value="10"/>
</Unit6>
</Units>
<JumpHistory Count="29" HistoryIndex="28">
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="376" Column="30" TopLine="359"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1812" TopLine="1795"/>
</Position1>
<Position2>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="470" Column="13" TopLine="447"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1813" TopLine="1795"/>
</Position2>
<Position3>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="472" Column="41" TopLine="446"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1826" TopLine="1798"/>
</Position3>
<Position4>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="88" Column="23" TopLine="63"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1898" Column="4" TopLine="1884"/>
</Position4>
<Position5>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="97" TopLine="86"/>
<Caret Line="781" TopLine="768"/>
</Position5>
<Position6>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="86" Column="8" TopLine="74"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1954" TopLine="1937"/>
</Position6>
<Position7>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="101" Column="20" TopLine="88"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1888" TopLine="1871"/>
</Position7>
<Position8>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="303" Column="50" TopLine="284"/>
<Caret Line="1889" TopLine="1871"/>
</Position8>
<Position9>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="524" Column="14" TopLine="514"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1811" TopLine="1794"/>
</Position9>
<Position10>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="89" Column="50" TopLine="74"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1889" TopLine="1872"/>
</Position10>
<Position11>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="90" Column="37" TopLine="70"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1890" TopLine="1878"/>
</Position11>
<Position12>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="530" Column="33" TopLine="509"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1891" TopLine="1878"/>
</Position12>
<Position13>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="583" Column="32" TopLine="565"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1892" TopLine="1878"/>
</Position13>
<Position14>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="598" Column="5" TopLine="567"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1895" TopLine="1878"/>
</Position14>
<Position15>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="655" Column="19" TopLine="626"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1896" TopLine="1878"/>
</Position15>
<Position16>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="95" Column="29" TopLine="85"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1897" TopLine="1878"/>
</Position16>
<Position17>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="666" Column="45" TopLine="657"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1899" TopLine="1878"/>
</Position17>
<Position18>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="563" Column="23" TopLine="547"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1900" TopLine="1878"/>
</Position18>
<Position19>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="566" Column="23" TopLine="547"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1901" TopLine="1878"/>
</Position19>
<Position20>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="687" TopLine="663"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1906" TopLine="1885"/>
</Position20>
<Position21>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="686" Column="58" TopLine="670"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1907" TopLine="1885"/>
</Position21>
<Position22>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="700" Column="9" TopLine="682"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1908" TopLine="1885"/>
</Position22>
<Position23>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="704" Column="38" TopLine="692"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1909" TopLine="1885"/>
</Position23>
<Position24>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="700" Column="19" TopLine="685"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1890" TopLine="1884"/>
</Position24>
<Position25>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="612" TopLine="587"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1888" TopLine="1882"/>
</Position25>
<Position26>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="717" Column="17" TopLine="689"/>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="497" Column="53" TopLine="477"/>
</Position26>
<Position27>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="1161" Column="3" TopLine="1148"/>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="105" TopLine="88"/>
</Position27>
<Position28>
<Filename Value="..\uutlGenerics.pas"/>
<Caret Line="887" Column="3" TopLine="884"/>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="123" Column="36" TopLine="112"/>
</Position28>
<Position29>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="658" Column="28" TopLine="652"/>
<Caret Line="827" Column="37" TopLine="813"/>
</Position29>
<Position30>
<Filename Value="uGenericsTests.pas"/>
<Caret Line="829" Column="44" TopLine="812"/>
</Position30>
</JumpHistory>
</ProjectSession>
<Debugging>
<Watches Count="2">
<Item1>
<Expression Value="aCount"/>
</Item1>
<Item2>
<Expression Value="aConsumer"/>
</Item2>
</Watches>
</Debugging>
</CONFIG>

+ 156
- 0
Tests/uGenericsTests.pas Ver ficheiro

@@ -105,6 +105,23 @@ type
procedure Delete;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TutlPagedDataFiFoTest = class(TTestCase)
private type
TTestFiFo = specialize TutlPagedDataFiFo<Byte>;
private
fFiFo: TTestFiFo;
protected
procedure SetUp; override;
procedure TearDown; override;
published
procedure WriteReadSinglePage;
procedure WriteReadMultiPage;
procedure WritePeekReadSinglePage;
procedure WritePeekReadMultiPage;
procedure WriteDiscardReadSinglePage;
procedure WriteDiscardReadMultiPage;
end;

implementation

@@ -701,10 +718,149 @@ begin
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TutlPagedDataFiFoTest/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlPagedDataFiFoTest.SetUp;
begin
inherited SetUp;
fFiFo := TTestFiFo.Create;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlPagedDataFiFoTest.TearDown;
begin
FreeAndNil(fFiFo);
inherited TearDown;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlPagedDataFiFoTest.WriteReadSinglePage;
var
buf1, buf2: String;
l: Integer;
begin
buf1 := 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis a';
l := Length(buf1);
AssertEquals(l, fFiFo.Write(PByte(@buf1[1]), l));
AssertEquals(l, fFiFo.Size);

SetLength(buf2, l);
AssertEquals(l, fFiFo.Read(PByte(@buf2[1]), l));
AssertEquals(0, fFiFo.Size);
Assert(buf1 = buf2);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlPagedDataFiFoTest.WriteReadMultiPage;
var
buf1, buf2: String;
l: Integer;
begin
buf1 := 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptu';
l := Length(buf1);
AssertEquals(l, fFiFo.Write(PByte(@buf1[1]), l));
AssertEquals(l, fFiFo.Size);

SetLength(buf2, l);
AssertEquals(l, fFiFo.Read(PByte(@buf2[1]), l));
AssertEquals(0, fFiFo.Size);
Assert(buf1 = buf2);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlPagedDataFiFoTest.WritePeekReadSinglePage;
var
buf1, buf2, buf3: String;
l: Integer;
begin
buf1 := 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis a';
l := Length(buf1);
AssertEquals(l, fFiFo.Write(PByte(@buf1[1]), l));
AssertEquals(l, fFiFo.Size);

SetLength(buf2, l);
AssertEquals(l, fFiFo.Peek(PByte(@buf2[1]), l));
AssertEquals(l, fFiFo.Size);
Assert(buf1 = buf2);

SetLength(buf3, l);
AssertEquals(l, fFiFo.Read(PByte(@buf3[1]), l));
AssertEquals(0, fFiFo.Size);
Assert(buf1 = buf3);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlPagedDataFiFoTest.WritePeekReadMultiPage;
var
buf1, buf2, buf3: String;
l: Integer;
begin
buf1 := 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptu';
l := Length(buf1);
AssertEquals(l, fFiFo.Write(PByte(@buf1[1]), l));
AssertEquals(l, fFiFo.Size);

SetLength(buf2, l);
AssertEquals(l, fFiFo.Peek(PByte(@buf2[1]), l));
AssertEquals(l, fFiFo.Size);
Assert(buf1 = buf2);

SetLength(buf3, l);
AssertEquals(l, fFiFo.Read(PByte(@buf3[1]), l));
AssertEquals(0, fFiFo.Size);
Assert(buf1 = buf3);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlPagedDataFiFoTest.WriteDiscardReadSinglePage;
var
buf1, buf2: String;
l: Integer;
begin
buf1 := 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptu';
l := Length(buf1);
AssertEquals(l, fFiFo.Write(PByte(@buf1[1]), l));
AssertEquals(l, fFiFo.Size);

AssertEquals(512, fFiFo.Discard(512));
AssertEquals(l - 512, fFiFo.Size);

buf1 := 't clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptu';
l := Length(buf1);
SetLength(buf2, l);
AssertEquals(l, fFiFo.Read(PByte(@buf2[1]), l));
AssertEquals(0, fFiFo.Size);
Assert(buf1 = buf2);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlPagedDataFiFoTest.WriteDiscardReadMultiPage;
var
buf1, buf2: String;
l: Integer;
begin
buf1 := 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptu';
l := Length(buf1);
AssertEquals(l, fFiFo.Write(PByte(@buf1[1]), l));
AssertEquals(l, fFiFo.Size);

AssertEquals(3000, fFiFo.Discard(3000));
AssertEquals(l - 3000, fFiFo.Size);

buf1 := 'tur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptu';
l := Length(buf1);
SetLength(buf2, l);
AssertEquals(l, fFiFo.Read(PByte(@buf2[1]), l));
AssertEquals(0, fFiFo.Size);
Assert(buf1 = buf2);
end;

initialization
RegisterTest(TutlListTest);
RegisterTest(TutlHashSetTest);
RegisterTest(TutlMapTest);
RegisterTest(TutlPagedDataFiFoTest);

end.


+ 358
- 0
uutlGenerics.pas Ver ficheiro

@@ -430,6 +430,89 @@ type
property Size: integer read fDataLen;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
generic TutlPagedDataFiFo<TData> = class
private type
TPage = packed record
Data: array of TData;
ReadPos: Integer;
WritePos: Integer;
end;
PData = ^TData;
PPage = ^TPage;
TPageList = specialize TutlList<PPage>;
public type
IDataProvider = interface(IUnknown)
function Give(const aBuffer: PData; aCount: Integer): Integer;
end;

IDataConsumer = interface(IUnknown)
function Take(const aBuffer: PData; aCount: Integer): Integer;
end;

TDataProvider = class(TInterfacedObject, IDataProvider)
private
fData: PData;
fPos: Integer;
fCount: Integer;
public
function Give(const aBuffer: PData; aCount: Integer): Integer;
constructor Create(const aData: PData; const aCount: Integer);
end;

TDataConsumer = class(TInterfacedObject, IDataConsumer)
private
fData: PData;
fPos: Integer;
fCount: Integer;
public
function Take(const aBuffer: PData; aCount: Integer): Integer;
constructor Create(const aData: PData; const aCount: Integer);
end;

private
fPageSize: Integer;
fPages: TPageList;
fReadPage: PPage;
fWritePage: PPage;
fSize: Integer;

procedure InitReadPage(out aReadPage: PPage; out aDummyPage: TPage; out aPageIndex: Integer; const aMoveReadPos: Boolean);
function NextReadPage(out aReadPage: PPage; out aDummyPage: TPage; var aPageIndex: Integer; const aMoveReadPos: Boolean): Boolean;
protected
function WriteIntern(const aProvider: IDataProvider; aCount: Integer): Integer; virtual;
function ReadIntern(const aConsumer: IDataConsumer; aCount: Integer; const aMoveReadPos: Boolean): Integer; virtual;
public
property Size: Integer read fSize;

function Write(const aProvider: IDataProvider; const aCount: Integer): Integer; overload;
function Write(const aData: PData; const aCount: Integer): Integer; overload;

function Read(const aConsumer: IDataConsumer; const aCount: Integer): Integer; overload;
function Read(const aData: PData; const aCount: Integer): Integer; overload;

function Peek(const aConsumer: IDataConsumer; const aCount: Integer): Integer; overload;
function Peek(const aData: PData; const aCount: Integer): Integer; overload;

function Discard(const aCount: Integer): Integer;
procedure Clear;

constructor Create(const aPageSize: Integer = 2048);
destructor Destroy; override;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
generic TutlSyncPagedDataFiFo<TData> = class(specialize TutlPagedDataFiFo<TData>)
private
fLock: TutlSpinLock;
protected
function WriteIntern(const aProvider: IDataProvider; aCount: Integer): Integer; override;
function ReadIntern(const aConsumer: IDataConsumer; aCount: Integer; const aMoveReadPos: Boolean): Integer; override;
public
constructor Create(const aPageSize: Integer = 2048);
destructor Destroy; override;
end;

function utlFreeOrFinalize(var obj; const aTypeInfo: PTypeInfo; const aFreeObj: Boolean = true): Boolean;

implementation
@@ -1685,6 +1768,281 @@ begin
fReadEvent.SetEvent;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TutlPagedDataFiFo.TDataProvider///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlPagedDataFiFo.TDataProvider.Give(const aBuffer: PData; aCount: Integer): Integer;
begin
result := 0;
if (aCount > fCount - fPos) then
aCount := fCount - fPos;
if (aCount <= 0) then
exit;
Move((fData + fPos)^, aBuffer^, aCount * SizeOf(TData));
inc(fPos, aCount);
result := aCount;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TutlPagedDataFiFo.TDataProvider.Create(const aData: PData; const aCount: Integer);
begin
inherited Create;
fData := aData;
fCount := aCount;
fPos := 0;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TutlPagedDataFiFo.TDataConsumer///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlPagedDataFiFo.TDataConsumer.Take(const aBuffer: PData; aCount: Integer): Integer;
begin
result := 0;
if (aCount > fCount - fPos) then
aCount := fCount - fPos;
if (aCount <= 0) then
exit;
Move(aBuffer^, (fData + fPos)^, aCount * SizeOf(TData));
inc(fPos, aCount);
result := aCount;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TutlPagedDataFiFo.TDataConsumer.Create(const aData: PData; const aCount: Integer);
begin
inherited Create;
fData := aData;
fCount := aCount;
fPos := 0;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TutlPagedDataFiFo/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlPagedDataFiFo.InitReadPage(out aReadPage: PPage; out aDummyPage: TPage; out aPageIndex: Integer; const aMoveReadPos: Boolean);
begin
if not aMoveReadPos then begin
aPageIndex := 0;
aReadPage := nil;
if not Assigned(fReadPage) then
exit;
aDummyPage := fReadPage^; // copy page (only pointer to data is copied, because it's a dynamic array)
aReadPage := @aDummyPage;
end else
aReadPage := fReadPage;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlPagedDataFiFo.NextReadPage(out aReadPage: PPage; out aDummyPage: TPage; var aPageIndex: Integer; const aMoveReadPos: Boolean): Boolean;
begin
result := false;
if not aMoveReadPos then begin
if (aPageIndex >= fPages.Count) then
exit;
aDummyPage := fPages[aPageIndex]^;
aReadPage := @aDummyPage;
inc(aPageIndex);
end else begin
if Assigned(fReadPage) then begin
Dispose(fReadPage);
fReadPage := nil;
end;
fReadPage := fPages.PopFirst;
if not Assigned(fReadPage) then
exit;
aReadPage := fReadPage;
end;
result := true;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlPagedDataFiFo.WriteIntern(const aProvider: IDataProvider; aCount: Integer): Integer;
var
c, r: Integer;
begin
if not Assigned(aProvider) then
raise EArgumentNil.Create('aProvider');

result := 0;
while (aCount > 0) do begin
if not Assigned(fWritePage) or (fWritePage^.WritePos >= fPageSize) then begin
fWritePage := nil;
new(fWritePage);
fWritePage^.ReadPos := 0;
fWritePage^.WritePos := 0;
SetLength(fWritePage^.Data, fPageSize);
fPages.PushLast(fWritePage);
end;

c := fPageSize - fWritePage^.WritePos;
if (c > aCount) then
c := aCount;

r := aProvider.Give(@fWritePage^.Data[fWritePage^.WritePos], c);
if (r = 0) then
exit;

inc(result, r);
inc(fWritePage^.WritePos, r);
dec(aCount, r);
inc(fSize, r);
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlPagedDataFiFo.ReadIntern(const aConsumer: IDataConsumer; aCount: Integer; const aMoveReadPos: Boolean): Integer;
var
ReadPage: PPage;
DummyPage: TPage;
PageIndex, c, r: Integer;

begin
result := 0;
InitReadPage(ReadPage, DummyPage, PageIndex, aMoveReadPos);
while (aCount > 0) do begin
if (not Assigned(ReadPage) or (ReadPage^.ReadPos >= fPageSize)) and
not NextReadPage(ReadPage, DummyPage, PageIndex, aMoveReadPos) then
exit;

c := fPageSize - ReadPage^.ReadPos;
if (c > aCount) then
c := aCount;

if Assigned(aConsumer) then begin
r := aConsumer.Take(@ReadPage^.Data[ReadPage^.ReadPos], c);
if (r = 0) then
exit;
end else
r := c;

inc(result, r);
inc(ReadPage^.ReadPos, r);
dec(aCount, r);
if aMoveReadPos then
dec(fSize, r);
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlPagedDataFiFo.Write(const aProvider: IDataProvider; const aCount: Integer): Integer;
begin
result := WriteIntern(aProvider, aCount);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlPagedDataFiFo.Write(const aData: PData; const aCount: Integer): Integer;
var
provider: IDataProvider;
begin
provider := TDataProvider.Create(aData, aCount);
result := WriteIntern(provider, aCount);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlPagedDataFiFo.Read(const aConsumer: IDataConsumer; const aCount: Integer): Integer;
begin
result := ReadIntern(aConsumer, aCount, true);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlPagedDataFiFo.Read(const aData: PData; const aCount: Integer): Integer;
var
consumer: IDataConsumer;
begin
consumer := TDataConsumer.Create(aData, aCount);
result := ReadIntern(consumer, aCount, true);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlPagedDataFiFo.Peek(const aConsumer: IDataConsumer; const aCount: Integer): Integer;
begin
result := ReadIntern(aConsumer, aCount, false);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlPagedDataFiFo.Peek(const aData: PData; const aCount: Integer): Integer;
var
consumer: IDataConsumer;
begin
consumer := TDataConsumer.Create(aData, aCount);
result := ReadIntern(consumer, aCount, false);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlPagedDataFiFo.Discard(const aCount: Integer): Integer;
begin
result := ReadIntern(nil, aCount, true);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlPagedDataFiFo.Clear;
begin
if Assigned(fReadPage) then
Dispose(fReadPage);
while (fPages.Count > 0) do begin
fReadPage := fPages.PopLast;
Dispose(fReadPage);
end;
fReadPage := nil;
fWritePage := nil;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TutlPagedDataFiFo.Create(const aPageSize: Integer);
begin
inherited Create;
fReadPage := nil;
fWritePage := nil;
fPageSize := aPageSize;
fPages := TPageList.Create(false);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
destructor TutlPagedDataFiFo.Destroy;
begin
Clear;
FreeAndNil(fPages);
inherited Destroy;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TutlSyncPagedDataFiFo/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlSyncPagedDataFiFo.WriteIntern(const aProvider: IDataProvider; aCount: Integer): Integer;
begin
fLock.Enter;
try
result := inherited WriteIntern(aProvider, aCount);
finally
fLock.Leave;
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlSyncPagedDataFiFo.ReadIntern(const aConsumer: IDataConsumer; aCount: Integer; const aMoveReadPos: Boolean): Integer;
begin
fLock.Enter;
try
result := inherited ReadIntern(aConsumer, aCount, aMoveReadPos);
finally
fLock.Leave;
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TutlSyncPagedDataFiFo.Create(const aPageSize: Integer);
begin
inherited Create(aPageSize);
fLock := TutlSpinLock.Create;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
destructor TutlSyncPagedDataFiFo.Destroy;
begin
inherited Destroy;
FreeAndNil(fLock);
end;


end.


Carregando…
Cancelar
Guardar