You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
3.3 KiB
148 lines
3.3 KiB
5 years ago
|
#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 ExtendedStack<T> : IDropPoint<T>, IEnumerable<T>, ICollection<T>, ICloneable<ExtendedStack<T>>
|
||
|
{
|
||
|
private readonly IReadOnlyCollection<T> _readOnly;
|
||
|
private readonly Stack<T> _wrapped;
|
||
|
|
||
|
public ExtendedStack()
|
||
|
{
|
||
|
_wrapped = new Stack<T>();
|
||
|
_readOnly = new ExtendedReadOnlyCollection<T>(this);
|
||
|
}
|
||
|
|
||
|
public ExtendedStack(IEnumerable<T> collection)
|
||
|
{
|
||
|
_wrapped = new Stack<T>(collection);
|
||
|
_readOnly = new ExtendedReadOnlyCollection<T>(this);
|
||
|
}
|
||
|
|
||
|
public IReadOnlyCollection<T> AsReadOnly
|
||
|
{
|
||
|
get { return _readOnly; }
|
||
|
}
|
||
|
|
||
|
public int Count
|
||
|
{
|
||
|
get { return _wrapped.Count; }
|
||
|
}
|
||
|
|
||
|
bool ICollection<T>.IsReadOnly
|
||
|
{
|
||
|
get { return false; }
|
||
|
}
|
||
|
|
||
|
public T Item
|
||
|
{
|
||
|
get { return _wrapped.Peek(); }
|
||
|
}
|
||
|
|
||
|
public bool Add(T item)
|
||
|
{
|
||
|
_wrapped.Push(item);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public void Clear()
|
||
|
{
|
||
|
_wrapped.Clear();
|
||
|
}
|
||
|
|
||
|
public ExtendedStack<T> Clone()
|
||
|
{
|
||
|
return new ExtendedStack<T>(this);
|
||
|
}
|
||
|
|
||
|
public bool Contains(T item)
|
||
|
{
|
||
|
return _wrapped.Contains(item);
|
||
|
}
|
||
|
|
||
|
public bool Contains(T item, IEqualityComparer<T> 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<T> GetEnumerator()
|
||
|
{
|
||
|
return _wrapped.GetEnumerator();
|
||
|
}
|
||
|
|
||
|
#if !NETCOREAPP1_1
|
||
|
object ICloneable.Clone()
|
||
|
{
|
||
|
return Clone();
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
void ICollection<T>.Add(T item)
|
||
|
{
|
||
|
_wrapped.Push(item);
|
||
|
}
|
||
|
|
||
|
bool ICollection<T>.Remove(T item)
|
||
|
{
|
||
|
return Remove(item);
|
||
|
}
|
||
|
|
||
|
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
|
||
|
{
|
||
|
return GetEnumerator();
|
||
|
}
|
||
|
|
||
|
public bool TryTake(out T item)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
item = _wrapped.Pop();
|
||
|
return true;
|
||
|
}
|
||
|
catch (InvalidOperationException)
|
||
|
{
|
||
|
item = default(T);
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private bool Remove(T item)
|
||
|
{
|
||
|
if (EqualityComparer<T>.Default.Equals(item, _wrapped.Peek()))
|
||
|
{
|
||
|
_wrapped.Pop();
|
||
|
return true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|