From b7af36b1e26d417aaa66666fa2f18219d96f7ee3 Mon Sep 17 00:00:00 2001 From: Jeremy Powell Date: Mon, 30 Sep 2024 15:43:04 +1300 Subject: [PATCH] Fix RBTree enumeration Implement IEnumerable to allow generic enumeration. Also use a List for the enumerator to avoid internal multiple enumeration with LINQ. (i.e. don't use ElementAt) --- sources/OpenMcdf/RBTree/RBTree.cs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/sources/OpenMcdf/RBTree/RBTree.cs b/sources/OpenMcdf/RBTree/RBTree.cs index 4315167..577fb69 100644 --- a/sources/OpenMcdf/RBTree/RBTree.cs +++ b/sources/OpenMcdf/RBTree/RBTree.cs @@ -1,6 +1,7 @@ #define ASSERT using System; +using System.Collections; using System.Collections.Generic; using System.Linq; @@ -88,7 +89,7 @@ Color Color void AssignValueTo(IRBNode other); } - public class RBTree + public class RBTree : IEnumerable { public IRBNode Root { get; set; } @@ -513,25 +514,25 @@ private void DoVisitTreeNodes(Action action, IRBNode walker) public class RBTreeEnumerator : IEnumerator { int position = -1; - private readonly Queue heap = new Queue(); + private readonly List list = new(); internal RBTreeEnumerator(RBTree tree) { - tree.VisitTreeNodes(item => heap.Enqueue(item)); + tree.VisitTreeNodes(item => list.Add(item)); } - public IRBNode Current => heap.ElementAt(position); - public void Dispose() { } - object System.Collections.IEnumerator.Current => heap.ElementAt(position); + public IRBNode Current => list[position]; + + object IEnumerator.Current => list[position]; public bool MoveNext() { position++; - return position < heap.Count; + return position < list.Count; } public void Reset() @@ -540,10 +541,9 @@ public void Reset() } } - public RBTreeEnumerator GetEnumerator() - { - return new RBTreeEnumerator(this); - } + public IEnumerator GetEnumerator() => new RBTreeEnumerator(this); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); private const int INDENT_STEP = 15;