rsvk/Component/MTFBaseUnit.pas

95 lines
2.2 KiB
Plaintext

unit MTFBaseUnit;
{-------------------------------------------------------------------------------
Move To Front Base Class
------------------------
reSource v2.6
Copyright (C) 1998-2001 Victor Kasenda / gruv
http://go.to/gruv
email: vickas@singnet.com.sg
The MTF is derived from Peter Fenwick's implementation.
Desc:
We work with two arrays --
image contains an image of the MTF list, most recent in posn 0
map contains the position of the chars in image.
MTFDest has been removed.
This is done so that searching for the character is faster.
e.g. search for 'c', look up index 2 in map to get its position.
Then move it to the front by shifting all chars before it in the image
one step up. Update the map accordingly.
-------------------------------------------------------------------------------}
(**) interface (**)
uses StructsUnit;
const
NumSym = 256;
type
TMTFBase = class
protected
map: array[0..NumSym-1] of byte; // index of a character
image: array[0..NumSym-1] of byte; // chars in MTF order
procedure MoveToFront(const s:byte);
public
constructor Create;
procedure Init;
end;
(**) implementation (**)
(*******************************************************************************
TMTFBase
*******************************************************************************)
constructor TMTFBase.Create;
begin
inherited Create;
end;
procedure TMTFBase.Init;
var
i: byte;
begin
for i := 0 to NumSym-1 do
begin
image[i] := i;
map[i] := i;
end;
end;
{-------------------------------------------------------------------------------
MoveToFront
-----------
Move symbol s to the front
-------------------------------------------------------------------------------}
procedure TMTFBase.MoveToFront(const s:byte);
var
i: byte;
begin
if (map[s] <> 0) then
begin
{Move everything before s in image up one step.
update the maps accordingly}
for i := map[s] downto 1 do
begin
image[i] := image[i-1];
map[image[i]] := i;
end;
{s is moved to the front}
image[0] := s;
map[s] := 0;
end;
end;
end.