blob: 11d58b12a1f3c9411f423207d5cef46c221077b9 (
plain)
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
|
{$MODE OBJFPC}
{$H+}
{$C+}
program test;
uses
contnrs,
sysutils;
const
KEYS: array [0..5] of string = (
'a',
'b',
'c',
'd',
'e',
'f'
);
TERMINATE_KEY_ID = 2;
procedure DataStaticIterator(Item: Pointer; const Key: string; var Continue: Boolean);
begin
Assert(Key = String(Item^));
Continue := TRUE;
end;
procedure DataStaticIteratorTerminated(Item: Pointer; const Key: string; var Continue: Boolean);
begin
Continue := Key <> KEYS[TERMINATE_KEY_ID];
end;
procedure StringStaticIterator(Item: String; const Key: string; var Continue: Boolean);
begin
Assert(Key = Item);
Continue := TRUE;
end;
procedure StringStaticIteratorTerminated(Item: String; const Key: string; var Continue: Boolean);
begin
Continue := Key <> KEYS[TERMINATE_KEY_ID];
end;
type
TTestObject = class
private
FStr: string;
public
constructor Create(const S: string);
property Str: string read FStr;
end;
constructor TTestObject.Create(const S: string);
begin
FStr := S;
end;
procedure ObjectStaticIterator(Item: TObject; const Key: string; var Continue: Boolean);
begin
Assert(Key = TTestObject(Item).Str);
Continue := TRUE;
end;
procedure ObjectStaticIteratorTerminated(Item: TObject; const Key: string; var Continue: Boolean);
begin
Continue := Key <> KEYS[TERMINATE_KEY_ID];
end;
var
i: integer;
data_hash_table: TFPDataHashTable;
last_data: pointer;
string_hash_table: TFPStringHashTable;
last_string: string;
object_hash_table: TFPObjectHashTable;
last_object: TTestObject;
begin
data_hash_table := TFPDataHashTable.Create;
for i := 0 to High(KEYS) do
data_hash_table.Add(KEYS[i], @KEYS[i]);
last_data := data_hash_table.Iterate(@DataStaticIterator);
Assert(last_data = NIL);
last_data := data_hash_table.Iterate(@DataStaticIteratorTerminated);
Assert(last_data = @KEYS[TERMINATE_KEY_ID]);
data_hash_table.Free;
string_hash_table := TFPStringHashTable.Create;
for i := 0 to High(KEYS) do
string_hash_table.Add(KEYS[i], KEYS[i]);
last_string := string_hash_table.Iterate(@StringStaticIterator);
Assert(last_string = '');
last_string := string_hash_table.Iterate(@StringStaticIteratorTerminated);
Assert(last_string = KEYS[TERMINATE_KEY_ID]);
string_hash_table.Free;
object_hash_table := TFPObjectHashTable.Create(TRUE);
for i := 0 to High(KEYS) do
object_hash_table.Add(KEYS[i], TTestObject.Create(KEYS[i]));
last_object := TTestObject(object_hash_table.Iterate(@ObjectStaticIterator));
Assert(last_object = NIL);
last_object := TTestObject(object_hash_table.Iterate(@ObjectStaticIteratorTerminated));
Assert(last_object.Str = KEYS[TERMINATE_KEY_ID]);
object_hash_table.Free;
WriteLn('All is OK');
end.
|