diff options
Diffstat (limited to 'Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/EnumeratorWrapper.cs')
| -rw-r--r-- | Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/EnumeratorWrapper.cs | 55 |
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); + } + } +} |
