mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-18 08:20:51 +01:00
119 lines
2.7 KiB
ObjectPascal
119 lines
2.7 KiB
ObjectPascal
{$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.
|