#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. For more * information, see COPYING. */ #endregion using System; using System.Collections.Generic; namespace OpenRA { /// /// A minimal read only list interface for .NET 4 /// /// /// .NET 4.5 has an implementation built-in, this code is not meant to /// duplicate it but provide a compatible interface that can be replaced /// when we switch to .NET 4.5 or higher. /// public interface IReadOnlyList : IEnumerable { int Count { get; } T this[int index] { get; } } public static class ReadOnlyList { public static IReadOnlyList AsReadOnly(this IList list) { return list as IReadOnlyList ?? new ReadOnlyList(list); } } /// /// A minimal read only list for .NET 4 implemented as a wrapper /// around an IList. /// public class ReadOnlyList : IReadOnlyList { private readonly IList list; public ReadOnlyList() : this(new List()) { } public ReadOnlyList(IList list) { if (list == null) throw new ArgumentNullException(nameof(list)); this.list = list; } #region IEnumerable implementation public IEnumerator GetEnumerator() { return list.GetEnumerator(); } #endregion #region IEnumerable implementation System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return list.GetEnumerator(); } #endregion #region IReadOnlyList implementation public int Count => list.Count; public T this[int index] => list[index]; #endregion } }