Statistics
| Branch: | Tag: | Revision:

root / ULinkedList.pas

History | View | Annotate | Download (3.9 kB)

1 162:ac18d757e2cd aksdb
(*
2 162:ac18d757e2cd aksdb
 * CDDL HEADER START
3 162:ac18d757e2cd aksdb
 *
4 162:ac18d757e2cd aksdb
 * The contents of this file are subject to the terms of the
5 162:ac18d757e2cd aksdb
 * Common Development and Distribution License, Version 1.0 only
6 162:ac18d757e2cd aksdb
 * (the "License").  You may not use this file except in compliance
7 162:ac18d757e2cd aksdb
 * with the License.
8 162:ac18d757e2cd aksdb
 *
9 162:ac18d757e2cd aksdb
 * You can obtain a copy of the license at
10 162:ac18d757e2cd aksdb
 * http://www.opensource.org/licenses/cddl1.php.
11 162:ac18d757e2cd aksdb
 * See the License for the specific language governing permissions
12 162:ac18d757e2cd aksdb
 * and limitations under the License.
13 162:ac18d757e2cd aksdb
 *
14 162:ac18d757e2cd aksdb
 * When distributing Covered Code, include this CDDL HEADER in each
15 162:ac18d757e2cd aksdb
 * file and include the License file at
16 162:ac18d757e2cd aksdb
 * http://www.opensource.org/licenses/cddl1.php.  If applicable,
17 162:ac18d757e2cd aksdb
 * add the following below this CDDL HEADER, with the fields enclosed
18 162:ac18d757e2cd aksdb
 * by brackets "[]" replaced with your own identifying * information:
19 162:ac18d757e2cd aksdb
 *      Portions Copyright [yyyy] [name of copyright owner]
20 162:ac18d757e2cd aksdb
 *
21 162:ac18d757e2cd aksdb
 * CDDL HEADER END
22 162:ac18d757e2cd aksdb
 *
23 162:ac18d757e2cd aksdb
 *
24 162:ac18d757e2cd aksdb
 *      Portions Copyright 2007 Andreas Schneider
25 162:ac18d757e2cd aksdb
 *)
26 162:ac18d757e2cd aksdb
unit ULinkedList;
27 162:ac18d757e2cd aksdb
28 162:ac18d757e2cd aksdb
interface
29 162:ac18d757e2cd aksdb
30 162:ac18d757e2cd aksdb
uses
31 162:ac18d757e2cd aksdb
  SysUtils;
32 162:ac18d757e2cd aksdb
33 162:ac18d757e2cd aksdb
type
34 162:ac18d757e2cd aksdb
  PLinkedItem = ^TLinkedItem;
35 162:ac18d757e2cd aksdb
  TLinkedItem = record
36 162:ac18d757e2cd aksdb
    ID: Integer;
37 162:ac18d757e2cd aksdb
    Data: Pointer;
38 162:ac18d757e2cd aksdb
    Next: PLinkedItem;
39 162:ac18d757e2cd aksdb
  end;
40 162:ac18d757e2cd aksdb
  TLinkedList = class(TObject)
41 162:ac18d757e2cd aksdb
    constructor Create; virtual;
42 162:ac18d757e2cd aksdb
    destructor Destroy; override;
43 162:ac18d757e2cd aksdb
  protected
44 162:ac18d757e2cd aksdb
    FFirst: PLinkedItem;
45 162:ac18d757e2cd aksdb
    FLast: PLinkedItem;
46 162:ac18d757e2cd aksdb
  public
47 162:ac18d757e2cd aksdb
    procedure Clear; virtual;
48 162:ac18d757e2cd aksdb
    function Iterate(var ALinkedItem: PLinkedItem): Boolean; virtual;
49 162:ac18d757e2cd aksdb
    function Add(AID: Integer; AData: Pointer): PLinkedItem; virtual;
50 162:ac18d757e2cd aksdb
    procedure Delete(AData: Pointer); overload; virtual;
51 162:ac18d757e2cd aksdb
    procedure Delete(AID: Integer); overload; virtual;
52 162:ac18d757e2cd aksdb
    function Get(AID: Integer): Pointer; virtual;
53 162:ac18d757e2cd aksdb
    property Last: PLinkedItem read FLast;
54 162:ac18d757e2cd aksdb
  end;
55 162:ac18d757e2cd aksdb
56 162:ac18d757e2cd aksdb
implementation
57 162:ac18d757e2cd aksdb
58 162:ac18d757e2cd aksdb
{ TBlockList }
59 162:ac18d757e2cd aksdb
60 162:ac18d757e2cd aksdb
function TLinkedList.Add(AID: Integer; AData: Pointer): PLinkedItem;
61 162:ac18d757e2cd aksdb
var
62 162:ac18d757e2cd aksdb
  current: PLinkedItem;
63 162:ac18d757e2cd aksdb
begin
64 162:ac18d757e2cd aksdb
  New(current);
65 162:ac18d757e2cd aksdb
  current^.ID := AID;
66 162:ac18d757e2cd aksdb
  current^.Data := AData;
67 162:ac18d757e2cd aksdb
  current^.Next := nil;
68 162:ac18d757e2cd aksdb
  if FFirst = nil then FFirst := current;
69 162:ac18d757e2cd aksdb
  if FLast <> nil then FLast^.Next := current;
70 162:ac18d757e2cd aksdb
  FLast := current;
71 162:ac18d757e2cd aksdb
  Result := current;
72 162:ac18d757e2cd aksdb
end;
73 162:ac18d757e2cd aksdb
74 162:ac18d757e2cd aksdb
procedure TLinkedList.Clear;
75 162:ac18d757e2cd aksdb
var
76 162:ac18d757e2cd aksdb
  current, next: PLinkedItem;
77 162:ac18d757e2cd aksdb
begin
78 162:ac18d757e2cd aksdb
  current := FFirst;
79 162:ac18d757e2cd aksdb
  while current <> nil do
80 162:ac18d757e2cd aksdb
  begin
81 162:ac18d757e2cd aksdb
    next := current^.Next;
82 162:ac18d757e2cd aksdb
    Dispose(current);
83 162:ac18d757e2cd aksdb
    current := next;
84 162:ac18d757e2cd aksdb
  end;
85 162:ac18d757e2cd aksdb
  FFirst := nil;
86 162:ac18d757e2cd aksdb
  FLast := nil;
87 162:ac18d757e2cd aksdb
end;
88 162:ac18d757e2cd aksdb
89 162:ac18d757e2cd aksdb
constructor TLinkedList.Create;
90 162:ac18d757e2cd aksdb
begin
91 162:ac18d757e2cd aksdb
  inherited Create;
92 162:ac18d757e2cd aksdb
  FFirst := nil;
93 162:ac18d757e2cd aksdb
  FLast := nil;
94 162:ac18d757e2cd aksdb
end;
95 162:ac18d757e2cd aksdb
96 162:ac18d757e2cd aksdb
procedure TLinkedList.Delete(AData: Pointer);
97 162:ac18d757e2cd aksdb
var
98 162:ac18d757e2cd aksdb
  currentItem, lastItem, nextItem: PLinkedItem;
99 162:ac18d757e2cd aksdb
begin
100 162:ac18d757e2cd aksdb
  lastItem := nil;
101 162:ac18d757e2cd aksdb
  currentItem := FFirst;
102 162:ac18d757e2cd aksdb
  while currentItem <> nil do
103 162:ac18d757e2cd aksdb
  begin
104 162:ac18d757e2cd aksdb
    if currentItem^.Data = AData then
105 162:ac18d757e2cd aksdb
    begin
106 162:ac18d757e2cd aksdb
      if FFirst = currentItem then FFirst := currentItem^.Next;
107 162:ac18d757e2cd aksdb
      if FLast = currentItem then FLast := lastItem;
108 162:ac18d757e2cd aksdb
      if lastItem <> nil then lastItem^.Next := currentItem^.Next;
109 162:ac18d757e2cd aksdb
      Dispose(currentItem);
110 162:ac18d757e2cd aksdb
      nextItem := nil;
111 162:ac18d757e2cd aksdb
    end else
112 162:ac18d757e2cd aksdb
      nextItem := currentItem^.Next;
113 162:ac18d757e2cd aksdb
    lastItem := currentItem;
114 162:ac18d757e2cd aksdb
    currentItem := nextItem;
115 162:ac18d757e2cd aksdb
  end;
116 162:ac18d757e2cd aksdb
end;
117 162:ac18d757e2cd aksdb
118 162:ac18d757e2cd aksdb
procedure TLinkedList.Delete(AID: Integer);
119 162:ac18d757e2cd aksdb
var
120 162:ac18d757e2cd aksdb
  currentItem, lastItem, nextItem: PLinkedItem;
121 162:ac18d757e2cd aksdb
begin
122 162:ac18d757e2cd aksdb
  lastItem := nil;
123 162:ac18d757e2cd aksdb
  currentItem := FFirst;
124 162:ac18d757e2cd aksdb
  while currentItem <> nil do
125 162:ac18d757e2cd aksdb
  begin
126 162:ac18d757e2cd aksdb
    if currentItem^.ID = AID then
127 162:ac18d757e2cd aksdb
    begin
128 162:ac18d757e2cd aksdb
      if FFirst = currentItem then FFirst := currentItem^.Next;
129 162:ac18d757e2cd aksdb
      if FLast = currentItem then FLast := lastItem;
130 162:ac18d757e2cd aksdb
      if lastItem <> nil then lastItem^.Next := currentItem^.Next;
131 162:ac18d757e2cd aksdb
      Dispose(currentItem);
132 162:ac18d757e2cd aksdb
      nextItem := nil;
133 162:ac18d757e2cd aksdb
    end else
134 162:ac18d757e2cd aksdb
      nextItem := currentItem^.Next;
135 162:ac18d757e2cd aksdb
    lastItem := currentItem;
136 162:ac18d757e2cd aksdb
    currentItem := nextItem;
137 162:ac18d757e2cd aksdb
  end;
138 162:ac18d757e2cd aksdb
end;
139 162:ac18d757e2cd aksdb
140 162:ac18d757e2cd aksdb
destructor TLinkedList.Destroy;
141 162:ac18d757e2cd aksdb
begin
142 162:ac18d757e2cd aksdb
  Clear;
143 162:ac18d757e2cd aksdb
  inherited Destroy;
144 162:ac18d757e2cd aksdb
end;
145 162:ac18d757e2cd aksdb
146 162:ac18d757e2cd aksdb
function TLinkedList.Get(AID: Integer): Pointer;
147 162:ac18d757e2cd aksdb
var
148 162:ac18d757e2cd aksdb
  item: PLinkedItem;
149 162:ac18d757e2cd aksdb
begin
150 162:ac18d757e2cd aksdb
  Result := nil;
151 162:ac18d757e2cd aksdb
  item := nil;
152 162:ac18d757e2cd aksdb
  while Iterate(item) and (Result = nil) do
153 162:ac18d757e2cd aksdb
    if item^.ID = AID then
154 162:ac18d757e2cd aksdb
      Result := item^.Data;
155 162:ac18d757e2cd aksdb
end;
156 162:ac18d757e2cd aksdb
157 162:ac18d757e2cd aksdb
function TLinkedList.Iterate(var ALinkedItem: PLinkedItem): Boolean;
158 162:ac18d757e2cd aksdb
begin
159 162:ac18d757e2cd aksdb
  if ALinkedItem = nil then
160 162:ac18d757e2cd aksdb
    ALinkedItem := FFirst
161 162:ac18d757e2cd aksdb
  else
162 162:ac18d757e2cd aksdb
    ALinkedItem := ALinkedItem^.Next;
163 162:ac18d757e2cd aksdb
  Result := ALinkedItem <> nil;
164 162:ac18d757e2cd aksdb
end;
165 162:ac18d757e2cd aksdb
166 162:ac18d757e2cd aksdb
end.