+2009-07-31 Raja R Harinath <harinath@hurrynot.org>
+
+ * RBTree.cs (NodeEnumerator.check_current): New helper.
+ (NodeEnumerator.Current): Don't check invariants.
+ * SortedDictionary.cs (Enumerator.Current): Likewise.
+ (ValueCollection.Enumerator.Current): Likewise.
+ (KeyCollection.Enumerator.Current): Likewise.
+
2009-07-26 Miguel de Icaza <miguel@novell.com>
* Stack.cs: Check arguments.
public void Reset ()
{
- if (tree == null)
- throw new ObjectDisposedException ("enumerator");
+ check_version ();
pennants = null;
}
public Node Current {
- get {
- check_version ();
- if (pennants == null)
- throw new InvalidOperationException ("state invalid before the first MoveNext()");
- return pennants.Peek ();
- }
+ get { return pennants.Peek (); }
}
object IEnumerator.Current {
- get { return Current; }
+ get {
+ check_current ();
+ return Current;
+ }
}
public bool MoveNext ()
if (version != tree.version)
throw new InvalidOperationException ("tree modified");
}
+
+ internal void check_current ()
+ {
+ check_version ();
+ if (pennants == null)
+ throw new InvalidOperationException ("state invalid before the first MoveNext()");
+ }
}
}
}
{
RBTree.NodeEnumerator host;
+ TValue current;
+
internal Enumerator (SortedDictionary<TKey,TValue> dic)
+ : this ()
{
host = dic.tree.GetEnumerator ();
}
public TValue Current {
- get { return ((Node) host.Current).value; }
+ get { return current; }
}
public bool MoveNext ()
{
- return host.MoveNext ();
+ if (!host.MoveNext ())
+ return false;
+ current = ((Node) host.Current).value;
+ return true;
}
public void Dispose ()
}
object IEnumerator.Current {
- get { return Current; }
+ get {
+ host.check_current ();
+ return current;
+ }
}
void IEnumerator.Reset ()
{
RBTree.NodeEnumerator host;
+ TKey current;
+
internal Enumerator (SortedDictionary<TKey,TValue> dic)
+ : this ()
{
host = dic.tree.GetEnumerator ();
}
public TKey Current {
- get { return ((Node) host.Current).key; }
+ get { return current; }
}
public bool MoveNext ()
{
- return host.MoveNext ();
+ if (!host.MoveNext ())
+ return false;
+ current = ((Node) host.Current).key;
+ return true;
}
public void Dispose ()
}
object IEnumerator.Current {
- get { return Current; }
+ get {
+ host.check_current ();
+ return current;
+ }
}
void IEnumerator.Reset ()
{
RBTree.NodeEnumerator host;
+ KeyValuePair<TKey, TValue> current;
+
internal Enumerator (SortedDictionary<TKey,TValue> dic)
+ : this ()
{
host = dic.tree.GetEnumerator ();
}
public KeyValuePair<TKey,TValue> Current {
- get { return ((Node) host.Current).AsKV (); }
+ get { return current; }
}
public bool MoveNext ()
{
- return host.MoveNext ();
+ if (!host.MoveNext ())
+ return false;
+ current = ((Node) host.Current).AsKV ();
+ return true;
}
public void Dispose ()
host.Dispose ();
}
+ Node CurrentNode {
+ get {
+ host.check_current ();
+ return (Node) host.Current;
+ }
+ }
+
DictionaryEntry IDictionaryEnumerator.Entry {
- get { return ((Node) host.Current).AsDE (); }
+ get { return CurrentNode.AsDE (); }
}
object IDictionaryEnumerator.Key {
- get { return ((Node) host.Current).key; }
+ get { return CurrentNode.key; }
}
object IDictionaryEnumerator.Value {
- get { return ((Node) host.Current).value; }
+ get { return CurrentNode.value; }
}
object IEnumerator.Current {
- get { return ((Node) host.Current).AsDE (); }
+ get { return CurrentNode.AsDE (); }
}
void IEnumerator.Reset ()
+2009-07-31 Raja R Harinath <harinath@hurrynot.org>
+
+ * SortedDictionaryTest.cs (Enumerator_Current): New test.
+ (KeyEnumerator_Current, ValueEnumerator_Current): Likewise.
+
2009-07-14 Gonzalo Paniagua Javier <gonzalo@novell.com>
* SortedListTest.cs: new tests for bug #521750 provided by
d.Add (4, "D");
e.MoveNext ();
}
+
+
+ delegate void D ();
+ bool Throws (D d)
+ {
+ try {
+ d ();
+ return false;
+ } catch {
+ return true;
+ }
+ }
+
+ [Test]
+ // based on #491858, #517415
+ public void Enumerator_Current ()
+ {
+ var e1 = new SortedDictionary<int,int>.Enumerator ();
+ Assert.IsFalse (Throws (delegate { var x = e1.Current; }));
+
+ var d = new SortedDictionary<int,int> ();
+ var e2 = d.GetEnumerator ();
+ Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
+ e2.MoveNext ();
+ Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
+ e2.Dispose ();
+ Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
+
+ var e3 = ((IEnumerable<KeyValuePair<int,int>>) d).GetEnumerator ();
+ Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
+ e3.MoveNext ();
+ Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
+ e3.Dispose ();
+ Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
+
+ var e4 = ((IEnumerable) d).GetEnumerator ();
+ Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
+ e4.MoveNext ();
+ Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
+ ((IDisposable) e4).Dispose ();
+ Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
+ }
+
+ [Test]
+ // based on #491858, #517415
+ public void KeyEnumerator_Current ()
+ {
+ var e1 = new SortedDictionary<int,int>.KeyCollection.Enumerator ();
+ Assert.IsFalse (Throws (delegate { var x = e1.Current; }));
+
+ var d = new SortedDictionary<int,int> ().Keys;
+ var e2 = d.GetEnumerator ();
+ Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
+ e2.MoveNext ();
+ Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
+ e2.Dispose ();
+ Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
+
+ var e3 = ((IEnumerable<int>) d).GetEnumerator ();
+ Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
+ e3.MoveNext ();
+ Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
+ e3.Dispose ();
+ Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
+
+ var e4 = ((IEnumerable) d).GetEnumerator ();
+ Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
+ e4.MoveNext ();
+ Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
+ ((IDisposable) e4).Dispose ();
+ Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
+ }
+
+ [Test]
+ // based on #491858, #517415
+ public void ValueEnumerator_Current ()
+ {
+ var e1 = new SortedDictionary<int,int>.ValueCollection.Enumerator ();
+ Assert.IsFalse (Throws (delegate { var x = e1.Current; }));
+
+ var d = new SortedDictionary<int,int> ().Values;
+ var e2 = d.GetEnumerator ();
+ Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
+ e2.MoveNext ();
+ Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
+ e2.Dispose ();
+ Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
+
+ var e3 = ((IEnumerable<int>) d).GetEnumerator ();
+ Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
+ e3.MoveNext ();
+ Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
+ e3.Dispose ();
+ Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
+
+ var e4 = ((IEnumerable) d).GetEnumerator ();
+ Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
+ e4.MoveNext ();
+ Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
+ ((IDisposable) e4).Dispose ();
+ Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
+ }
}
class ReverseComparer<T> : IComparer<T>