summaryrefslogtreecommitdiff
path: root/packages/fcl-base/examples/contit.pp
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.