tgeneric8.pp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. {$mode objfpc}
  2. type
  3. generic TList<_T>=class(TObject)
  4. type
  5. PListItem = ^TListItem;
  6. TListItem = record
  7. data : _T;
  8. next : PListItem;
  9. end;
  10. TIterator = PListItem;
  11. var
  12. first : PListItem;
  13. function GetFirst : TIterator; inline;
  14. function GetNext(i : TIterator) : TIterator; inline;
  15. procedure Add(item: _T);
  16. end;
  17. procedure TList.Add(item: _T);
  18. var
  19. newitem : PListItem;
  20. begin
  21. new(newitem);
  22. newitem^.data:=item;
  23. newitem^.next:=first;
  24. first:=newitem;
  25. end;
  26. function TList.GetFirst : TIterator; inline;
  27. begin
  28. result:=first;
  29. end;
  30. function TList.GetNext(i : TIterator) : TIterator; inline;
  31. begin
  32. result:=i^.next;
  33. end;
  34. type
  35. TMyIntList = specialize TList<integer>;
  36. TMyStringList = specialize TList<string>;
  37. var
  38. ilist : TMyIntList;
  39. slist : TMyStringList;
  40. someInt : integer;
  41. iterator : TMyIntList.TIterator;
  42. begin
  43. someInt:=10;
  44. ilist := TMyIntList.Create;
  45. ilist.Add(someInt);
  46. ilist.Add(someInt+1);
  47. iterator:=ilist.GetFirst;
  48. writeln(iterator^.data);
  49. if iterator^.data<>11 then
  50. halt(1);
  51. iterator:=ilist.GetNext(iterator);
  52. writeln(iterator^.data);
  53. if iterator^.data<>10 then
  54. halt(1);
  55. slist := TMyStringList.Create;
  56. slist.Add('Test1');
  57. slist.Add('Test2');
  58. writeln(slist.first^.data);
  59. if slist.first^.data<>'Test2' then
  60. halt(1);
  61. writeln('ok');
  62. end.