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

Mantis #27549

git-svn-id: trunk@30075 -
This commit is contained in:
marco 2015-03-02 18:54:03 +00:00
parent 177b007eba
commit d20491e0f0

View File

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