Снова о ковырянии служебных записей дин.массивов и строк
Добавлено: 20.12.2015 09:06:49
Очень извиняюсь, уже об этом спрашивал, но руки так и не дошли, и ответ потерялся.
Суть: моей системе сериализации приходится иметь процедуры типа "Создать динамический массив, размер элемента такой-то", где ей даётся указатель на поле класса, а тип может быть любой. Полез вспоминать, как это сделано в коде - и...
Суть: моей системе сериализации приходится иметь процедуры типа "Создать динамический массив, размер элемента такой-то", где ей даётся указатель на поле класса, а тип может быть любой. Полез вспоминать, как это сделано в коде - и...
- Код: Выделить всё
Procedure NewDynArray(parray: pointer; Len, BaseTypeInd: integer);
begin
pointer(parray^):= nil;
SetLength(TArrayOfByte(parray^), Len * Types[BaseTypeInd].Size);
if Len > 0 then //high value in FreePascal, length in Delphi
{$ifdef fpc}
dword((pointer(parray^) - 4)^):= Len - 1;
{$else}
dword(pointer(cardinal(parray^) - 4)^):= Len;
{$endif}
end;
function GetDynArrayLength(parray: pointer): integer;
begin
Result:= longint(pointer(pointer(parray^) - 4)^) {$ifdef fpc} + 1{$endif}
//the value at -4 contains Length() in Delphi
//and High() (i.e. Length() -1 ) in FreePascal
end;
procedure IncRawByteStringRefCount(ps: pointer);
begin
if Assigned(ps) then inc(longint(pointer(ptruint(ps) - 8)^));
end;
procedure IncUnicodeStringRefCount(ps: pointer);
begin
if Assigned(ps) then inc(longint(pointer(ptruint(ps) - 8)^));
end;
procedure IncWideStringRefCount(ps: pointer);
begin
if Assigned(ps) then inc(longint(pointer(ptruint(ps) - 8)^));
end;