aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/EnumeratorWrapper.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/EnumeratorWrapper.cs')
-rw-r--r--Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/EnumeratorWrapper.cs55
1 files changed, 55 insertions, 0 deletions
diff --git a/Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/EnumeratorWrapper.cs b/Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/EnumeratorWrapper.cs
new file mode 100644
index 000000000..f8efdde2a
--- /dev/null
+++ b/Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/EnumeratorWrapper.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Collections.Generic;
+
+namespace SharpCifs.Util.Sharpen
+{
+ internal class EnumeratorWrapper<T> : Iterator<T>
+ {
+ object _collection;
+ IEnumerator<T> _e;
+ T _lastVal;
+ bool _more;
+ bool _copied;
+
+ public EnumeratorWrapper (object collection, IEnumerator<T> e)
+ {
+ this._e = e;
+ this._collection = collection;
+ _more = e.MoveNext ();
+ }
+
+ public override bool HasNext ()
+ {
+ return _more;
+ }
+
+ public override T Next ()
+ {
+ if (!_more)
+ throw new NoSuchElementException ();
+ _lastVal = _e.Current;
+ _more = _e.MoveNext ();
+ return _lastVal;
+ }
+
+ public override void Remove ()
+ {
+ ICollection<T> col = _collection as ICollection<T>;
+ if (col == null) {
+ throw new NotSupportedException ();
+ }
+ if (_more && !_copied) {
+ // Read the remaining elements, since the current enumerator
+ // will be invalid after removing the element
+ List<T> remaining = new List<T> ();
+ do {
+ remaining.Add (_e.Current);
+ } while (_e.MoveNext ());
+ _e = remaining.GetEnumerator ();
+ _e.MoveNext ();
+ _copied = true;
+ }
+ col.Remove (_lastVal);
+ }
+ }
+}