Browse Source

* Patch from Mattias to mostly revert his previous patch that broke his own code.
Mantis #27549

git-svn-id: trunk@30075 -

marco 10 years ago
parent
commit
d20491e0f0
1 changed files with 24 additions and 14 deletions
  1. 24 14
      packages/fcl-base/src/avl_tree.pp

+ 24 - 14
packages/fcl-base/src/avl_tree.pp

@@ -90,10 +90,8 @@ type
       const OnCompareKeyWithData: TListSortCompare): TAVLTreeNode;
       const OnCompareKeyWithData: TListSortCompare): TAVLTreeNode;
     function FindRightMostKey(Key: Pointer;
     function FindRightMostKey(Key: Pointer;
       const OnCompareKeyWithData: TListSortCompare): TAVLTreeNode;
       const OnCompareKeyWithData: TListSortCompare): TAVLTreeNode;
-    function FindLeftMostSameKey(ANode: TAVLTreeNode;
-      OnCompareKeyWithData: TListSortCompare = nil): TAVLTreeNode;
-    function FindRightMostSameKey(ANode: TAVLTreeNode;
-      OnCompareKeyWithData: TListSortCompare = nil): TAVLTreeNode;
+    function FindLeftMostSameKey(ANode: TAVLTreeNode): TAVLTreeNode;
+    function FindRightMostSameKey(ANode: TAVLTreeNode): TAVLTreeNode;
     procedure Add(ANode: TAVLTreeNode);
     procedure Add(ANode: TAVLTreeNode);
     function Add(Data: Pointer): TAVLTreeNode;
     function Add(Data: Pointer): TAVLTreeNode;
     procedure Delete(ANode: TAVLTreeNode);
     procedure Delete(ANode: TAVLTreeNode);
@@ -720,29 +718,43 @@ end;
 
 
 function TAVLTree.FindLeftMostKey(Key: Pointer;
 function TAVLTree.FindLeftMostKey(Key: Pointer;
   const OnCompareKeyWithData: TListSortCompare): TAVLTreeNode;
   const OnCompareKeyWithData: TListSortCompare): TAVLTreeNode;
+var
+  LeftNode: TAVLTreeNode;
 begin
 begin
-  Result:=FindLeftMostSameKey(FindKey(Key,OnCompareKeyWithData),OnCompareKeyWithData);
+  Result:=FindKey(Key,OnCompareKeyWithData);
+  if Result=nil then exit;
+  repeat
+    LeftNode:=FindPrecessor(Result);
+    if (LeftNode=nil) or (OnCompareKeyWithData(Key,LeftNode.Data)<>0) then exit;
+    Result:=LeftNode;
+  until false;
 end;
 end;
 
 
 function TAVLTree.FindRightMostKey(Key: Pointer;
 function TAVLTree.FindRightMostKey(Key: Pointer;
   const OnCompareKeyWithData: TListSortCompare): TAVLTreeNode;
   const OnCompareKeyWithData: TListSortCompare): TAVLTreeNode;
+var
+  RightNode: TAVLTreeNode;
 begin
 begin
-  Result:=FindRightMostSameKey(FindKey(Key,OnCompareKeyWithData),OnCompareKeyWithData);
+  Result:=FindKey(Key,OnCompareKeyWithData);
+  if Result=nil then exit;
+  repeat
+    RightNode:=FindSuccessor(Result);
+    if (RightNode=nil) or (OnCompareKeyWithData(Key,RightNode.Data)<>0) then exit;
+    Result:=RightNode;
+  until false;
 end;
 end;
 
 
-function TAVLTree.FindLeftMostSameKey(ANode: TAVLTreeNode;
-  OnCompareKeyWithData: TListSortCompare): TAVLTreeNode;
+function TAVLTree.FindLeftMostSameKey(ANode: TAVLTreeNode): TAVLTreeNode;
 var
 var
   LeftNode: TAVLTreeNode;
   LeftNode: TAVLTreeNode;
   Data: Pointer;
   Data: Pointer;
 begin
 begin
   if ANode<>nil then begin
   if ANode<>nil then begin
-    if OnCompareKeyWithData=nil then OnCompareKeyWithData:=FOnCompare;
     Data:=ANode.Data;
     Data:=ANode.Data;
     Result:=ANode;
     Result:=ANode;
     repeat
     repeat
       LeftNode:=FindPrecessor(Result);
       LeftNode:=FindPrecessor(Result);
-      if (LeftNode=nil) or (OnCompareKeyWithData(Data,LeftNode.Data)<>0) then break;
+      if (LeftNode=nil) or (FOnCompare(Data,LeftNode.Data)<>0) then break;
       Result:=LeftNode;
       Result:=LeftNode;
     until false;
     until false;
   end else begin
   end else begin
@@ -750,19 +762,17 @@ begin
   end;
   end;
 end;
 end;
 
 
-function TAVLTree.FindRightMostSameKey(ANode: TAVLTreeNode;
-  OnCompareKeyWithData: TListSortCompare): TAVLTreeNode;
+function TAVLTree.FindRightMostSameKey(ANode: TAVLTreeNode): TAVLTreeNode;
 var
 var
   RightNode: TAVLTreeNode;
   RightNode: TAVLTreeNode;
   Data: Pointer;
   Data: Pointer;
 begin
 begin
   if ANode<>nil then begin
   if ANode<>nil then begin
-    if OnCompareKeyWithData=nil then OnCompareKeyWithData:=FOnCompare;
     Data:=ANode.Data;
     Data:=ANode.Data;
     Result:=ANode;
     Result:=ANode;
     repeat
     repeat
       RightNode:=FindSuccessor(Result);
       RightNode:=FindSuccessor(Result);
-      if (RightNode=nil) or (OnCompareKeyWithData(Data,RightNode.Data)<>0) then break;
+      if (RightNode=nil) or (FOnCompare(Data,RightNode.Data)<>0) then break;
       Result:=RightNode;
       Result:=RightNode;
     until false;
     until false;
   end else begin
   end else begin