Changeset 84 for Generics/TemplateGenerics/Generic/GenericList.inc
- Timestamp:
- Oct 31, 2010, 3:14:23 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Generics/TemplateGenerics/Generic/GenericList.inc
r83 r84 1 1 {$IFDEF INTERFACE} 2 2 3 PGListItem = ^TListItem;4 3 TGList = class; 5 4 6 TGListSortCompare = function(const Item1, Item2: TListItem): Integer of object; 7 TGListStringConverter = function(Item: TListItem): string; 8 TGListOperation = procedure(List: TGList; Item: PGListItem); 5 TGListSortCompare = function(const Item1, Item2: TGListItem): Integer of object; 6 TGListStringConverter = function(Item: TGListItem): string; 9 7 //TGListNotification = (lnAdded, lnExtracted, lnDeleted); 10 8 11 // TGList<T ListIndex, TListItem> = class9 // TGList<TGListIndex, TGListItem> = class 12 10 TGList = class 13 11 private 14 FItems: array of T ListItem;15 FCount: T ListIndex;16 function Get(Index: T ListIndex): TListItem;17 function GetCapacity: T ListIndex;18 procedure SetCapacity(const AValue: T ListIndex);19 procedure Put(Index: T ListIndex; const AValue: TListItem); virtual;20 procedure SetCount(const AValue: T ListIndex);21 procedure QuickSort(L, R : T ListIndex; Compare: TGListSortCompare);12 FItems: array of TGListItem; 13 FCount: TGListIndex; 14 function Get(Index: TGListIndex): TGListItem; 15 function GetCapacity: TGListIndex; 16 procedure SetCapacity(const AValue: TGListIndex); 17 procedure Put(Index: TGListIndex; const AValue: TGListItem); virtual; 18 procedure SetCount(const AValue: TGListIndex); 19 procedure QuickSort(L, R : TGListIndex; Compare: TGListSortCompare); 22 20 public 23 21 // All items … … 28 26 procedure Sort(Compare: TGListSortCompare); 29 27 function Implode(Separator: string; Converter: TGListStringConverter): string; 30 procedure Perform(Operation: TGListOperation);31 28 // Many items 32 procedure MoveItems(CurIndex, NewIndex, Count: T ListIndex);33 procedure DeleteItems(Index, Count: T ListIndex);34 procedure Fill(Start, Count: T ListIndex; Value: TListItem);29 procedure MoveItems(CurIndex, NewIndex, Count: TGListIndex); 30 procedure DeleteItems(Index, Count: TGListIndex); 31 procedure Fill(Start, Count: TGListIndex; Value: TGListItem); 35 32 // One item 36 function Add(Item: T ListItem): TListIndex;37 procedure Delete(Index: T ListIndex); virtual;38 function Extract(Item: T ListItem): TListItem;39 procedure Exchange(Index1, Index2: T ListIndex);40 function First: T ListItem;41 function IndexOf(Item: T ListItem; Start: TListIndex = 0): TListIndex;42 procedure Insert(Index: T ListIndex; Item: TListItem);43 function Last: T ListItem;44 procedure Move(CurIndex, NewIndex: T ListIndex);45 function Remove(Item: T ListItem): TListIndex;46 property Items[Index: T ListIndex]: TListItem read Get write Put; default;33 function Add(Item: TGListItem): TGListIndex; 34 procedure Delete(Index: TGListIndex); virtual; 35 function Extract(Item: TGListItem): TGListItem; 36 procedure Exchange(Index1, Index2: TGListIndex); 37 function First: TGListItem; 38 function IndexOf(Item: TGListItem; Start: TGListIndex = 0): TGListIndex; 39 procedure Insert(Index: TGListIndex; Item: TGListItem); 40 function Last: TGListItem; 41 procedure Move(CurIndex, NewIndex: TGListIndex); 42 function Remove(Item: TGListItem): TGListIndex; 43 property Items[Index: TGListIndex]: TGListItem read Get write Put; default; 47 44 // List 48 45 procedure AddList(List: TGList); 49 46 procedure Assign(List: TGList); 50 47 function Equals(List: TGList): Boolean; 51 procedure InsertList(Index: T ListIndex; List: TGList);52 function IndexOfList(List: TGList; Start: T ListIndex = 0): TListIndex;48 procedure InsertList(Index: TGListIndex; List: TGList); 49 function IndexOfList(List: TGList; Start: TGListIndex = 0): TGListIndex; 53 50 // Other 54 property Count: T ListIndex read FCount write SetCount;55 property Capacity: T ListIndex read GetCapacity write SetCapacity;51 property Count: TGListIndex read FCount write SetCount; 52 property Capacity: TGListIndex read GetCapacity write SetCapacity; 56 53 // Array 57 procedure AddArray(Values: array of T ListItem);58 procedure SetArray(Values: array of T ListItem);59 procedure InsertArray(Index: T ListIndex; Values: array of TListItem);54 procedure AddArray(Values: array of TGListItem); 55 procedure SetArray(Values: array of TGListItem); 56 procedure InsertArray(Index: TGListIndex; Values: array of TGListItem); 60 57 end; 61 58 … … 63 60 {$ENDIF} 64 61 65 {$IFDEF IMPLEMENTATION }62 {$IFDEF IMPLEMENTATION_USES} 66 63 67 64 uses 68 65 RtlConsts; 69 66 67 {$UNDEF IMPLEMENTATION_USES} 68 {$ENDIF} 69 70 {$IFDEF IMPLEMENTATION} 71 70 72 { TGList } 71 73 72 function TGList.GetCapacity: T ListIndex;74 function TGList.GetCapacity: TGListIndex; 73 75 begin 74 76 Result := Length(FItems); 75 77 end; 76 78 77 procedure TGList.SetCapacity(const AValue: T ListIndex);79 procedure TGList.SetCapacity(const AValue: TGListIndex); 78 80 begin 79 81 SetLength(FItems, AValue); 80 82 end; 81 83 82 function TGList.Get(Index: T ListIndex): TListItem;84 function TGList.Get(Index: TGListIndex): TGListItem; 83 85 begin 84 86 Result := FItems[Index]; 85 87 end; 86 88 87 procedure TGList.Put(Index: T ListIndex; const AValue: TListItem);89 procedure TGList.Put(Index: TGListIndex; const AValue: TGListItem); 88 90 begin 89 91 FItems[Index] := AValue; 90 92 end; 91 93 92 procedure TGList.SetCount(const AValue: T ListIndex);94 procedure TGList.SetCount(const AValue: TGListIndex); 93 95 begin 94 96 SetLength(FItems, AValue); … … 96 98 end; 97 99 98 procedure TGList.QuickSort(L, R: T ListIndex; Compare: TGListSortCompare);99 var 100 I, J: T ListIndex;101 P, Q: T ListItem;100 procedure TGList.QuickSort(L, R: TGListIndex; Compare: TGListSortCompare); 101 var 102 I, J: TGListIndex; 103 P, Q: TGListItem; 102 104 begin 103 105 repeat … … 139 141 procedure TGList.Expand; 140 142 var 141 IncSize: T ListIndex;143 IncSize: TGListIndex; 142 144 begin 143 145 if FCount = Capacity then begin … … 158 160 end; 159 161 160 function TGList.Extract(Item: T ListItem): TListItem;161 var 162 I: T ListIndex;162 function TGList.Extract(Item: TGListItem): TGListItem; 163 var 164 I: TGListIndex; 163 165 begin 164 166 I := IndexOf(Item); … … 170 172 end; 171 173 172 function TGList.First: T ListItem;174 function TGList.First: TGListItem; 173 175 begin 174 176 if FCount = 0 then … … 178 180 end; 179 181 180 function TGList.IndexOf(Item: T ListItem; Start: TListIndex): TListIndex;182 function TGList.IndexOf(Item: TGListItem; Start: TGListIndex): TGListIndex; 181 183 begin 182 184 Result := Start; 183 185 while (Result < FCount) and 184 not CompareMem(Addr(FItems[Result]), Addr(Item), SizeOf(T ListItem)) do186 not CompareMem(Addr(FItems[Result]), Addr(Item), SizeOf(TGListItem)) do 185 187 Result := Result + 1; 186 188 if Result = FCount then Result := -1; 187 189 end; 188 190 189 procedure TGList.Insert(Index: T ListIndex; Item: TListItem);191 procedure TGList.Insert(Index: TGListIndex; Item: TGListItem); 190 192 begin 191 193 if (Index < 0) or (Index > FCount ) then … … 193 195 if FCount = Capacity then Expand; 194 196 if Index < FCount then 195 System.Move(FItems[Index], FItems[Index + 1], (FCount - Index) * SizeOf(T ListItem));197 System.Move(FItems[Index], FItems[Index + 1], (FCount - Index) * SizeOf(TGListItem)); 196 198 FItems[Index] := Item; 197 199 FCount := FCount + 1; 198 200 end; 199 201 200 procedure TGList.InsertList(Index: T ListIndex; List: TGList);201 var 202 I: T ListIndex;202 procedure TGList.InsertList(Index: TGListIndex; List: TGList); 203 var 204 I: TGListIndex; 203 205 begin 204 206 I := 0; … … 209 211 end; 210 212 211 function TGList.IndexOfList(List: TGList; Start: T ListIndex): TListIndex;212 var 213 I: T ListIndex;213 function TGList.IndexOfList(List: TGList; Start: TGListIndex): TGListIndex; 214 var 215 I: TGListIndex; 214 216 begin 215 217 if List.Count > 0 then begin … … 218 220 I := 1; 219 221 while I < List.Count do begin 220 if not CompareMem(Addr(FItems[Result + I]), Addr(List.FItems[I]), SizeOf(T ListItem)) then begin222 if not CompareMem(Addr(FItems[Result + I]), Addr(List.FItems[I]), SizeOf(TGListItem)) then begin 221 223 Result := -1; 222 224 Break; … … 228 230 end; 229 231 230 function TGList.Last: T ListItem;232 function TGList.Last: TGListItem; 231 233 begin 232 234 if FCount = 0 then … … 236 238 end; 237 239 238 procedure TGList.Move(CurIndex, NewIndex: T ListIndex);239 var 240 Temp: T ListItem;240 procedure TGList.Move(CurIndex, NewIndex: TGListIndex); 241 var 242 Temp: TGListItem; 241 243 begin 242 244 if ((CurIndex < 0) or (CurIndex > Count - 1)) then … … 246 248 Temp := FItems[CurIndex]; 247 249 if NewIndex > CurIndex then begin 248 System.Move(FItems[CurIndex + 1], FItems[CurIndex], (NewIndex - CurIndex) * SizeOf(T ListItem));250 System.Move(FItems[CurIndex + 1], FItems[CurIndex], (NewIndex - CurIndex) * SizeOf(TGListItem)); 249 251 end else 250 252 if NewIndex < CurIndex then begin 251 System.Move(FItems[NewIndex], FItems[NewIndex + 1], (CurIndex - NewIndex) * SizeOf(T ListItem));253 System.Move(FItems[NewIndex], FItems[NewIndex + 1], (CurIndex - NewIndex) * SizeOf(TGListItem)); 252 254 end; 253 255 FItems[NewIndex] := Temp; … … 256 258 end; 257 259 258 procedure TGList.MoveItems(CurIndex, NewIndex, Count: T ListIndex);260 procedure TGList.MoveItems(CurIndex, NewIndex, Count: TGListIndex); 259 261 var 260 262 S: Integer; … … 281 283 end; 282 284 283 function TGList.Remove(Item: T ListItem): TListIndex;285 function TGList.Remove(Item: TGListItem): TGListIndex; 284 286 begin 285 287 Result := IndexOf(Item); … … 290 292 function TGList.Equals(List: TGList): Boolean; 291 293 var 292 I: T ListIndex;294 I: TGListIndex; 293 295 begin 294 296 Result := Count = List.Count; … … 296 298 I := 0; 297 299 while I < Count do begin 298 if not CompareMem(Addr(FItems[I]), Addr(List.FItems[I]), SizeOf(T ListItem)) then begin300 if not CompareMem(Addr(FItems[I]), Addr(List.FItems[I]), SizeOf(TGListItem)) then begin 299 301 Result := False; 300 302 Break; … … 307 309 procedure TGList.Reverse; 308 310 var 309 I: T ListIndex;311 I: TGListIndex; 310 312 begin 311 313 I := 0; … … 322 324 end; 323 325 324 procedure TGList.AddArray(Values: array of T ListItem);325 var 326 I: T ListIndex;326 procedure TGList.AddArray(Values: array of TGListItem); 327 var 328 I: TGListIndex; 327 329 begin 328 330 I := 0; … … 333 335 end; 334 336 335 procedure TGList.SetArray(Values: array of T ListItem);336 var 337 I: T ListIndex;337 procedure TGList.SetArray(Values: array of TGListItem); 338 var 339 I: TGListIndex; 338 340 begin 339 341 Clear; … … 345 347 end; 346 348 347 procedure TGList.InsertArray(Index: T ListIndex; Values: array of TListItem);348 var 349 I: T ListIndex;349 procedure TGList.InsertArray(Index: TGListIndex; Values: array of TGListItem); 350 var 351 I: TGListIndex; 350 352 begin 351 353 I := 0; … … 358 360 function TGList.Implode(Separator: string; Converter: TGListStringConverter): string; 359 361 var 360 I: T ListIndex;362 I: TGListIndex; 361 363 begin 362 364 Result := ''; … … 370 372 end; 371 373 372 procedure TGList.Perform(Operation: TGListOperation); 373 var 374 I: TListIndex; 375 begin 376 I := 0; 377 while I < Count do begin 378 Operation(Self, @FItems[I]); 379 I := I + 1; 380 end; 381 end; 382 383 function TGList.Add(Item: TListItem): TListIndex; 374 function TGList.Add(Item: TGListItem): TGListIndex; 384 375 begin 385 376 if FCount = Capacity then … … 392 383 procedure TGList.AddList(List: TGList); 393 384 var 394 I: T ListIndex;385 I: TGListIndex; 395 386 begin 396 387 I := 0; … … 407 398 end; 408 399 409 procedure TGList.Delete(Index: T ListIndex);400 procedure TGList.Delete(Index: TGListIndex); 410 401 begin 411 402 if (Index < 0) or (Index >= FCount) then 412 403 raise EListError.CreateFmt(SListIndexError, [Index]); 413 404 FCount := FCount - 1; 414 System.Move(FItems[Index + 1], FItems[Index], (FCount - Index) * SizeOf(T ListItem));405 System.Move(FItems[Index + 1], FItems[Index], (FCount - Index) * SizeOf(TGListItem)); 415 406 Contract; 416 407 end; 417 408 418 procedure TGList.DeleteItems(Index, Count: T ListIndex);419 var 420 I: T ListIndex;409 procedure TGList.DeleteItems(Index, Count: TGListIndex); 410 var 411 I: TGListIndex; 421 412 begin 422 413 I := Index; … … 427 418 end; 428 419 429 procedure TGList.Fill(Start, Count: T ListIndex; Value: TListItem);420 procedure TGList.Fill(Start, Count: TGListIndex; Value: TGListItem); 430 421 begin 431 422 while Count > 0 do begin … … 436 427 end; 437 428 438 procedure TGList.Exchange(Index1, Index2: T ListIndex);439 var 440 Temp: T ListItem;429 procedure TGList.Exchange(Index1, Index2: TGListIndex); 430 var 431 Temp: TGListItem; 441 432 begin 442 433 if ((Index1 >= FCount) or (Index1 < 0)) then
Note:
See TracChangeset
for help on using the changeset viewer.