diff options
author | svenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2019-08-02 13:16:09 +0000 |
---|---|---|
committer | svenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2019-08-02 13:16:09 +0000 |
commit | 9d3a1b8a147db6479d77e9dd0dd06b24d4f228d3 (patch) | |
tree | a65112f4e29562cf2aba170581ea3e12f9b53ff0 /packages/rtl-generics | |
parent | f7d9889cb1e254c20337235838411602a6e31cd4 (diff) | |
download | fpc-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.pas | 21 | ||||
-rw-r--r-- | packages/rtl-generics/tests/tests.generics.trees.pas | 25 |
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>; |