summaryrefslogtreecommitdiff
path: root/packages/rtl-generics
diff options
context:
space:
mode:
authorsvenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2>2019-08-02 13:16:09 +0000
committersvenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2>2019-08-02 13:16:09 +0000
commit9d3a1b8a147db6479d77e9dd0dd06b24d4f228d3 (patch)
treea65112f4e29562cf2aba170581ea3e12f9b53ff0 /packages/rtl-generics
parentf7d9889cb1e254c20337235838411602a6e31cd4 (diff)
downloadfpc-9d3a1b8a147db6479d77e9dd0dd06b24d4f228d3.tar.gz
* fix for Mantis #35919: apply patch by Maciej Izak
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@42557 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/rtl-generics')
-rw-r--r--packages/rtl-generics/src/generics.collections.pas21
-rw-r--r--packages/rtl-generics/tests/tests.generics.trees.pas25
2 files changed, 46 insertions, 0 deletions
diff --git a/packages/rtl-generics/src/generics.collections.pas b/packages/rtl-generics/src/generics.collections.pas
index 2d08a76e9b..930675a86a 100644
--- a/packages/rtl-generics/src/generics.collections.pas
+++ b/packages/rtl-generics/src/generics.collections.pas
@@ -679,7 +679,10 @@ type
procedure ValueNotify(constref AValue: TValue; ACollectionNotification: TCollectionNotification); inline;
procedure NodeNotify(ANode: PNode; ACollectionNotification: TCollectionNotification; ADispose: boolean); inline;
procedure SetValue(var AValue: TValue; constref ANewValue: TValue);
+ function GetItem(const AKey: TKey): TValue;
+ procedure SetItem(const AKey: TKey; const AValue: TValue);
+ property Items[Index: TKey]: TValue read GetItem write SetItem;
// for reporting
procedure WriteStr(AStream: TStream; const AText: string);
public type
@@ -782,6 +785,8 @@ type
end;
TAVLTreeMap<TKey, TValue> = class(TCustomAVLTreeMap<TKey, TValue, TEmptyRecord>)
+ public
+ property Items; default;
end;
TIndexedAVLTreeMap<TKey, TValue> = class(TCustomAVLTreeMap<TKey, TValue, SizeInt>)
@@ -808,6 +813,7 @@ type
protected
property OnKeyNotify;
property OnValueNotify;
+ property Items;
public type
TItemEnumerator = TKeyEnumerator;
public
@@ -3319,6 +3325,21 @@ begin
Result := TValueCollection(FValues);
end;
+function TCustomAVLTreeMap<TREE_CONSTRAINTS>.GetItem(const AKey: TKey): TValue;
+var
+ LNode: PNode;
+begin
+ LNode := Find(AKey);
+ if not Assigned(LNode) then
+ raise EAVLTree.CreateRes(@SDictionaryKeyDoesNotExist);
+ result := LNode.Value;
+end;
+
+procedure TCustomAVLTreeMap<TREE_CONSTRAINTS>.SetItem(const AKey: TKey; const AValue: TValue);
+begin
+ Find(AKey).Value := AValue;
+end;
+
constructor TCustomAVLTreeMap<TREE_CONSTRAINTS>.Create;
begin
FComparer := TComparer<TKey>.Default;
diff --git a/packages/rtl-generics/tests/tests.generics.trees.pas b/packages/rtl-generics/tests/tests.generics.trees.pas
index 1152c91130..134753273e 100644
--- a/packages/rtl-generics/tests/tests.generics.trees.pas
+++ b/packages/rtl-generics/tests/tests.generics.trees.pas
@@ -42,6 +42,7 @@ type
procedure Test_IndexedAVLTree_Add_General;
procedure Test_IndexedAVLTree_Add;
procedure Test_IndexedAVLTree_Delete;
+ procedure Test_IndexedAVLTree_Items;
procedure Test_TAVLTreeMap_Notification;
end;
@@ -50,6 +51,7 @@ implementation
type
TStringsTree = TIndexedAVLTree<string>;
+ TMapTree = TAVLTreeMap<string, Integer>;
{ TTestTrees }
@@ -138,6 +140,29 @@ begin
end;
end;
+procedure TTestTrees.Test_IndexedAVLTree_Items;
+var
+ LTree: TMapTree;
+begin
+ LTree := TMapTree.Create;
+ try
+ Check(LTree.Add('A', 1)<>nil);
+ Check(LTree.Add('B', 2)<>nil);
+ Check(LTree.Add('C', 3)<>nil);
+ CheckEquals(LTree.Items['A'], 1);
+ CheckEquals(LTree.Items['B'], 2);
+ CheckEquals(LTree.Items['C'], 3);
+ LTree.Items['A'] := 4;
+ LTree.Items['B'] := 5;
+ LTree.Items['C'] := 6;
+ CheckEquals(LTree.Items['A'], 4);
+ CheckEquals(LTree.Items['B'], 5);
+ CheckEquals(LTree.Items['C'], 6);
+ finally
+ LTree.Free;
+ end;
+end;
+
procedure TTestTrees.Test_TAVLTreeMap_Notification;
var
LTree: TAVLTreeMap<string, string>;