Browse Source

avl_tree: added enumerator

git-svn-id: trunk@19032 -
Mattias Gaertner 14 years ago
parent
commit
14d13bc004
1 changed files with 36 additions and 0 deletions
  1. 36 0
      packages/fcl-base/src/avl_tree.pp

+ 36 - 0
packages/fcl-base/src/avl_tree.pp

@@ -48,6 +48,20 @@ type
     function NewNode: TAVLTreeNode; virtual; abstract;
   end;
 
+  TAVLTree = class;
+
+  { TAVLTreeNodeEnumerator }
+
+  TAVLTreeNodeEnumerator = class
+  private
+    FTree: TAVLTree;
+    FCurrent: TAVLTreeNode;
+  public
+    constructor Create(Tree: TAVLTree);
+    function MoveNext: Boolean;
+    property Current: TAVLTreeNode read FCurrent;
+  end;
+
   TAVLTree = class
   private
     FOnCompare: TListSortCompare;
@@ -98,6 +112,7 @@ type
     constructor Create(OnCompareMethod: TListSortCompare);
     constructor Create;
     destructor Destroy; override;
+    function GetEnumerator: TAVLTreeNodeEnumerator;
   end;
 
   TAVLTreeNodeMemManager = class(TBaseAVLTreeNodeManager)
@@ -136,6 +151,22 @@ begin
   else Result:=0;
 end;
 
+{ TAVLTreeNodeEnumerator }
+
+constructor TAVLTreeNodeEnumerator.Create(Tree: TAVLTree);
+begin
+  FTree:=Tree;
+end;
+
+function TAVLTreeNodeEnumerator.MoveNext: Boolean;
+begin
+  if FCurrent=nil then
+    FCurrent:=FTree.FindLowest
+  else
+    FCurrent:=FTree.FindSuccessor(FCurrent);
+  Result:=FCurrent<>nil;
+end;
+
 { TAVLTree }
 
 function TAVLTree.Add(Data: Pointer): TAVLTreeNode;
@@ -649,6 +680,11 @@ begin
   inherited Destroy;
 end;
 
+function TAVLTree.GetEnumerator: TAVLTreeNodeEnumerator;
+begin
+  Result:=TAVLTreeNodeEnumerator.Create(Self);
+end;
+
 function TAVLTree.Find(Data: Pointer): TAVLTreeNode;
 var Comp: integer;
 begin