using System; using System.Collections; using System.Collections.Generic; namespace OpenTap.Plugins.BasicSteps { /// A list with virtual accessors. public class VirtualCollection : IList, IList { List list = new List(); public virtual IEnumerator GetEnumerator() => list.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => list.GetEnumerator(); public virtual void Add(T item) => list.Add(item); int IList.Add(object value) { Add((T) value); return Count - 1; } bool IList.Contains(object value) => value is T x && Contains(x); public virtual void Clear() => list.Clear(); int IList.IndexOf(object value) => value is T x ? IndexOf(x) : -1; void IList.Insert(int index, object value) => Insert(index, (T) value); void IList.Remove(object value) { if (value is T x) Remove(x); } public virtual bool Contains(T item) => list.Contains(item); public virtual void CopyTo(T[] array, int arrayIndex) => list.CopyTo(array, arrayIndex); public virtual bool Remove(T item) => list.Remove(item); void ICollection.CopyTo(Array array, int index) => CopyTo((T[])array, index); public virtual int Count => list.Count; public virtual object SyncRoot => null; public virtual bool IsSynchronized => false; public virtual bool IsReadOnly => ((IList)list).IsReadOnly; public virtual bool IsFixedSize => ((IList)list).IsFixedSize; public virtual int IndexOf(T item) => list.IndexOf(item); public virtual void Insert(int index, T item) => list.Insert(index, item); public virtual void RemoveAt(int index) => list.RemoveAt(index); object IList.this[int index] { get => this[index]; set => this[index] = (T) value; } public virtual T this[int index] { get => list[index]; set => list[index] = value; } } }