-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbox.pas
126 lines (107 loc) · 2.72 KB
/
box.pas
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
unit Box;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils,
Id, Exceptions, ExList;
const
BOXES : Integer = 5;
type
TCardArray = Array[1..5] of TExObjectList;
{ TBox }
TBox = class(TObject)
public
constructor Create;
destructor Destroy;
procedure MoveCardToFirst(CardId : TId);
procedure AdvanceCard (CardId : TId);
procedure AddToBox(BoxNumber : Integer; CardId : TId);
function Contains(BoxNumber : Integer; CardId : TId) : Boolean;
private
FId : TId;
Cards : TCardArray;
procedure CheckCardExistence(var BoxHolding: Integer; var CardId: TId);
function GetBoxHolding(Id : TId) : Integer;
function ExtractCard(const BoxHolding: Integer;
const CardId: TId) : TId;
end;
implementation
constructor TBox.Create;
var
i : Integer;
begin
for i := 1 to BOXES do
begin
Cards[i] := TExObjectList.Create;
Cards[i].OwnsObjects := True;
end;
end;
destructor TBox.Destroy;
var
i : Integer;
begin
for i:=1 to BOXES do
Cards[i].Free;
end;
function TBox.ExtractCard(const BoxHolding: Integer;
const CardId: TId) : TId;
var
AObject: TObject;
begin
AObject:=Cards[BoxHolding].Get(CardId);
if AObject = nil then raise EInvalidState('Card with id ' + CardId.ToString + ' '
+'doesn''t exist in box!');
Result:=Cards[BoxHolding].Extract(AObject as TId) as TId;
end;
procedure TBox.MoveCardToFirst(CardId : TId);
var
BoxHolding : Integer;
IdOnList : TId;
begin
BoxHolding:=GetBoxHolding(CardId);
CheckCardExistence(BoxHolding, CardId);
IdOnList:=ExtractCard(BoxHolding, CardId);
Cards[1].Add(IdOnList);
end;
procedure TBox.AdvanceCard(CardId : TId);
var
BoxHolding : Integer;
IdOnList : TId;
begin
BoxHolding:=GetBoxHolding(CardId);
CheckCardExistence(BoxHolding, CardId);
IdOnList:=ExtractCard(BoxHolding, CardId);
if BoxHolding < 5 then
Cards[BoxHolding+1].Add(IdOnList)
else
IdOnList.Free;
end;
procedure TBox.AddToBox(BoxNumber : Integer; CardId : TId);
begin
Cards[BoxNumber].Add(CardId);
end;
function TBox.Contains(BoxNumber : Integer; CardId : TId) : Boolean;
var
i : Integer;
begin
Result := Cards[BoxNumber].Contains(CardId);
end;
function TBox.GetBoxHolding(Id : TId) : Integer;
var
i : Integer;
begin
if Id = Nil then raise EInvalidArgument.Create('Id cannot be Nil!');
Result:=-1;
for i:=1 to BOXES do
if Cards[i].Contains(Id) then
begin
Result:=i;
Break;
end;
end;
procedure TBox.CheckCardExistence(var BoxHolding: Integer; var CardId: TId);
begin
if BoxHolding < 1 then raise EInvalidState.Create('No box is holding card ' +
CardId.ToString);
end;
end.