File: TQueueProject.lpr

package info (click to toggle)
lazarus 2.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 214,460 kB
  • sloc: pascal: 1,862,622; xml: 265,709; cpp: 56,595; sh: 3,008; java: 609; makefile: 535; perl: 297; sql: 222; ansic: 137
file content (89 lines) | stat: -rw-r--r-- 2,599 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// Generic types for FreeSparta.com and FreePascal!
// Original version by keeper89.blogspot.com, 2011
// FPC version by Maciej Izak (hnb), 2014

program TQueueProject;

{$MODE DELPHI}
{$APPTYPE CONSOLE}

uses
  SysUtils, Generics.Collections;

type
  // This is FreeSpaaarta! versions =)
  TSpartaVersion = (svFreeSparta, svBasic, svStarter, svProfessional);

  TCustomer = record
    strict private
      const
        SV_NAMES: array [TSpartaVersion] of string =
          ('FreeSparta', 'Basic', 'Starter', 'Professional');
    public
      var
        SpartaVersion: TSpartaVersion;
    class function Create(SpartaVersion: TSpartaVersion): TCustomer; static;
    function ToString: string;
  end;

class function TCustomer.Create(SpartaVersion: TSpartaVersion): TCustomer;
begin
  Result.SpartaVersion := SpartaVersion;
end;

function TCustomer.ToString: string;
begin
  Result := Format('Sparta %s', [SV_NAMES[SpartaVersion]])
end;

var
  CustomerQueue: TQueue<TCustomer>;
  Customer: TCustomer;
begin
  WriteLn('Working with TQueue - buy FreeSparta.com');
  WriteLn;

  // "Create" turn in sales
  CustomerQueue := TQueue<TCustomer>.Create;

  // Add a few people in the queue
  // Enqueue - puts the item in the queue
  CustomerQueue.Enqueue(TCustomer.Create(svFreeSparta));
  CustomerQueue.Enqueue(TCustomer.Create(svBasic));
  CustomerQueue.Enqueue(TCustomer.Create(svBasic));
  CustomerQueue.Enqueue(TCustomer.Create(svBasic));
  CustomerQueue.Enqueue(TCustomer.Create(svStarter));
  CustomerQueue.Enqueue(TCustomer.Create(svStarter));
  CustomerQueue.Enqueue(TCustomer.Create(svProfessional));
  CustomerQueue.Enqueue(TCustomer.Create(svProfessional));

  // Part of customers served
  // Dequeue - remove an element from the queue
  // btw if TQueue is TObjectQueue also call Free for object
  Customer := CustomerQueue.Dequeue;
  Writeln(Format('Sold (Dequeue): %s', [Customer.ToString]));
  // Extract - similar to Dequeue, but causes in OnNotify
  // Action = cnExtracted instead cnRemoved
  Customer := CustomerQueue.Extract;
  Writeln(Format('Sold (Extract): %s', [Customer.ToString]));

  // For what came next buyer?
  // Peek - returns the first element, but does not remove it from the queue
  Writeln(Format('Serves customers come for %s',
                 [CustomerQueue.Peek.ToString]));

  // The remaining buyers
  Writeln;
  Writeln(Format('Buyers left: %d', [CustomerQueue.Count]));
  for Customer in CustomerQueue do
    Writeln(Customer.ToString);

  // We serve all
  // Clear - clears the queue
  CustomerQueue.Clear;

  FreeAndNil(CustomerQueue);

  Readln;
end.