tgeneric6.pp 980 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. {$mode objfpc}
  2. type
  3. generic PListItem<_T>=^specialize TListItem<_T>;
  4. generic TListItem<_T>=record
  5. data : _T;
  6. next : specialize PListItem<_T>;
  7. end;
  8. generic TList<_T>=class(TObject)
  9. first : specialize PListItem<_T>;
  10. procedure Add(item: _T);
  11. end;
  12. procedure TList.Add(data: _T);
  13. var
  14. newitem : specialize PListItem<_T>;
  15. begin
  16. new(newitem);
  17. newitem.data:=data;
  18. newitem.next:=first;
  19. end;
  20. type
  21. TMyIntList = specialize TList<integer>;
  22. TMyStringList = specialize TList<string>;
  23. var
  24. ilist : TMyIntList;
  25. slist : TMyStringList;
  26. someInt : integer;
  27. begin
  28. someInt:=10;
  29. ilist := TMyIntList.Create;
  30. ilist.Add(someInt);
  31. ilist.Add(someInt+1);
  32. writeln(ilist.first^.data);
  33. if ilist.data<>10 then
  34. halt(1);
  35. writeln(ilist.first^.next^.data);
  36. if ilist.data<>11 then
  37. halt(1);
  38. slist := TMyStringList.Create;
  39. slist.Add('Test1');
  40. slist.Add('Test2');
  41. writeln(slist.data);
  42. if slist.data<>'Test1' then
  43. halt(1);
  44. end.