File: TStackProject.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 (85 lines) | stat: -rw-r--r-- 2,264 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
// Generic types for FreeSparta.com and FreePascal!
// Original version by keeper89.blogspot.com, 2011
// FPC version by Maciej Izak (hnb), 2014
program TStackProject;

{$MODE DELPHI}
{$APPTYPE CONSOLE}

uses
  SysUtils,
  Generics.Collections;

type
  // We will cook pancakes, put them on a plate and take the last
  TPancakeType = (ptMeat, ptCherry, ptCurds);

  TPancake = record
    strict private
      const
        PANCAKE_TYPE_NAMES: array [TPancakeType] of string =
          ('meat', 'cherry', 'curds');
    public
      var
        PancakeType: TPancakeType;
    class function Create(PancakeType: TPancakeType): TPancake; static;
    function ToString: string;
  end;

class function TPancake.Create(PancakeType: TPancakeType): TPancake;
begin
  Result.PancakeType := PancakeType;
end;

function TPancake.ToString: string;
begin
  Result := Format('Pancake with %s', [PANCAKE_TYPE_NAMES[PancakeType]])
end;

var
  PancakesPlate: TStack<TPancake>;
  Pancake: TPancake;

begin
  WriteLn('Working with TStack - pancakes');
  WriteLn;

  // "Create" a plate of pancakes
  PancakesPlate := TStack<TPancake>.Create;

  // Bake some pancakes
  // Push - puts items on the stack
  PancakesPlate.Push(TPancake.Create(ptMeat));
  PancakesPlate.Push(TPancake.Create(ptCherry));
  PancakesPlate.Push(TPancake.Create(ptCherry));
  PancakesPlate.Push(TPancake.Create(ptCurds));
  PancakesPlate.Push(TPancake.Create(ptMeat));

  // Eating some pancakes
  // Pop - removes an item from the stack
  Pancake := PancakesPlate.Pop;
  Writeln(Format('Ate a pancake (Pop): %s', [Pancake.ToString]));
  // Extract - similar to Pop, but causes in OnNotify
  // Action = cnExtracted instead of cnRemoved
  Pancake := PancakesPlate.Extract;
  Writeln(Format('Ate a pancake (Extract): %s', [Pancake.ToString]));

  // What is the last pancake?
  // Peek - returns the last item, but does not remove it from the stack
  Writeln(Format('Last pancake: %s', [PancakesPlate.Peek.ToString]));

  // Show the remaining pancakes
  Writeln;
  Writeln(Format('Total pancakes: %d', [PancakesPlate.Count]));
  for Pancake in PancakesPlate do
    Writeln(Pancake.ToString);

  // Eat up all
  // Clear - clears the stack
  PancakesPlate.Clear;

  FreeAndNil(PancakesPlate);

  Readln;
end.