По мотивам - ToDo. Написать как замена "ассемблера" на нормальное ООП привело к отказу от "алгоритма маляра"
Было:
Стало:
Или в "самом актуальном прочтении":
Было:
procedure Tm3StorageStream.Seek(AOffset : Int64;
AOrigin : TSeekOrigin;
var AResult : Int64;
var AReturn : HRESULT
);
procedure __Seek(const APosition: Int64;
var AResult: Int64
);
var
LCount: Int64;
LPosition1: Int64;
LPosition2: Int64;
LPosition3: Int64;
begin
with f_StreamHeader.TOCItemDataPtr^.RBody do
begin
if ((APosition >= 0) and (APosition <= RRealSize))
then
begin
if (APosition = FPosition)
then
else
begin
LPosition1:=FPosition-FTOCBuffBodyOffset;
if ((APosition >= LPosition1) and (APosition < (LPosition1+TOCBuffBodySize)))
then
begin
FTOCBuffBodyOffset:=APosition-LPosition1;
end
else
begin
with f_StreamHeader.FRootStreamManager do
begin
SaveTOCBuffData(RTOCBuffRootPosition, f_CurFilePos,
FTOCBuffData^, FTOCBuffDataCompare^,
FTOCBuffDataModifed, ReadOnly);
LPosition2:=Int64(-1);
LPosition3:=RTOCBuffRootPosition;
LCount:=APosition div FTOCBuffBodySize;
while (LCount <> 0) do
begin
LoadTOCBuffData(LPosition2,LPosition3,LPosition2,
FTOCBuffData^,FTOCBuffDataCompare^,
FTOCBuffDataModifed,False);
LPosition3:=FTOCBuffData^.RNextPosition;
Dec(LCount);
end;
LoadTOCBuffData(LPosition2,LPosition3, f_CurFilePos,
FTOCBuffData^,FTOCBuffDataCompare^,
FTOCBuffDataModifed,True);
FTOCBuffBodyOffset:=APosition mod FTOCBuffBodySize;
end;
end;
FPosition:=APosition;
end;
end
else
begin
Exit;
end;
end;
AResult:=APosition;
end;
begin
if SUCCEEDED(AReturn)
then
begin
case AOrigin of
soBeginning: begin
__Seek(AOffset,AResult);
end;
soCurrent: begin
__Seek(AOffset+FPosition,AResult);
end;
soEnd: begin
__Seek(AOffset + f_StreamHeader.TOCItemDataPtr^.RBody.RRealSize, aResult);
end;
else begin
OleError(E_UNEXPECTED);
end;
end;
end;
end;
Стало:
procedure Tm3NewStorageStreamPrim.Seek(anOffset: Int64;
anOrigin: TSeekOrigin;
var theResult: Int64;
var theReturn: hResult);
//#UC START# *4FA27D5302C5_5448F0A40180_var*
procedure __Seek(const aPosition: Int64;
var theResult: Int64);
var
l_Next : Tm3StorageBlock;
l_BlockIndex : Int64;
begin//__Seek
if ((APosition >= 0) and (APosition <= f_HeaderData.RRealSize)) then
begin
if (APosition <> f_Position) then
begin
l_BlockIndex := APosition div f_HeaderData.Stream.ClusterBodySize;
if (l_BlockIndex <> f_Block.Index) then
begin
if (l_BlockIndex = 0) then
begin
FreeAndNil(f_Block);
f_Block := Tm3StorageBlock.Create(f_HeaderData);
end//l_BlockIndex = 0
else
if (l_BlockIndex > f_Block.Index) then
begin
while (l_BlockIndex <> f_Block.Index) do
begin
l_Next := f_Block.CreateNext;
try
l_Next.SetRefTo(f_Block);
finally
FreeAndNil(l_Next);
end;//try..finally
end;//l_BlockIndex <> f_Block.Index
end//l_BlockIndex > f_Block.Index
else
if (l_BlockIndex < f_Block.Index) then
begin
while (l_BlockIndex <> f_Block.Index) do
begin
l_Next := f_Block.CreatePrev;
try
l_Next.SetRefTo(f_Block);
finally
FreeAndNil(l_Next);
end;//try..finally
end;//l_BlockIndex <> f_Block.Index
end;//l_BlockIndex > f_Block.Index
end;//l_BlockIndex <> f_Block.Index
Assert(l_BlockIndex = f_Block.Index);
f_Block.SetPositionInStream(aPosition);
f_Position := aPosition;
end;//APosition <> FPosition
end//((APosition >= 0) and (APosition <= RRealSize))
else
Assert(false, 'Смещаемся за границу потока');
theResult := f_Position;
end;//__Seek
//#UC END# *4FA27D5302C5_5448F0A40180_var*
begin
//#UC START# *4FA27D5302C5_5448F0A40180_impl*
if SUCCEEDED(theReturn) then
begin
case anOrigin of
soBeginning:
__Seek(anOffset, theResult);
soCurrent:
__Seek(anOffset + f_Position, theResult);
soEnd:
__Seek(anOffset + f_HeaderData.RRealSize, theResult);
else
begin
Assert(false, 'Неверный anOrigin');
OleError(E_UNEXPECTED);
end;//else
end;//case anOrigin
end;//SUCCEEDED(theReturn)
//#UC END# *4FA27D5302C5_5448F0A40180_impl*
end;//Tm3NewStorageStreamPrim.Seek
Или в "самом актуальном прочтении":
procedure Tm3NewStorageStreamPrim.Seek(anOffset: Int64;
anOrigin: TSeekOrigin;
var theResult: Int64;
var theReturn: hResult);
//#UC START# *4FA27D5302C5_5448F0A40180_var*
procedure __Seek(const aPosition: Int64;
var theResult: Int64);
var
l_Next : Tm3StorageBlock;
l_BlockIndex : Int64;
begin//__Seek
if ((APosition >= 0) and (APosition <= f_HeaderData.RRealSize)) then
begin
if (APosition <> f_Position) then
begin
Assert(f_Block <> nil);
f_Block.MoveTo(aPosition, f_Block);
end;//APosition <> FPosition
end//((APosition >= 0) and (APosition <= RRealSize))
else
Assert(false, 'Смещаемся за границу потока');
theResult := f_Position;
end;//__Seek
//#UC END# *4FA27D5302C5_5448F0A40180_var*
begin
//#UC START# *4FA27D5302C5_5448F0A40180_impl*
if SUCCEEDED(theReturn) then
begin
case anOrigin of
soBeginning:
__Seek(anOffset, theResult);
soCurrent:
__Seek(anOffset + f_Position, theResult);
soEnd:
__Seek(anOffset + f_HeaderData.RRealSize, theResult);
else
begin
Assert(false, 'Неверный anOrigin');
// - это "предусловие", оно НЕ ДОЛЖНО нарушаться
OleError(E_UNEXPECTED);
end;//else
end;//case anOrigin
end;//SUCCEEDED(theReturn)
//#UC END# *4FA27D5302C5_5448F0A40180_impl*
end;//Tm3NewStorageStreamPrim.Seek
Комментариев нет:
Отправить комментарий