From 6958fe916c9ab68da74156c6c359602d9de1d2fc Mon Sep 17 00:00:00 2001 From: Bergmann89 Date: Sun, 26 Oct 2014 20:26:17 +0100 Subject: [PATCH] * implemented PagedDataFiFo --- .gitignore | 9 + Tests/UtilsTests.lpi | 6 + Tests/UtilsTests.lps | 170 +++++++++++-------- Tests/uGenericsTests.pas | 156 +++++++++++++++++ uutlGenerics.pas | 358 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 628 insertions(+), 71 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9b19d45 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*.dbg +*.exe +*.log +*.profraw +*.heaptrc +*lib/ +*/cache* +*.o +*.ppu \ No newline at end of file diff --git a/Tests/UtilsTests.lpi b/Tests/UtilsTests.lpi index 03fa37e..92f2f27 100644 --- a/Tests/UtilsTests.lpi +++ b/Tests/UtilsTests.lpi @@ -62,9 +62,15 @@ + + + + + + diff --git a/Tests/UtilsTests.lps b/Tests/UtilsTests.lps index 4dfc195..9d4ffd0 100644 --- a/Tests/UtilsTests.lps +++ b/Tests/UtilsTests.lps @@ -4,41 +4,39 @@ - + - - - - + + + - - - - + + + - + - - - - - + + + + + @@ -47,124 +45,154 @@ + + + + + + + + + + + + + + + + - + - - + + - - + + - - + + - - + + - + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + + + + + + + + + + + + + + + diff --git a/Tests/uGenericsTests.pas b/Tests/uGenericsTests.pas index 7ed05b8..2b76024 100644 --- a/Tests/uGenericsTests.pas +++ b/Tests/uGenericsTests.pas @@ -105,6 +105,23 @@ type procedure Delete; end; +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + TutlPagedDataFiFoTest = class(TTestCase) + private type + TTestFiFo = specialize TutlPagedDataFiFo; + 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. diff --git a/uutlGenerics.pas b/uutlGenerics.pas index 4d09245..74811b2 100644 --- a/uutlGenerics.pas +++ b/uutlGenerics.pas @@ -430,6 +430,89 @@ type property Size: integer read fDataLen; end; +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + generic TutlPagedDataFiFo = class + private type + TPage = packed record + Data: array of TData; + ReadPos: Integer; + WritePos: Integer; + end; + PData = ^TData; + PPage = ^TPage; + TPageList = specialize TutlList; + 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 = class(specialize TutlPagedDataFiFo) + 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.