Преглед изворни кода

Extend TBytesBuffer object with Stream operations

- Also add Test unit
PascalCoin пре 4 година
родитељ
комит
a5163512d0
3 измењених фајлова са 90 додато и 2 уклоњено
  1. 29 1
      src/core/UBaseTypes.pas
  2. 1 1
      src/tests/PascalCoinUnitTests.lpr
  3. 60 0
      src/tests/ubasetypes.tests.pas

+ 29 - 1
src/core/UBaseTypes.pas

@@ -98,13 +98,16 @@ Type
     function Replace(startPos : Integer; const buffer : TBytes) : Integer; overload;
     function Replace(startPos : Integer; const buffer; bufferSize : Integer) : Integer; overload;
     property DefaultIncrement : Integer read FDefaultIncrement write SetDefaultIncrement;
-    function Compare(ABytesBuffer : TBytesBuffer) : Integer;
+    function Compare(ABytesBuffer : TBytesBuffer) : Integer; overload;
+    function Compare(AStream : TStream) : Integer; overload;
     procedure SetLength(ANewLength : Integer);
     function Memory : Pointer;
     function MemoryLength : Integer;
     procedure Clear;
     procedure CopyFrom(ABytesBuffer : TBytesBuffer);
     function Capture(AStartPos, ALength : Integer) : TBytes;
+    procedure SaveToStream(AStream : TStream);
+    procedure LoadFromStream(AStream : TStream);
   end;
 
 
@@ -624,6 +627,11 @@ begin
   end;
 end;
 
+procedure TBytesBuffer.SaveToStream(AStream: TStream);
+begin
+  AStream.Write(FBytes[0],Self.Length);
+end;
+
 procedure TBytesBuffer.SetDefaultIncrement(AValue: Integer);
 begin
   if AValue<=0 then FDefaultIncrement:=1024
@@ -690,6 +698,18 @@ begin
   end;
 end;
 
+function TBytesBuffer.Compare(AStream: TStream): Integer;
+var Lbb : TBytesBuffer;
+begin
+  Lbb := TBytesBuffer.Create(DefaultIncrement);
+  try
+    Lbb.LoadFromStream(AStream);
+    Result := Compare(Lbb);
+  finally
+    Lbb.Free;
+  end;
+end;
+
 procedure TBytesBuffer.CopyFrom(ABytesBuffer: TBytesBuffer);
 begin
   System.SetLength(FBytes,System.Length(ABytesBuffer.FBytes));
@@ -725,6 +745,14 @@ begin
   Result := FUsedBytes;
 end;
 
+procedure TBytesBuffer.LoadFromStream(AStream: TStream);
+begin
+  AStream.Position := 0;
+  IncreaseSize(Self.Length + AStream.Size);
+  AStream.Read(FBytes[FUsedBytes],AStream.Size);
+  SetLength(Self.Length + AStream.Size);
+end;
+
 function TBytesBuffer.Memory: Pointer;
 begin
   Result := addr(FBytes[0]);

+ 1 - 1
src/tests/PascalCoinUnitTests.lpr

@@ -5,7 +5,7 @@ program UPascalCoinUnitTests;
 uses
   Interfaces, Forms, GuiTestRunner, UCommon.Collections, UCommon.Tests,
   UCommon.Collections.Tests, UMemory.Tests, UThread.Tests, URandomHash.Tests,
-  URandomHash2.Tests, URandomHash;
+  URandomHash2.Tests, URandomHash, ubasetypes.tests;
 
 {$R *.res}
 

+ 60 - 0
src/tests/ubasetypes.tests.pas

@@ -0,0 +1,60 @@
+unit UBaseTypes.Tests;
+
+{$mode delphi}
+{$H+}
+{$modeswitch nestedprocvars}
+
+interface
+
+uses
+  Classes, SysUtils, fpcunit,
+  testregistry,
+  UBaseTypes;
+
+type
+
+  { TBytesBufferTest }
+
+  TBytesBufferTest = class(TTestCase)
+    published
+      procedure Test_SaveToStream;
+  end;
+
+implementation
+
+{ TBytesBufferTest }
+
+procedure TBytesBufferTest.Test_SaveToStream;
+var Lbb, Lbb2 : TBytesBuffer;
+  LStream : TStream;
+  LBuffer : TBytes;
+  i : Integer;
+begin
+  SetLength(LBuffer,1000 + Random(1000) );
+  for i:= 0 to High(LBuffer) do begin
+    LBuffer[i] := Random(250)+1;
+  end;
+  Lbb := TBytesBuffer.Create(Random(1000)+100);
+  Lbb.Add(LBuffer);
+  Lbb2 := TBytesBuffer.CreateCopy(Lbb);
+  LStream := TMemoryStream.Create;
+  try
+    Lbb.SaveToStream(LStream);
+    Self.AssertEquals('T1',0,Lbb.Compare(Lbb2));
+    Self.AssertEquals('T2',0,Lbb.Compare(LStream));
+    Lbb2.Clear;
+    Lbb2.LoadFromStream(LStream);
+    Self.AssertEquals('T3',0,Lbb.Compare(Lbb2));
+  finally
+    Lbb.Free;
+    Lbb2.Free;
+  end;
+end;
+
+
+initialization
+  Randomize;
+  RegisterTest(TBytesBufferTest);
+end.
+
+