On Tue, 25 Jul 2017, Bo Berglund wrote:

I am working on moving away from using AnsiString as communications
buffer in an old application, so I need to write efficient
replacements for certain string functions (Delete, Insert, Copy etc).

Now I am wondering if there is a better way to do the Insert() command
than this:

procedure InsertBytes(var Dest: TBytes; Src: TBytes; Index: integer);
var
 Len, LenA: integer;
begin
 Len := Length(Dest);
 LenA := Length(Src);
 if LenA = 0 then exit; //Do nothing
 if Index > Len then Index := Len;  //Make an append instead
 SetLength(Dest, Len + LenA);
 Move(Dest[Index], Dest[Index + LenA], LenA);  //Create space
 Move(Src[0], Dest[Index], LenA);  //Insert data
end;

Ideally the function should be portable between FPC and Delphi XE5...

There is no better way if you only want to use TBytes. If you want less reallocations, you must reserve more memory for the array from the start (so length is a "capacity"), and keep a second count, the count of the number of bytes actually used.

Then you're maybe better off working with a TMemory stream, which does all this
for you. Or write a TBuffer class.

Michael.
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to