tqueueproject.lpr 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Generic types for NewPascal.org and FPC!
  2. // Original version by keeper89.blogspot.com, 2011
  3. // FPC version by Maciej Izak (hnb), 2014
  4. program TQueueProject;
  5. {$MODE DELPHI}
  6. {$APPTYPE CONSOLE}
  7. uses
  8. SysUtils, Generics.Collections;
  9. type
  10. // This is FreeSpaaarta! versions =)
  11. TSpartaVersion = (svFreeSparta, svBasic, svStarter, svProfessional);
  12. TCustomer = record
  13. strict private
  14. const
  15. SV_NAMES: array [TSpartaVersion] of string =
  16. ('FreeSparta', 'Basic', 'Starter', 'Professional');
  17. public
  18. var
  19. SpartaVersion: TSpartaVersion;
  20. class function Create(SpartaVersion: TSpartaVersion): TCustomer; static;
  21. function ToString: string;
  22. end;
  23. class function TCustomer.Create(SpartaVersion: TSpartaVersion): TCustomer;
  24. begin
  25. Result.SpartaVersion := SpartaVersion;
  26. end;
  27. function TCustomer.ToString: string;
  28. begin
  29. Result := Format('Sparta %s', [SV_NAMES[SpartaVersion]])
  30. end;
  31. var
  32. CustomerQueue: TQueue<TCustomer>;
  33. Customer: TCustomer;
  34. begin
  35. WriteLn('Working with TQueue - buy FreeSparta.com');
  36. WriteLn;
  37. // "Create" turn in sales
  38. CustomerQueue := TQueue<TCustomer>.Create;
  39. // Add a few people in the queue
  40. // Enqueue - puts the item in the queue
  41. CustomerQueue.Enqueue(TCustomer.Create(svFreeSparta));
  42. CustomerQueue.Enqueue(TCustomer.Create(svBasic));
  43. CustomerQueue.Enqueue(TCustomer.Create(svBasic));
  44. CustomerQueue.Enqueue(TCustomer.Create(svBasic));
  45. CustomerQueue.Enqueue(TCustomer.Create(svStarter));
  46. CustomerQueue.Enqueue(TCustomer.Create(svStarter));
  47. CustomerQueue.Enqueue(TCustomer.Create(svProfessional));
  48. CustomerQueue.Enqueue(TCustomer.Create(svProfessional));
  49. // Part of customers served
  50. // Dequeue - remove an element from the queue
  51. // btw if TQueue is TObjectQueue also call Free for object
  52. Customer := CustomerQueue.Dequeue;
  53. Writeln(Format('Sold (Dequeue): %s', [Customer.ToString]));
  54. // Extract - similar to Dequeue, but causes in OnNotify
  55. // Action = cnExtracted instead cnRemoved
  56. Customer := CustomerQueue.Extract;
  57. Writeln(Format('Sold (Extract): %s', [Customer.ToString]));
  58. // For what came next buyer?
  59. // Peek - returns the first element, but does not remove it from the queue
  60. Writeln(Format('Serves customers come for %s',
  61. [CustomerQueue.Peek.ToString]));
  62. // The remaining buyers
  63. Writeln;
  64. Writeln(Format('Buyers left: %d', [CustomerQueue.Count]));
  65. for Customer in CustomerQueue do
  66. Writeln(Customer.ToString);
  67. // We serve all
  68. // Clear - clears the queue
  69. CustomerQueue.Clear;
  70. FreeAndNil(CustomerQueue);
  71. Readln;
  72. end.