mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 07:09:18 +02:00
+ Initial implementation. Untested
This commit is contained in:
parent
e2c5923e97
commit
2ab8b71ec8
@ -11,48 +11,479 @@
|
|||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
**********************************************************************}
|
**********************************************************************}
|
||||||
|
|
||||||
unit contnrs;
|
unit contnrs;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes;
|
Classes;
|
||||||
|
|
||||||
type
|
Type
|
||||||
TObjectList = class(TList)
|
|
||||||
private
|
|
||||||
ffreeobjects : boolean;
|
|
||||||
public
|
|
||||||
constructor create;
|
|
||||||
constructor create(freeobjects : boolean);
|
|
||||||
end;
|
|
||||||
|
|
||||||
TOrderedList = class
|
TObjectList = class(TList)
|
||||||
end;
|
private
|
||||||
|
ffreeobjects : boolean;
|
||||||
|
Protected
|
||||||
|
Procedure Notify(Ptr: Pointer; Action: TListNotification); override;
|
||||||
|
function GetItem(Index: Integer): TObject;
|
||||||
|
Procedure SetItem(Index: Integer; AObject: TObject);
|
||||||
|
public
|
||||||
|
constructor create;
|
||||||
|
constructor create(freeobjects : boolean);
|
||||||
|
function Add(AObject: TObject): Integer;
|
||||||
|
function Extract(Item: TObject): TObject;
|
||||||
|
function Remove(AObject: TObject): Integer;
|
||||||
|
function IndexOf(AObject: TObject): Integer;
|
||||||
|
function FindInstanceOf(AClass: TClass; AExact: Boolean; AStartAt: Integer): Integer;
|
||||||
|
Procedure Insert(Index: Integer; AObject: TObject);
|
||||||
|
function First: TObject;
|
||||||
|
Function Last: TObject;
|
||||||
|
property OwnsObjects: Boolean read FFreeObjects write FFreeObjects;
|
||||||
|
property Items[Index: Integer]: TObject read GetItem write SetItem; default;
|
||||||
|
end;
|
||||||
|
|
||||||
TQueue = class(TOrderedList)
|
TComponentList = class(TObjectList)
|
||||||
end;
|
Private
|
||||||
|
FNotifier : TComponent;
|
||||||
|
Protected
|
||||||
|
Procedure Notify(Ptr: Pointer; Action: TListNotification); override;
|
||||||
|
Function GetItems(Index: Integer): TComponent;
|
||||||
|
Procedure SetItems(Index: Integer; AComponent: TComponent);
|
||||||
|
Procedure HandleFreeNotify(Sender: TObject; AComponent: TComponent);
|
||||||
|
public
|
||||||
|
destructor Destroy; override;
|
||||||
|
Function Add(AComponent: TComponent): Integer;
|
||||||
|
Function Extract(Item: TComponent): TComponent;
|
||||||
|
Function Remove(AComponent: TComponent): Integer;
|
||||||
|
Function IndexOf(AComponent: TComponent): Integer;
|
||||||
|
Function First: TComponent;
|
||||||
|
Function Last: TComponent;
|
||||||
|
Procedure Insert(Index: Integer; AComponent: TComponent);
|
||||||
|
property Items[Index: Integer]: TComponent read GetItems write SetItems; default;
|
||||||
|
end;
|
||||||
|
|
||||||
implementation
|
TClassList = class(TList)
|
||||||
|
protected
|
||||||
|
Function GetItems(Index: Integer): TClass;
|
||||||
|
Procedure SetItems(Index: Integer; AClass: TClass);
|
||||||
|
public
|
||||||
|
Function Add(AClass: TClass): Integer;
|
||||||
|
Function Extract(Item: TClass): TClass;
|
||||||
|
Function Remove(AClass: TClass): Integer;
|
||||||
|
Function IndexOf(AClass: TClass): Integer;
|
||||||
|
Function First: TClass;
|
||||||
|
Function Last: TClass;
|
||||||
|
Procedure Insert(Index: Integer; AClass: TClass);
|
||||||
|
property Items[Index: Integer]: TClass read GetItems write SetItems; default;
|
||||||
|
end;
|
||||||
|
|
||||||
constructor tobjectlist.create(freeobjects : boolean);
|
TOrderedList = class(TObject)
|
||||||
|
private
|
||||||
|
FList: TList;
|
||||||
|
protected
|
||||||
|
Procedure PushItem(AItem: Pointer); virtual; abstract;
|
||||||
|
Function PopItem: Pointer; virtual;
|
||||||
|
Function PeekItem: Pointer; virtual;
|
||||||
|
property List: TList read FList;
|
||||||
|
public
|
||||||
|
constructor Create;
|
||||||
|
destructor Destroy; override;
|
||||||
|
Function Count: Integer;
|
||||||
|
Function AtLeast(ACount: Integer): Boolean;
|
||||||
|
Function Push(AItem: Pointer): Pointer;
|
||||||
|
Function Pop: Pointer;
|
||||||
|
Function Peek: Pointer;
|
||||||
|
end;
|
||||||
|
|
||||||
begin
|
{ TStack class }
|
||||||
inherited create;
|
|
||||||
ffreeobjects:=freeobjects;
|
TStack = class(TOrderedList)
|
||||||
|
protected
|
||||||
|
Procedure PushItem(AItem: Pointer); override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TObjectStack class }
|
||||||
|
|
||||||
|
TObjectStack = class(TStack)
|
||||||
|
public
|
||||||
|
Function Push(AObject: TObject): TObject;
|
||||||
|
Function Pop: TObject;
|
||||||
|
Function Peek: TObject;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TQueue class }
|
||||||
|
|
||||||
|
TQueue = class(TOrderedList)
|
||||||
|
protected
|
||||||
|
Procedure PushItem(AItem: Pointer); override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TObjectQueue class }
|
||||||
|
|
||||||
|
TObjectQueue = class(TQueue)
|
||||||
|
public
|
||||||
|
Function Push(AObject: TObject): TObject;
|
||||||
|
Function Pop: TObject;
|
||||||
|
Function Peek: TObject;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
constructor tobjectlist.create(freeobjects : boolean);
|
||||||
|
|
||||||
|
begin
|
||||||
|
inherited create;
|
||||||
|
ffreeobjects:=freeobjects;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Constructor tobjectlist.create;
|
||||||
|
|
||||||
|
begin
|
||||||
|
inherited create;
|
||||||
|
ffreeobjects:=True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TObjectList.Notify(Ptr: Pointer; Action: TListNotification);
|
||||||
|
|
||||||
|
begin
|
||||||
|
if FFreeObjects then
|
||||||
|
if (Action=lnDeleted) then
|
||||||
|
TObject(Ptr).Free;
|
||||||
|
inherited Notify(Ptr,Action);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TObjectList.GetItem(Index: Integer): TObject;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result:=TObject(Inherited Get(Index));
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TObjectList.SetItem(Index: Integer; AObject: TObject);
|
||||||
|
|
||||||
|
begin
|
||||||
|
Put(Index,Pointer(AObject));
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TObjectList.Add(AObject: TObject): Integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result:=Inherited Add(Pointer(AObject));
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TObjectList.Extract(Item: TObject): TObject;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result:=Tobject(Inherited Extract(Pointer(Item)));
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TObjectList.Remove(AObject: TObject): Integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result:=Inherited Remove(Pointer(AObject));
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TObjectList.IndexOf(AObject: TObject): Integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result:=Inherited indexOF(Pointer(AObject));
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TObjectList.FindInstanceOf(AClass: TClass; AExact: Boolean; AStartAt : Integer): Integer;
|
||||||
|
|
||||||
|
Var
|
||||||
|
I : Integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
I:=AStartAt;
|
||||||
|
Result:=-1;
|
||||||
|
If AExact then
|
||||||
|
While (I<Count) and (Result=-1) do
|
||||||
|
If Items[i].ClassType=AClass then
|
||||||
|
Result:=I
|
||||||
|
else
|
||||||
|
Inc(I)
|
||||||
|
else
|
||||||
|
While (I<Count) and (Result=-1) do
|
||||||
|
If Items[i].InheritsFrom(AClass) then
|
||||||
|
Result:=I
|
||||||
|
else
|
||||||
|
Inc(I);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TObjectList.Insert(Index: Integer; AObject: TObject);
|
||||||
|
|
||||||
|
begin
|
||||||
|
Inherited Insert(Index,Pointer(AObject));
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TObjectList.First: TObject;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result := TObject(Inherited First);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TObjectList.Last: TObject;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result := TObject(Inherited Last);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TListComponent }
|
||||||
|
|
||||||
|
Type
|
||||||
|
TlistComponent = Class(TComponent)
|
||||||
|
Private
|
||||||
|
Flist : TComponentList;
|
||||||
|
Public
|
||||||
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TlistComponent.Notification(AComponent: TComponent;
|
||||||
|
Operation: TOperation);
|
||||||
|
begin
|
||||||
|
If (Operation=opremove) then
|
||||||
|
Flist.HandleFreeNotify(Self,AComponent);
|
||||||
|
inherited;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TComponentList }
|
||||||
|
|
||||||
|
Function TComponentList.Add(AComponent: TComponent): Integer;
|
||||||
|
begin
|
||||||
|
Inherited Add(AComponent);
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TComponentList.Destroy;
|
||||||
|
begin
|
||||||
|
FNotifier.Free;
|
||||||
|
inherited;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TComponentList.Extract(Item: TComponent): TComponent;
|
||||||
|
begin
|
||||||
|
Result:=TComponent(Inherited Extract(Item));
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TComponentList.First: TComponent;
|
||||||
|
begin
|
||||||
|
Result:=TComponent(Inherited First);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TComponentList.GetItems(Index: Integer): TComponent;
|
||||||
|
begin
|
||||||
|
Result:=TComponent(Inherited Items[Index]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TComponentList.HandleFreeNotify(Sender: TObject;
|
||||||
|
AComponent: TComponent);
|
||||||
|
begin
|
||||||
|
Extract(Acomponent);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TComponentList.IndexOf(AComponent: TComponent): Integer;
|
||||||
|
begin
|
||||||
|
Result:=Inherited IndexOf(AComponent);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TComponentList.Insert(Index: Integer; AComponent: TComponent);
|
||||||
|
begin
|
||||||
|
Inherited Insert(Index,Acomponent)
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TComponentList.Last: TComponent;
|
||||||
|
begin
|
||||||
|
Result:=TComponent(Inherited Last);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TComponentList.Notify(Ptr: Pointer; Action: TListNotification);
|
||||||
|
begin
|
||||||
|
If FNotifier=NIl then
|
||||||
|
begin
|
||||||
|
FNotifier:=TlistComponent.Create(nil);
|
||||||
|
TlistComponent(FNotifier).FList:=Self;
|
||||||
|
end;
|
||||||
|
If Assigned(Ptr) then
|
||||||
|
With TComponent(Ptr) do
|
||||||
|
case Action of
|
||||||
|
lnAdded : FreeNotification(FNotifier);
|
||||||
|
lnExtracted, lnDeleted: RemoveFreeNotification(FNotifier);
|
||||||
end;
|
end;
|
||||||
|
inherited Notify(Ptr, Action);
|
||||||
constructor tobjectlist.create;
|
end;
|
||||||
|
|
||||||
|
Function TComponentList.Remove(AComponent: TComponent): Integer;
|
||||||
|
begin
|
||||||
|
Result:=Inherited Remove(AComponent);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TComponentList.SetItems(Index: Integer; AComponent: TComponent);
|
||||||
|
begin
|
||||||
|
Put(Index,AComponent);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TClassList }
|
||||||
|
|
||||||
|
Function TClassList.Add(AClass: TClass): Integer;
|
||||||
|
begin
|
||||||
|
Result:=Inherited Add(Pointer(AClass));
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TClassList.Extract(Item: TClass): TClass;
|
||||||
|
begin
|
||||||
|
Result:=TClass(Inherited Extract(Pointer(Item)));
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TClassList.First: TClass;
|
||||||
|
begin
|
||||||
|
Result:=TClass(Inherited First);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TClassList.GetItems(Index: Integer): TClass;
|
||||||
|
begin
|
||||||
|
Result:=TClass(Inherited Items[Index]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TClassList.IndexOf(AClass: TClass): Integer;
|
||||||
|
begin
|
||||||
|
Result:=Inherited IndexOf(Pointer(AClass));
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TClassList.Insert(Index: Integer; AClass: TClass);
|
||||||
|
begin
|
||||||
|
Inherited Insert(index,Pointer(AClass));
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TClassList.Last: TClass;
|
||||||
|
begin
|
||||||
|
Result:=TClass(Inherited Last);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TClassList.Remove(AClass: TClass): Integer;
|
||||||
|
begin
|
||||||
|
Result:=Inherited Remove(Pointer(AClass));
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TClassList.SetItems(Index: Integer; AClass: TClass);
|
||||||
|
begin
|
||||||
|
Put(Index,Pointer(Aclass));
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TOrderedList }
|
||||||
|
|
||||||
|
Function TOrderedList.AtLeast(ACount: Integer): Boolean;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TOrderedList.Count: Integer;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TOrderedList.Create;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TOrderedList.Destroy;
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TOrderedList.Peek: Pointer;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TOrderedList.PeekItem: Pointer;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TOrderedList.Pop: Pointer;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TOrderedList.PopItem: Pointer;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TOrderedList.Push(AItem: Pointer): Pointer;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TStack }
|
||||||
|
|
||||||
|
Procedure TStack.PushItem(AItem: Pointer);
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TObjectStack }
|
||||||
|
|
||||||
|
Function TObjectStack.Peek: TObject;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TObjectStack.Pop: TObject;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TObjectStack.Push(AObject: TObject): TObject;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TQueue }
|
||||||
|
|
||||||
|
Procedure TQueue.PushItem(AItem: Pointer);
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TObjectQueue }
|
||||||
|
|
||||||
|
Function TObjectQueue.Peek: TObject;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TObjectQueue.Pop: TObject;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TObjectQueue.Push(AObject: TObject): TObject;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
begin
|
|
||||||
inherited create;
|
|
||||||
ffreeobjects:=True;
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.2 2002-07-21 12:04:49 michael
|
Revision 1.3 2002-07-26 11:26:26 michael
|
||||||
|
+ Initial implementation. Untested
|
||||||
|
|
||||||
|
Revision 1.2 2002/07/21 12:04:49 michael
|
||||||
+ No optional parameters in 1.0.6
|
+ No optional parameters in 1.0.6
|
||||||
|
|
||||||
Revision 1.1 2002/07/16 13:34:39 florian
|
Revision 1.1 2002/07/16 13:34:39 florian
|
||||||
|
Loading…
Reference in New Issue
Block a user