TAChart: Add THistory and TChartExtentHistory utility classes

git-svn-id: trunk@38653 -
This commit is contained in:
ask 2012-09-14 12:02:55 +00:00
parent 15016fc37f
commit fcf539ce79
2 changed files with 64 additions and 0 deletions

View File

@ -233,6 +233,25 @@ type
property IsSet[AIndex: Integer]: Boolean read GetIsSet write SetIsSet;
end;
// A limited capacity stack desighed to store 'undo'-like history.
generic THistory<TElem> = class
strict private
FCount: Cardinal;
FData: array of TElem;
function GetCapacity: Cardinal; inline;
function GetItem(AIndex: Integer): TElem;
procedure SetCapacity(AValue: Cardinal);
procedure DeleteOld(ACount: Integer);
public
procedure Add(const AItem: TElem);
function Pop: TElem; inline;
property Capacity: Cardinal read GetCapacity write SetCapacity;
property Count: Cardinal read FCount;
property Item[AIndex: Integer]: TElem read GetItem; default;
end;
const
PUB_INT_SET_ALL = '';
PUB_INT_SET_EMPTY = '-';
@ -493,6 +512,49 @@ begin
Result := (A.Code = B.Code) and (A.Data = B.Data);
end;
{ THistory }
procedure THistory.Add(const AItem: TElem);
begin
if Capacity = 0 then exit;
if FCount = Capacity then
DeleteOld(1);
FData[FCount] := AItem;
FCount += 1;
end;
procedure THistory.DeleteOld(ACount: Integer);
begin
FCount -= ACount;
Move(FData[ACount], FData[0], SizeOf(FData[0]) * FCount);
end;
function THistory.GetCapacity: Cardinal;
begin
Result := Length(FData);
end;
function THistory.GetItem(AIndex: Integer): TElem;
begin
if AIndex < 0 then
AIndex += Integer(FCount);
Result := FData[AIndex];
end;
function THistory.Pop: TElem;
begin
Result := GetItem(-1);
FCount -= 1;
end;
procedure THistory.SetCapacity(AValue: Cardinal);
begin
if Capacity = AValue then exit;
if AValue < FCount then
DeleteOld(FCount - AValue);
SetLength(FData, AValue);
end;
{ TTypedFPListEnumerator }
function TTypedFPListEnumerator.GetCurrent: T;

View File

@ -172,6 +172,8 @@ type
property YMin: Double index 2 read GetBounds write SetBounds stored IsBoundsStored;
end;
TChartExtentHistory = specialize THistory<TDoubleRect>;
TRectArray = array [1..4] of Integer;
{ TChartMargins }