File: tqueueproject.lpr

package info (click to toggle)
fpc 3.2.2%2Bdfsg-49
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 341,452 kB
  • sloc: pascal: 3,820,194; xml: 194,356; ansic: 9,637; asm: 8,482; java: 5,346; sh: 4,813; yacc: 3,956; makefile: 2,705; lex: 2,661; javascript: 2,454; sql: 929; php: 474; cpp: 145; perl: 136; sed: 132; csh: 34; tcl: 7
file content (89 lines) | stat: -rw-r--r-- 2,591 bytes parent folder | download | duplicates (5)
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 NewPascal.org and FPC!
// 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.