#if FAT using System; using System.Collections.Generic; using LinqInternal.Core; namespace LinqInternal.Collections { [Serializable] [System.Diagnostics.DebuggerNonUserCode] [System.Diagnostics.DebuggerDisplay("Count={Count}")] internal sealed class ExtendedQueue : IDropPoint, IEnumerable, ICollection, ICloneable> { private readonly IReadOnlyCollection _readOnly; private readonly Queue _wrapped; public ExtendedQueue() { _wrapped = new Queue(); _readOnly = new ExtendedReadOnlyCollection(this); } public ExtendedQueue(IEnumerable collection) { _wrapped = new Queue(collection); _readOnly = new ExtendedReadOnlyCollection(this); } public IReadOnlyCollection AsReadOnly { get { return _readOnly; } } public int Count { get { return _wrapped.Count; } } bool ICollection.IsReadOnly { get { return false; } } public T Item { get { return _wrapped.Peek(); } } public bool Add(T item) { _wrapped.Enqueue(item); return true; } public void Clear() { _wrapped.Clear(); } public ExtendedQueue Clone() { return new ExtendedQueue(this); } public bool Contains(T item) { return _wrapped.Contains(item); } public bool Contains(T item, IEqualityComparer comparer) { return System.Linq.Enumerable.Contains(_wrapped, item, comparer); } public void CopyTo(T[] array, int arrayIndex) { _wrapped.CopyTo(array, arrayIndex); } public void CopyTo(T[] array) { _wrapped.CopyTo(array, 0); } public void CopyTo(T[] array, int arrayIndex, int countLimit) { Extensions.CanCopyTo(array, arrayIndex, countLimit); Extensions.CopyTo(this, array, arrayIndex, countLimit); } public IEnumerator GetEnumerator() { return _wrapped.GetEnumerator(); } #if !NETCOREAPP1_1 object ICloneable.Clone() { return Clone(); } #endif void ICollection.Add(T item) { _wrapped.Enqueue(item); } bool ICollection.Remove(T item) { return Remove(item); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } public bool TryTake(out T item) { try { item = _wrapped.Dequeue(); return true; } catch (InvalidOperationException) { item = default(T); return false; } } private bool Remove(T item) { return Remove(item, EqualityComparer.Default); } private bool Remove(T item, IEqualityComparer comparer) { if (comparer.Equals(item, _wrapped.Peek())) { _wrapped.Dequeue(); return true; } else { return false; } } } } #endif