Am 28.02.2012 15:31, schrieb Martin Schreiber:
Am 28.02.2012 16:13, schrieb Sven Barth:
Am 28.02.2012 15:40, schrieb Hans-Peter Diettrich:
Sven Barth schrieb:

Before Delphi 2009 you might have been right, but with that version
Embarcadero did a cut and we now need to adapt and live with that.

I dare to disagree. A "ByteString" only requires a dedicated encoding
(value), which makes it incompatible with other encodings, and thus
disables all conversions. Such an encoding doesn't break Delphi
compatibility, but allows to use all stringhandling functions with it.

And instead of introducing yet another type or another special encoding
we could just leverage the features FPC has today and use TBytes.

Or even better, use FPC 2.6 AnsiString and UnicodeString and drop the
encoding aware FPC 2.7 AnsiString. ;-)

BTW, please have a look into the different string concatenation
compilerproc, it is probably not so easy to model that with equal or
better performance with TBytes and operator overloading. Is it possible
with operator overloading to combine different types?

Did you look at the 2.7.1 or 2.6.0 implementation of these procs? If the 2.6.0 one then I suggest you to look at the 2.7.1 ones and reconsider your statement ;)

Nevertheless I'll try to do a speed measurement with TBytes and AnsiString both in 2.6 and 2.7.1. If we can improve the performance of FillChar (which would also benefit class creation btw) then this might be a rather performant alternative ;)

"
<TBytes>:= <TBytes> + 'stringconstant' + <TBytes> + <AnsiString>;
"

I quickly adjusted my test program:

=== source begin ===

program bytearraytest;

{$mode objfpc}

type
  TBytes = array of Byte;

operator + (aLeft, aRight: TBytes): TBytes;
begin
  SetLength(Result, Length(aLeft) + Length(aRight));
  if Length(aLeft) > 0 then
    Move(aLeft[0], Result[0], Length(aLeft) * SizeOf(Byte));
  if Length(aRight) > 0 then
    Move(aRight[0], Result[Length(aLeft)], Length(aRight) * SizeOf(Byte));
end;

operator + (aLeft: TBytes; aRight: AnsiString): TBytes;
begin
  SetLength(Result, Length(aLeft) + Length(aRight));
  if Length(aLeft) > 0 then
    Move(aLeft[0], Result[0], Length(aLeft) * SizeOf(Byte));
  if Length(aRight) > 0 then
    Move(aRight[1], Result[Length(aLeft)], Length(aRight) * SizeOf(Char));
end;

operator + (aLeft: AnsiString; aRight: TBytes): TBytes;
begin
  SetLength(Result, Length(aLeft) + Length(aRight));
  if Length(aLeft) > 0 then
    Move(aLeft[1], Result[0], Length(aLeft) * SizeOf(Char));
  if Length(aRight) > 0 then
    Move(aRight[0], Result[Length(aLeft)], Length(aRight) * SizeOf(Byte));
end;

var
  arr1, arr2, arr3: TBytes;
  b: Byte;
  i: LongInt;
  s: AnsiString;
begin
  SetLength(arr1, 5);
  for i := 0 to 4 do
    arr1[i] := i + 1;
  SetLength(arr2, 5);
  for i := 0 to 4 do
    arr2[i] := i + 6;
  arr3 := arr1 + arr2;
  for b in arr3 do
    Write(b, ' ');
  Writeln;
  arr3 := Copy(arr2, 2, 2);
  for b in arr3 do
    Write(b, ' ');
  Writeln;
  s := 'Hello World';
  arr3 := arr1 + 'stringconstant' + arr2 + s;
  for b in arr3 do
    Write(b, ' ');
  Writeln;
end.

=== source end ===

And here is what it prints:

=== source begin ===

PS P:\tests\oneshots> .\bytearraytest.exe
1 2 3 4 5 6 7 8 9 10
8 9
1 2 3 4 5 115 116 114 105 110 103 99 111 110 115 116 97 110 116 6 7 8 9 10 72 101 108 108 111 32 87 111 114 108 100

=== source end ===

Regards,
Sven

--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to