sllist.inc 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. Type
  2. TLinkedListItem = Class
  3. Public
  4. Next : TLinkedListItem;
  5. end;
  6. TLinkedListItemClass = Class of TLinkedListItem;
  7. { TLinkedListVisitor }
  8. TLinkedListVisitor = Class
  9. Function Visit(Item : TLinkedListItem) : Boolean; virtual; abstract;
  10. end;
  11. { TLinkedList }
  12. TLinkedList = Class
  13. private
  14. FItemClass: TLinkedListItemClass;
  15. FRoot: TLinkedListItem;
  16. function GetCount: Integer;
  17. Public
  18. Constructor Create(AnItemClass : TLinkedListItemClass); virtual;
  19. Destructor Destroy; override;
  20. Procedure Clear;
  21. Function Add : TLinkedListItem;
  22. Procedure ForEach(Visitor: TLinkedListVisitor);
  23. Procedure RemoveItem(Item : TLinkedListItem; FreeItem : Boolean = False);
  24. Property Root : TLinkedListItem Read FRoot;
  25. Property ItemClass : TLinkedListItemClass Read FItemClass;
  26. Property Count : Integer Read GetCount;
  27. end;
  28. { TLinkedList }
  29. function TLinkedList.GetCount: Integer;
  30. Var
  31. I : TLinkedListItem;
  32. begin
  33. I:=FRoot;
  34. Result:=0;
  35. While I<>Nil do
  36. begin
  37. I:=I.Next;
  38. Inc(Result);
  39. end;
  40. end;
  41. constructor TLinkedList.Create(AnItemClass: TLinkedListItemClass);
  42. begin
  43. FItemClass:=AnItemClass;
  44. end;
  45. destructor TLinkedList.Destroy;
  46. begin
  47. Clear;
  48. inherited Destroy;
  49. end;
  50. procedure TLinkedList.Clear;
  51. Var
  52. I : TLinkedListItem;
  53. begin
  54. // Can't use visitor, because it'd kill the next pointer...
  55. I:=FRoot;
  56. While I<>Nil do
  57. begin
  58. FRoot:=I;
  59. I:=I.Next;
  60. FRoot.Next:=Nil;
  61. FreeAndNil(FRoot);
  62. end;
  63. end;
  64. function TLinkedList.Add: TLinkedListItem;
  65. begin
  66. Result:=FItemClass.Create;
  67. Result.Next:=FRoot;
  68. FRoot:=Result;
  69. end;
  70. procedure TLinkedList.ForEach(Visitor : TLinkedListVisitor);
  71. Var
  72. I : TLinkedListItem;
  73. begin
  74. I:=FRoot;
  75. While (I<>Nil) and Visitor.Visit(I) do
  76. I:=I.Next;
  77. end;
  78. procedure TLinkedList.RemoveItem(Item: TLinkedListItem; FreeItem : Boolean = False);
  79. Var
  80. I : TLinkedListItem;
  81. begin
  82. If (Item<>Nil) and (FRoot<>Nil) then
  83. begin
  84. If (Item=FRoot) then
  85. FRoot:=Item.Next
  86. else
  87. begin
  88. I:=FRoot;
  89. While (I.Next<>Nil) and (I.Next<>Item) do
  90. I:=I.Next;
  91. If (I.Next=Item) then
  92. I.Next:=Item.Next;
  93. end;
  94. If FreeItem Then
  95. Item.Free;
  96. end;
  97. end;