tforin9.pp 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. program tforin9;
  2. // Test interface with 'enumerator MoveNext', 'enumerator Current' directives
  3. {$mode objfpc}{$H+}
  4. {$APPTYPE CONSOLE}
  5. type
  6. { IMyIterator }
  7. IMyIterator = interface
  8. function GetValue: TObject;
  9. function StepForward: Boolean; enumerator MoveNext;
  10. property Value: TObject read GetValue; enumerator Current;
  11. end;
  12. { TMyListEnumerator }
  13. TMyListEnumerator = class(TInterfacedObject, IMyIterator)
  14. private
  15. FValue: Pointer;
  16. function GetValue: TObject;
  17. public
  18. function StepForward: Boolean;
  19. property Value: TObject read GetValue;
  20. end;
  21. TMyList = class
  22. public
  23. function GetIterator: IMyIterator;
  24. end;
  25. operator Enumerator(AList: TMyList): IMyIterator;
  26. begin
  27. Result := AList.GetIterator;
  28. end;
  29. { TMyListEnumerator }
  30. function TMyListEnumerator.GetValue: TObject;
  31. begin
  32. Result := TObject(FValue);
  33. end;
  34. function TMyListEnumerator.StepForward: Boolean;
  35. begin
  36. inc(PByte(FValue));
  37. Result := FValue <= Pointer(3);
  38. end;
  39. { TMyList }
  40. function TMyList.GetIterator: IMyIterator;
  41. begin
  42. Result := TMyListEnumerator.Create;
  43. end;
  44. var
  45. List: TMyList;
  46. i: TObject;
  47. begin
  48. List := TMyList.Create;
  49. for i in List do
  50. WriteLn(PtrInt(i));
  51. List.Free;
  52. end.