Changeset 457 for CoolStreaming/UVarBlockSerializer.pas
- Timestamp:
- Nov 28, 2012, 7:49:20 AM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
CoolStreaming/UVarBlockSerializer.pas
r405 r457 12 12 uses 13 13 Classes, DateUtils, UStreamHelper, Math, SysUtils, USubStream, 14 Contnrs,SpecializedList, LCLProc;14 SpecializedList, LCLProc; 15 15 16 16 const … … 40 40 procedure WriteVarList(List: TListByte); 41 41 procedure ReadVarList(List: TListByte); 42 procedure WriteVarBuffer(var Buffer; Count: Integer); 43 procedure ReadVarBuffer(var Buffer; Count: Integer); 42 44 function GetVarSize: Integer; 43 45 function GetVarCount: Integer; … … 51 53 procedure WriteVarString(Value: string); 52 54 function ReadVarString: string; 55 procedure WriteVarDouble(Value: Double); 56 function ReadVarDouble: Double; 53 57 54 58 // Misc methods … … 70 74 private 71 75 public 72 Items: T ObjectList; // TObjectList<TVarBlockSerializer>76 Items: TListObject; // TListObject<TVarBlockSerializer> 73 77 Enclose: Boolean; 74 78 procedure CheckItem(Index: Integer); … … 86 90 procedure WriteVarIndexedBlock(Index: Integer; Block: TVarBlockIndexed); 87 91 procedure ReadVarIndexedBlock(Index: Integer; Block: TVarBlockIndexed); 92 procedure WriteVarBuffer(Index: Integer; var Buffer; Count: Integer); 93 procedure ReadVarBuffer(Index: Integer; var Buffer; Count: Integer); 88 94 89 95 // Advanced data types … … 92 98 procedure WriteVarFloat(Index: Integer; Value: Double; Base: Integer = 2); 93 99 function ReadVarFloat(Index: Integer; Base: Integer = 2): Double; 100 procedure WriteVarDouble(Index: Integer; Value: Double); 101 function ReadVarDouble(Index: Integer): Double; 94 102 procedure WriteVarString(Index: Integer; Value: string); 95 103 function ReadVarString(Index: Integer): string; … … 324 332 Block.Free; 325 333 end; 334 end; 335 336 procedure TVarBlockSerializer.WriteVarDouble(Value: Double); 337 begin 338 WriteVarBuffer(Value, 8); 339 end; 340 341 function TVarBlockSerializer.ReadVarDouble: Double; 342 begin 343 Result := 0; 344 ReadVarBuffer(Result, 8); 326 345 end; 327 346 … … 428 447 WriteVarStream(Mem); 429 448 finally 430 Mem.Free 449 Mem.Free; 431 450 end; 432 451 end; … … 439 458 Mem := TMemoryStream.Create; 440 459 ReadVarStream(Mem); 460 Mem.Position := 0; 441 461 List.Count := Mem.Size; 442 462 List.ReplaceStream(Mem); 443 463 finally 444 Mem.Free 464 Mem.Free; 465 end; 466 end; 467 468 procedure TVarBlockSerializer.WriteVarBuffer(var Buffer; Count: Integer); 469 var 470 Mem: TMemoryStream; 471 begin 472 try 473 Mem := TMemoryStream.Create; 474 Mem.WriteBuffer(Buffer, Count); 475 WriteVarStream(Mem); 476 finally 477 Mem.Free; 478 end; 479 end; 480 481 procedure TVarBlockSerializer.ReadVarBuffer(var Buffer; Count: Integer); 482 var 483 Mem: TMemoryStream; 484 begin 485 try 486 Mem := TMemoryStream.Create; 487 ReadVarStream(Mem); 488 Mem.Position := 0; 489 Mem.ReadBuffer(Buffer, Count); 490 finally 491 Mem.Free; 445 492 end; 446 493 end; … … 542 589 I: Integer; 543 590 StreamHelper: TStreamHelper; 544 RequestedSize: Integer;545 591 begin 546 592 try … … 552 598 I := 0; 553 599 while (Stream.Position < Stream.Size) and (I < Index) do begin 554 if TestMask(Mask, I) then Stream.Position := Stream.Position + GetVarSize; 600 if TestMask(Mask, I) then 601 Stream.Position := Stream.Position + GetVarSize; 555 602 Inc(I); 556 603 end; … … 738 785 procedure TVarBlockIndexed.ReadVarList(Index: Integer; List: TListByte); 739 786 begin 787 TVarBlockSerializer(Items[Index]).Stream.Position := 0; 740 788 TVarBlockSerializer(Items[Index]).ReadVarList(List); 741 789 end; … … 771 819 end; 772 820 821 procedure TVarBlockIndexed.WriteVarBuffer(Index: Integer; var Buffer; 822 Count: Integer); 823 begin 824 CheckItem(Index); 825 TVarBlockSerializer(Items[Index]).WriteVarBuffer(Buffer, Count); 826 end; 827 828 procedure TVarBlockIndexed.ReadVarBuffer(Index: Integer; var Buffer; 829 Count: Integer); 830 begin 831 CheckItem(Index); 832 TVarBlockSerializer(Items[Index]).ReadVarBuffer(Buffer, Count); 833 end; 834 773 835 procedure TVarBlockIndexed.WriteVarSInt(Index: Integer; Value:Int64); 774 836 begin … … 793 855 TVarBlockSerializer(Items[Index]).Stream.Position := 0; 794 856 Result := TVarBlockSerializer(Items[Index]).ReadVarFloat(Base); 857 end; 858 859 procedure TVarBlockIndexed.WriteVarDouble(Index: Integer; Value: Double); 860 begin 861 CheckItem(Index); 862 TVarBlockSerializer(Items[Index]).WriteVarDouble(Value); 863 end; 864 865 function TVarBlockIndexed.ReadVarDouble(Index: Integer): Double; 866 begin 867 TVarBlockSerializer(Items[Index]).Stream.Position := 0; 868 Result := TVarBlockSerializer(Items[Index]).ReadVarDouble; 795 869 end; 796 870 … … 892 966 I: Integer; 893 967 StreamHelper: TStreamHelper; 894 begin 895 try 896 StreamHelper := TStreamHelper.Create(VarBlock.Stream); 897 VarBlock.Stream.Size := 0; 968 Temp: TVarBlockSerializer; 969 Output: TVarBlockSerializer; 970 begin 971 try 972 if Enclose then begin 973 Temp := TVarBlockSerializer.Create; 974 Output := Temp; 975 end else begin 976 Temp := nil; 977 Output := VarBlock; 978 end; 979 StreamHelper := TStreamHelper.Create(Output.Stream); 980 981 Output.Stream.Size := 0; 898 982 Mask := 0; 899 983 for I := 0 to Items.Count - 1 do 900 984 if Assigned(Items[I]) then Mask := Mask or (1 shl I); 901 VarBlock.WriteVarUInt(Mask);985 Output.WriteVarUInt(Mask); 902 986 for I := 0 to Items.Count - 1 do 903 if Assigned(Items[I]) then StreamHelper.WriteStream(TVarBlockSerializer(Items[I]).Stream, 987 if Assigned(Items[I]) then 988 StreamHelper.WriteStream(TVarBlockSerializer(Items[I]).Stream, 904 989 TVarBlockSerializer(Items[I]).Stream.Size); 905 if Enclose then VarBlock.BlockEnclose; 906 finally 990 991 if Enclose then VarBlock.WriteVarBlock(Temp); 992 finally 993 if Assigned(Temp) then Temp.Free; 907 994 StreamHelper.Free; 908 995 end; … … 913 1000 Mask: Integer; 914 1001 I: Integer; 915 begin 916 if Enclose then VarBlock.BlockUnclose; 917 VarBlock.Stream.Position := 0; 918 Mask := VarBlock.ReadVarUInt; 1002 Temp: TVarBlockSerializer; 1003 Input: TVarBlockSerializer; 1004 StreamHelper: TStreamHelper; 1005 begin 1006 try 1007 StreamHelper := TStreamHelper.Create; 1008 if Enclose then begin 1009 Temp := TVarBlockSerializer.Create; 1010 Temp.ReadVarBlock(VarBlock); 1011 Input := Temp; 1012 end else begin 1013 Temp := nil; 1014 Input := VarBlock; 1015 end; 1016 StreamHelper.Stream := Input.Stream; 1017 1018 Input.Stream.Position := 0; 1019 Mask := Input.ReadVarUInt; 919 1020 Items.Clear; 920 1021 I := 0; 921 while Mask <> 0 do begin 922 if VarBlock.TestMask(Mask, I) then begin 923 if Items.Count <= I then Items.Count := I + 1; 924 Items[I] := TVarBlockSerializer.Create; 925 VarBlock.ReadItemByMaskIndex(I, TVarBlockSerializer(Items[I])); 1022 while (Mask <> 0) and (Input.Stream.Position < Input.Stream.Size) do begin 1023 if Input.TestMask(Mask, I) then begin 1024 CheckItem(I); 1025 TVarBlockSerializer(Items[I]).Stream.Size := 0; 1026 StreamHelper.ReadStream(TVarBlockSerializer(Items[I]).Stream, Input.GetVarSize); 1027 //Input.ReadItemByMaskIndex(I, TVarBlockSerializer(Items[I])); 926 1028 Mask := Mask xor (1 shl I); // Clear bit on current index 927 1029 end; 928 1030 Inc(I); 1031 end; 1032 finally 1033 if Assigned(Temp) then Temp.Free; 1034 StreamHelper.Free; 929 1035 end; 930 1036 end; … … 988 1094 constructor TVarBlockIndexed.Create; 989 1095 begin 990 Items := T ObjectList.Create;1096 Items := TListObject.Create; 991 1097 Enclose := True; 992 1098 end; … … 994 1100 destructor TVarBlockIndexed.Destroy; 995 1101 begin 996 Items.Free;997 inherited Destroy;1102 FreeAndNil(Items); 1103 inherited; 998 1104 end; 999 1105
Note:
See TracChangeset
for help on using the changeset viewer.