mirror of
https://gitlab.com/freepascal.org/fpc/pas2js.git
synced 2025-06-08 05:18:10 +02:00
* Needed for classes unit
This commit is contained in:
parent
1b44527498
commit
ee110fbed3
131
packages/rtl/simplelinkedlist.pas
Normal file
131
packages/rtl/simplelinkedlist.pas
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
unit simplelinkedlist;
|
||||||
|
|
||||||
|
{$mode objfpc}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
Type
|
||||||
|
TLinkedListItem = Class
|
||||||
|
Public
|
||||||
|
Next : TLinkedListItem;
|
||||||
|
end;
|
||||||
|
TLinkedListItemClass = Class of TLinkedListItem;
|
||||||
|
|
||||||
|
{ TLinkedListVisitor }
|
||||||
|
|
||||||
|
TLinkedListVisitor = Class
|
||||||
|
Function Visit(Item : TLinkedListItem) : Boolean; virtual; abstract;
|
||||||
|
end;
|
||||||
|
{ TLinkedList }
|
||||||
|
|
||||||
|
TLinkedList = Class
|
||||||
|
private
|
||||||
|
FItemClass: TLinkedListItemClass;
|
||||||
|
FRoot: TLinkedListItem;
|
||||||
|
function GetCount: Integer;
|
||||||
|
Public
|
||||||
|
Constructor Create(AnItemClass : TLinkedListItemClass); virtual;
|
||||||
|
Destructor Destroy; override;
|
||||||
|
Procedure Clear;
|
||||||
|
Function Add : TLinkedListItem;
|
||||||
|
Procedure ForEach(Visitor: TLinkedListVisitor);
|
||||||
|
Procedure RemoveItem(Item : TLinkedListItem; FreeItem : Boolean = False);
|
||||||
|
Property Root : TLinkedListItem Read FRoot;
|
||||||
|
Property ItemClass : TLinkedListItemClass Read FItemClass;
|
||||||
|
Property Count : Integer Read GetCount;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses sysutils;
|
||||||
|
|
||||||
|
{ TLinkedList }
|
||||||
|
|
||||||
|
function TLinkedList.GetCount: Integer;
|
||||||
|
|
||||||
|
Var
|
||||||
|
I : TLinkedListItem;
|
||||||
|
|
||||||
|
begin
|
||||||
|
I:=FRoot;
|
||||||
|
Result:=0;
|
||||||
|
While I<>Nil do
|
||||||
|
begin
|
||||||
|
I:=I.Next;
|
||||||
|
Inc(Result);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TLinkedList.Create(AnItemClass: TLinkedListItemClass);
|
||||||
|
begin
|
||||||
|
FItemClass:=AnItemClass;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TLinkedList.Destroy;
|
||||||
|
begin
|
||||||
|
Clear;
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TLinkedList.Clear;
|
||||||
|
|
||||||
|
Var
|
||||||
|
I : TLinkedListItem;
|
||||||
|
|
||||||
|
begin
|
||||||
|
// Can't use visitor, because it'd kill the next pointer...
|
||||||
|
I:=FRoot;
|
||||||
|
While I<>Nil do
|
||||||
|
begin
|
||||||
|
FRoot:=I;
|
||||||
|
I:=I.Next;
|
||||||
|
FRoot.Next:=Nil;
|
||||||
|
FreeAndNil(FRoot);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TLinkedList.Add: TLinkedListItem;
|
||||||
|
begin
|
||||||
|
Result:=FItemClass.Create;
|
||||||
|
Result.Next:=FRoot;
|
||||||
|
FRoot:=Result;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TLinkedList.ForEach(Visitor : TLinkedListVisitor);
|
||||||
|
|
||||||
|
Var
|
||||||
|
I : TLinkedListItem;
|
||||||
|
|
||||||
|
begin
|
||||||
|
I:=FRoot;
|
||||||
|
While (I<>Nil) and Visitor.Visit(I) do
|
||||||
|
I:=I.Next;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TLinkedList.RemoveItem(Item: TLinkedListItem; FreeItem : Boolean = False);
|
||||||
|
|
||||||
|
Var
|
||||||
|
I : TLinkedListItem;
|
||||||
|
|
||||||
|
begin
|
||||||
|
If (Item<>Nil) and (FRoot<>Nil) then
|
||||||
|
begin
|
||||||
|
If (Item=FRoot) then
|
||||||
|
FRoot:=Item.Next
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
I:=FRoot;
|
||||||
|
While (I.Next<>Nil) and (I.Next<>Item) do
|
||||||
|
I:=I.Next;
|
||||||
|
If (I.Next=Item) then
|
||||||
|
I.Next:=Item.Next;
|
||||||
|
end;
|
||||||
|
If FreeItem Then
|
||||||
|
Item.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user